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 (GAID) 国内 优先使用 OAID 拿不到?降级到 AAID 最终方案:设备指纹 注意:所有方案均需在隐私政策中明确告知用户

嗯,今天的内容就到这。设备标识符这块,说白了就是一句话:能用用户可控的,就别用硬件绑定的。AAID和OAID就是你的好朋友,IMEI和MAC就是你的雷区。记住这个原则,合规路上能少踩很多坑。

核心要点回顾:

  • AAID是Google推荐的广告标识符,必须尊重用户“限制广告追踪”的设置
  • IMEI、IMSI、MAC地址在Android 10+已被严格限制,别再用了
  • 国内优先用OAID,海外优先用AAID,两者都拿不到再用设备指纹
  • 所有标识符的收集和使用,都必须在隐私政策里说清楚

公众号:蓝海资料掘金营,微信deep3321