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 拿不到了,整个逻辑都得重写。
我建议的做法是:
- 先检查权限——在调用广告 SDK 之前,先检查
AD_ID权限是否被授予 - 准备降级方案——如果拿不到 ID,就用其他标识(比如设备指纹、上下文信息)来做广告投放
- 适配隐私沙盒 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 的关系画清楚了:
这张图把隐私沙盒、权限变更、替代方案、对 SDK 的影响串在了一起。你想想看,整个体系其实就三个关键点:权限怎么变、替代方案是什么、SDK 怎么适配。搞懂了这三个,剩下的就是写代码了。
好了,这一章的内容就到这里。隐私沙盒这块水很深,但只要你把基础逻辑理清了,后面就好办了。
公众号:蓝海资料掘金营,微信deep3321