13、隐私沙盒与广告ID:Android 13隐私沙盒,Advertising ID权限变更对广告SDK的影响

说实话,Android 13 的隐私沙盒,是我这几年见过最「伤筋动骨」的改动之一。尤其是那个 Advertising ID 的权限变更,直接让很多广告 SDK 的集成方式来了个底朝天。

我记得第一次看到 Google 的公告时,心里就咯噔一下——「完了,又要改代码了。」但冷静下来想想,这其实是好事。用户隐私保护是大趋势,我们做系统开发的,得跟上节奏。

13.1 隐私沙盒到底是什么?

隐私沙盒,说白了就是 Google 想在保护用户隐私的同时,还能让广告商赚到钱。它不是一个单一功能,而是一整套方案。

我个人的理解是:Google 想用一套新的广告追踪机制,替代掉原来那个「谁都能拿到的 Advertising ID」。原来的方案太粗暴了——App 拿到 ID 就能跨应用追踪用户,用户还没什么办法拒绝。

隐私沙盒的核心目标有三个:

  • 限制跨应用追踪——App 不能随便拿 Advertising ID 去关联其他 App 的行为
  • 提供替代方案——用 Topics API、FLEDGE 这些新 API 来做广告投放
  • 用户可控——用户可以在设置里一键「重置」或「退出」广告个性化

关键点:隐私沙盒不是一刀切禁止广告,而是让广告从「野蛮生长」变成「有规矩地生长」。

13.2 Advertising ID 权限变更——最直接的冲击

Android 13 之前,App 只要声明了权限就能拿到 Advertising ID。但从 Android 13 开始,Google 把 Advertising ID 的访问权限收紧了。

具体变化是这样的:

版本 权限要求 获取方式
Android 12 及以下 声明 AD_ID 权限即可 直接通过 AdvertisingIdClient 获取
Android 13+ 需要运行时请求 com.google.android.gms.permission.AD_ID 用户授权后才能获取,否则返回空字符串

嗯,这里要注意:如果 App 没有请求这个权限,或者用户拒绝了,AdvertisingIdClient.getAdvertisingIdInfo() 会返回一个全是零的 ID。说白了就是「你拿不到真实 ID 了」。

避坑指南:我曾经遇到过一个项目,升级到 Android 13 后广告收入直接腰斩。排查了半天才发现,是广告 SDK 没有处理权限被拒绝的情况,导致所有广告请求都带了一个无效 ID,服务器直接拒绝了。

13.3 对广告 SDK 的具体影响

广告 SDK 是受影响最大的。我列几个常见的场景:

  • 用户画像失效——拿不到真实 ID,就无法关联用户的历史行为,广告精准度下降
  • 归因链路断裂——广告点击、安装、转化的追踪链条断了,广告主没法知道钱花得值不值
  • 频次控制失效——同一个用户看到同一个广告的次数没法控制了,用户体验变差

你想想看,广告 SDK 的核心就是靠 ID 来工作的。现在 ID 拿不到了,整个逻辑都得重写。

我建议的做法是:

  1. 先检查权限——在调用广告 SDK 之前,先检查 AD_ID 权限是否被授予
  2. 准备降级方案——如果拿不到 ID,就用其他标识(比如设备指纹、上下文信息)来做广告投放
  3. 适配隐私沙盒 API——逐步迁移到 Topics API、FLEDGE 这些新方案上

小技巧:我习惯在 App 启动时先请求 AD_ID 权限,如果用户拒绝,就弹一个友好的说明:「开启广告个性化可以让你看到更感兴趣的广告」。这样转化率会高一些。

13.4 代码示例:如何适配 Advertising ID 权限变更

下面是一个简单的适配示例,展示了如何在 Android 13 上正确处理 Advertising ID:

// 检查 Android 13 及以上版本
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) {
    // 检查权限是否已授予
    if (ContextCompat.checkSelfPermission(this, 
            "com.google.android.gms.permission.AD_ID") 
            == PackageManager.PERMISSION_GRANTED) {
        // 权限已授予,正常获取 Advertising ID
        getAdvertisingId();
    } else {
        // 权限未授予,请求权限
        ActivityCompat.requestPermissions(this,
            new String[]{"com.google.android.gms.permission.AD_ID"},
            REQUEST_CODE_AD_ID);
    }
} else {
    // Android 12 及以下,直接获取
    getAdvertisingId();
}

// 处理权限请求结果
@Override
public void onRequestPermissionsResult(int requestCode, 
        String[] permissions, int[] grantResults) {
    if (requestCode == REQUEST_CODE_AD_ID) {
        if (grantResults.length > 0 
                && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            // 用户同意了,获取 ID
            getAdvertisingId();
        } else {
            // 用户拒绝了,使用降级方案
            useFallbackTracking();
        }
    }
}

这段代码的逻辑其实很简单:先判断版本,再检查权限,最后根据结果决定走哪条路。我在项目中就是这么做的,目前跑得挺稳。

13.5 隐私沙盒的替代方案

既然 Advertising ID 不好拿了,那广告 SDK 该怎么办?Google 其实给了几条路:

  • Topics API——根据用户近期的浏览记录,生成几个「兴趣标签」,比如「体育」「科技」「美妆」。广告商拿到的只是标签,不是具体 ID
  • FLEDGE——把广告竞价逻辑放到设备本地执行,广告商看不到用户的具体行为
  • 归因报告 API——用加密的方式报告广告点击和转化,保护用户隐私

我个人觉得,Topics API 是最容易上手的。它不需要改太多代码,只需要在广告请求里加几个标签就行。FLEDGE 就比较复杂了,适合大型广告平台。

核心思路:从「追踪用户」变成「理解用户」。广告商不需要知道你是谁,只需要知道你大概对什么感兴趣。

13.6 我踩过的坑

最后分享一个我亲身经历的事。有一次,我们升级了一个广告 SDK 版本,结果发现 Android 13 设备上广告加载不出来。查了半天日志,发现 SDK 内部在获取 Advertising ID 时抛了一个异常,然后直接崩溃了。

原因是什么?SDK 没有做版本判断,直接在 Android 13 上用了旧版的 API。旧版 API 在 Android 13 上被标记为 deprecated,调用就抛异常。

从那以后,我养成了一个习惯:每次升级广告 SDK 之前,先看它的 release notes,确认它是否适配了 Android 13 的隐私沙盒。如果没适配,就暂时别升。

建议:在项目的 CI/CD 流程里加一个检查步骤,自动检测广告 SDK 的版本是否兼容当前 Android 版本。这样能省很多排查时间。

13.7 知识体系总览

下面这张图是我自己整理的,把隐私沙盒和 Advertising ID 的关系画清楚了:

隐私沙盒与 Advertising ID 知识体系 Android 13 隐私沙盒 Advertising ID 权限变更 需要运行时请求权限 用户拒绝返回空 ID 需适配降级方案 隐私沙盒替代方案 Topics API(兴趣标签) FLEDGE(本地竞价) 归因报告 API(加密报告) 对广告 SDK 的影响 用户画像失效 归因链路断裂 频次控制失效

这张图把隐私沙盒、权限变更、替代方案、对 SDK 的影响串在了一起。你想想看,整个体系其实就三个关键点:权限怎么变、替代方案是什么、SDK 怎么适配。搞懂了这三个,剩下的就是写代码了。


好了,这一章的内容就到这里。隐私沙盒这块水很深,但只要你把基础逻辑理清了,后面就好办了。

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