1. 第三方SDK概述
说到第三方SDK,我猜你脑子里立马会蹦出几个常见的——广告SDK、推送SDK、支付SDK……没错,它们几乎已经成了我们移动开发的标配。但说实话,很多人对SDK的理解仅限于“拿来用”,很少去深究它到底是什么、能做什么、又藏着哪些合规上的坑。
这章我们先打好基础。把SDK的定义、常见类型、以及它在Android和iOS两边实际长什么样搞清楚。后面再谈扫描和合规,才有的放矢。
1.1 什么是第三方SDK?
SDK的全称是Software Development Kit,软件开发工具包。说白了,就是别人写好的一份“功能模块打包”,你引入到自己的项目里,直接调API就能用,不用自己从头造轮子。
我在项目中遇到过不止一次——老板说“下周上线,要支持微信支付”,一天时间你能自己写支付网关吗?不可能。直接接入微信支付SDK,三天搞定。你看,SDK就是这种“拿来即用”的东西。
但从合规角度看,SDK有一个很关键的特性:它通常会获取你应用的某些权限、收集某些数据。而且这些行为往往藏在SDK内部,开发者自己都不一定清楚。嗯,这就是后面我们要重点扫描的地方。
核心要点: SDK是第三方提供的代码包,帮你快速实现特定功能,但也可能引入额外的隐私收集行为,是权限合规扫描的主要目标。
1.2 常见的SDK类型
我按用途把最常见SDK分成了这几类,你品品,是不是都很眼熟:
| 类型 | 典型代表 | 主要功能 | 常见权限需求 |
|---|---|---|---|
| 广告SDK | Google AdMob、穿山甲、广点通 | 展示广告、跟踪点击、归因 | 获取设备ID、MAC地址、位置 |
| 推送SDK | 极光推送、友盟Push、个推 | 实现消息推送通道 | 获取设备信息、读取应用列表 |
| 社交SDK | 微信登录、微博分享、QQ互联 | 第三方登录、分享内容 | 读取联系人、获取账号信息 |
| 支付SDK | 支付宝、微信支付、PayPal | 完成在线支付交易 | 读取设备IMEI、调用NFC(可选) |
| 统计分析SDK | Firebase Analytics、友盟统计 | 用户行为采集、漏斗分析 | 获取Android ID、OAID |
| 地图/定位SDK | 高德地图、百度地图 | 显示地图、获取定位 | 定位权限(粗+精)、网络状态 |
| 音视频SDK | 声网、腾讯TRTC | 实时音视频通话 | 摄像头、麦克风、录音权限 |
你看看这些权限需求。广告SDK要MAC地址、设备ID,推送SDK要读取应用列表……这些在过去可能是“无感知”的事,但现在合规红线出来了,每一个都可能变成整改点。
1.3 为什么在合规扫描中区分SDK类型很重要?
我个人习惯是:拿到一个App,先按SDK类型分类扫描。
为什么?因为不同类型的SDK,权限诉求的合理性完全不同。你想想看:
- 一个地图SDK要定位权限,合理;一个壁纸App里的广告SDK也要定位权限,合理吗?鬼知道壁纸App要定位干嘛,很可能就是超范围采集。
- 一个支付SDK读取IMEI,也许是为了绑卡风控;一个手电筒App里的广告SDK也读IMEI,这明显就是滥用。
所以扫描时,我们要先判断当前App种的是哪几类SDK,然后才能说“这个权限是不是越界了”。
我的小技巧: 用反编译或hook的方式,把App里所有第三方库的包名提取出来,再对照已知SDK签名特征库去归类。省时省力。
1.4 Android与iOS上的差异点
同一个SDK,在Android和iOS上的表现可能完全不同。我踩过一个坑:某个广告SDK在Android上只拿Advertising ID,但在iOS上会尝试读取IDFA和IDFV。如果你只扫了Android端,iOS端上线的合规风险就被忽略了。
下面我列几个关键差异:
| 维度 | Android | iOS |
|---|---|---|
| 权限声明方式 | AndroidManifest.xml静态声明 | Info.plist + 运行时请求描述 |
| 设备ID | IMEI(需PHONE权限)、Android ID、OAID | IDFA(需用户授权)、IDFV |
| 推送实现 | 各厂商自有通道 + 长连接 | APNs统一通道 |
| 权限请求弹窗 | 不需要先说明原因(但推荐) | 必须提供使用描述(NSLocationWhenInUseUsageDescription等) |
| SDK沙箱限制 | 相对宽松,SDK可访问更多共享空间 | 严格沙箱,每个App只能访问自己容器 |
比如推送SDK,Android上需要保留后台长期连接,还会互相拉起(业内人都知道的“全家桶现象”)。iOS上就干净多了,只能通过APNs系统推送,SDK本身不能自启。这就导致合规扫描的重点完全不同——Android上看是不是有后台权限滥用,iOS上主要看有没有正确使用描述字符串。
1.5 本章知识体系
下面这张图我把这章的核心内容串了一遍,方便你形成整体印象:
经验之谈: 遇到一个不认识的SDK包名时,我习惯去GitHub或Maven搜包名,看一看它的授权文档。很多时候文档里就写了它会收集哪些权限。比你自己反编译猜要准得多。
1.6 从一个真实案例说起
我记得有一年帮一家金融类App做合规整改。他们接了个流量变现的广告SDK,SDK文档上只写了“需获取网络权限”。结果一上线审核,被苹果拒了——说读取了IDFA但没有在Info.plist提供用途描述。我一查代码,SDK悄悄把IDFA读走了,根本没告知开发者。
这种“文档不写、代码偷偷跑”的情况,说真的,不少见。所以做第三方SDK权限合规扫描,第一步就是要搞清楚:你用了哪些SDK?它们各自都声明了哪些权限?代码里到底有没有偷偷调用敏感API?
千万注意: 不要光看SDK的文档。我习惯用静态扫描工具去跑一遍真实权限声明列表,再用动态hook去验证运行时行为。两两比对,才能发现文档和实现之间的差异。
好了,这章我们主要厘清了SDK是什么、有哪些类型、Android/iOS有哪些不同。下一部分我们会开始讲具体的扫描方法——第一件事就是怎么把App里的SDK清单给扒出来。