6、数据收集合规:Android Advertising ID (AAID) 合规使用、设备标识符(IMEI/IMSI/MAC)限制、OAID与GAID替代方案
大家好,我是你们的老朋友。今天我们来聊聊数据收集合规里最让人头疼的一块——设备标识符。
说实话,我刚入行那会儿,拿IMEI就跟喝水一样自然。那时候觉得,没有IMEI怎么做设备识别?没有设备识别怎么做广告归因?后来被合规部门约谈了几次,才明白这条路已经走不通了。
嗯,咱们今天就把这块彻底讲透。从AAID怎么合规用,到IMEI为什么不能碰,再到OAID和GAID怎么选,一条一条捋清楚。
6.1 Android Advertising ID (AAID) 合规使用
AAID,全称是Android Advertising ID。它是Google在Android系统里内置的一个广告标识符。用户可以在设置里随时重置,也可以选择“限制广告追踪”。
说白了,AAID就是Google给开发者留的一条合规活路。你想做广告归因?可以,用AAID。你想做用户画像?可以,用AAID。但前提是——你得遵守规则。
AAID合规使用的三个核心原则:
- 用户知情权:必须在隐私政策里明确说明你收集了AAID,以及用途是什么。
- 用户选择权:必须尊重“限制广告追踪”的设置。如果用户开启了,你就不能拿AAID做广告相关的事。
- 数据最小化:只在你需要的时候才去获取AAID。别一启动App就取,后台也尽量别取。
我在项目中遇到过这样的情况:某个广告SDK在后台频繁获取AAID,结果被Google Play检测到,直接下架了。你想想看,一个App辛辛苦苦做了两年,就因为这么个细节翻车,多冤。
代码层面怎么拿AAID?很简单,但要注意线程问题:
// 获取AAID的推荐方式
val advertisingIdInfo = AdvertisingIdClient.getAdvertisingIdInfo(context)
val aaId = advertisingIdInfo.id
val isLimitAdTrackingEnabled = advertisingIdInfo.isLimitAdTrackingEnabled
// 如果用户限制了广告追踪,就不要用AAID做广告归因了
if (isLimitAdTrackingEnabled) {
// 仅用于基本分析,不做广告相关
} else {
// 可以用于广告归因和个性化广告
}
小提示:获取AAID是异步操作,别在主线程里直接调。我习惯用协程或者回调来处理,避免ANR。
6.2 设备标识符限制:IMEI/IMSI/MAC
这部分是重灾区。很多老项目里还残留着拿IMEI的代码,赶紧清理掉。
为什么IMEI不能碰?因为它是硬件级标识符,跟设备绑定死了。用户没法重置,也没法关闭。你拿了IMEI,就等于给这个设备打了一个永久烙印。这在GDPR和个人信息保护法里都是不被允许的。
| 标识符 | 可重置性 | 合规状态 | 替代方案 |
|---|---|---|---|
| IMEI | 不可重置 | ❌ 严格限制 | AAID / OAID |
| IMSI | 不可重置 | ❌ 严格限制 | AAID / OAID |
| MAC地址 | 不可重置 | ❌ Android 10+ 已随机化 | AAID / OAID |
| AAID | 可重置 | ✅ 合规使用 | — |
| OAID | 可重置 | ✅ 国内合规 | — |
我曾经在一个金融类App里看到,开发同学为了做设备指纹,把IMEI、MAC、Android ID全拿了一遍。结果隐私检测报告出来,直接标红。后来我们花了整整两周去重构这部分逻辑,改用AAID+设备指纹的混合方案。
警告:Android 10及以上,应用已经拿不到IMEI了。就算你加了READ_PHONE_STATE权限,系统也会返回空值或者抛出异常。别再做无用功了。
MAC地址也一样。从Android 10开始,系统返回的MAC地址是随机化的。你拿到的那个值,每次重启设备都可能变。所以别再信那些“通过MAC地址唯一标识设备”的老文章了。
6.3 OAID与GAID替代方案
AAID是Google的方案,但在国内,Google Play服务不一定能用。这时候就需要OAID出场了。
OAID,全称是Open Anonymous Device Identifier,中文叫“匿名设备标识符”。它是移动安全联盟(MSA)推的一个标准,专门解决国内Android设备标识的问题。
说白了,OAID就是国内的AAID。它同样支持用户重置,同样需要用户授权。但实现方式上,OAID依赖各家手机厂商的SDK支持。
GAID呢?GAID就是Google Advertising ID,也就是AAID。这两个词经常混用,你只要知道它们是一回事就行。
那在实际项目中怎么选?我建议这样:
- 海外市场:优先用AAID(GAID)。Google Play服务覆盖率高,合规路径清晰。
- 国内市场:优先用OAID。如果拿不到OAID,再降级到AAID(如果Google Play服务可用)。
- 极端情况:如果两个都拿不到,可以考虑用设备指纹方案,但一定要在隐私政策里说清楚。
OAID的获取方式稍微复杂一点,需要接入MSA的SDK:
// OAID获取示例(需接入MSA SDK)
val oaidHelper = MsaIdHelper(context)
oaidHelper.getOAid(object : MsaIdHelper.OAIDListener {
override fun onSuccess(oaid: String) {
// 拿到OAID,可以用于广告归因
Log.d("OAID", "OAID: $oaid")
}
override fun onError(error: Exception) {
// 拿不到OAID,降级到AAID或其他方案
Log.e("OAID", "获取OAID失败", error)
}
})
避坑指南:我曾经遇到过某款国产手机,OAID接口返回的全是0。后来发现是厂商的SDK版本太旧。所以建议你在接入OAID时,一定要做好降级策略。拿不到OAID就用AAID,再拿不到就用设备指纹。
最后,咱们用一张图来总结一下今天的内容:
嗯,今天的内容就到这。设备标识符这块,说白了就是一句话:能用用户可控的,就别用硬件绑定的。AAID和OAID就是你的好朋友,IMEI和MAC就是你的雷区。记住这个原则,合规路上能少踩很多坑。
核心要点回顾:
- AAID是Google推荐的广告标识符,必须尊重用户“限制广告追踪”的设置
- IMEI、IMSI、MAC地址在Android 10+已被严格限制,别再用了
- 国内优先用OAID,海外优先用AAID,两者都拿不到再用设备指纹
- 所有标识符的收集和使用,都必须在隐私政策里说清楚
公众号:蓝海资料掘金营,微信deep3321