主题
金融类 App 上架合规清单(AdMix SDK 1.0.0)
文档版本 v1.0.0
本页对应 SDK 1.0.0,与离线包内 docs/05-金融类App合规清单.md 是同一份内容。其他版本见文档中心。
用途:接入 AdMix SDK 的 App 提交应用商店 / 做 SDK 合规自查时,可直接取用本文内容。 第 2、3、4 节可原样并入 App 的隐私政策与「第三方 SDK 目录」页面。
金融类 App 属强监管行业,广告 SDK 是工信部通报的高发环节。第 7 节的遗留风险必须在上架前知悉。
技术性的完整说明见
02-隐私合规说明.md;本文是「提交材料」视角的裁剪与补全。
适用版本:AdMix SDK 1.0.0(com.admix:core / adapter-csj / adapter-gdt) 内嵌广告 SDK 版本:穿山甲 7.7.1.6、优量汇 4.680.1550
1. 上架前必做清单(逐条勾)
| # | 事项 | 判据 / 怎么验 |
|---|---|---|
| 1 | 隐私政策里有第三方 SDK 目录,含本文第 2 节的全部条目 | 名称、提供方、用途、收集信息、隐私政策链接,五项齐全 |
| 2 | 隐私政策里披露了本文第 3 节的权限清单 | 尤其是 ACCESS_COARSE_LOCATION、REQUEST_INSTALL_PACKAGES、读写外部存储 —— 这三项是审核重点 |
| 3 | init 与 start 分离,start 在用户点「同意」之后 | 见第 4 节,附可复现的验证命令 |
| 4 | 同意结果已持久化,不重复弹窗 | 杀进程重进不再弹 |
| 5 | 点「不同意」App 仍可用(只是没广告),且留有「重新查看隐私政策」入口 | 手动测 |
| 6 | 只披露了实际集成的广告平台,不多不少 | unzip -p your-app.apk META-INF/services/com.admix.adapter.IAdnAdapter 的输出就是清单,见第 5 节 |
| 7 | 各广告平台后台的交互样式(摇一摇 / 扭一扭 / 上滑)热区已逐项确认不过大 | 找平台运营在穿山甲 / 优量汇后台核对,见第 6 节 |
| 8 | 个性化广告开关已接到 App 的设置项上(若 App 提供该设置) | AdMixConfig.Builder().limitPersonalAds(true) |
| 9 | 知悉第 7 节的遗留风险(优量汇仍会探测约 276 个指定包名) | 金融类 App 上架前必须走到这一条 |
| 10 | 上线包 debug(false) | — |
2. 第三方 SDK 目录(可直接并入隐私政策)
只披露实际集成的那几家。只引了
adapter-csj就只写穿山甲,只引了adapter-gdt就只写优量汇。 取证方法见第 5 节。
2.1 穿山甲(Pangle / GroMore)
| 项目 | 内容 |
|---|---|
| SDK 名称 | 穿山甲广告 SDK(含 GroMore 聚合能力,同一个 aar) |
| 包名前缀 | com.bytedance.sdk.openadsdk / com.byazt / com.bykv |
| 提供方 | 北京巨量引擎网络技术有限公司 |
| 使用目的 | 广告投放、广告归因、反作弊 |
| 收集的个人信息 | 设备标识(OAID、Android ID)、网络状态与网络类型、设备型号、操作系统版本、应用版本 |
| 处理方式 | 加密传输至穿山甲服务器 |
| 官方隐私政策 | https://www.csjplatform.com/privacy |
| 第三方 SDK 说明页 | https://www.csjplatform.com/privacy/partner |
⚠️ 穿山甲走的是 GroMore 聚合通道:广告可能由 GroMore 瀑布流里的其他平台(快手 / 百度 / Sigmob)提供。 当前瀑布流只配置了穿山甲一家,App 内也只集成了穿山甲 SDK,所以本清单是完整的。
若今后在 GroMore 后台的瀑布流里加入其他平台,App 必须同时集成对应平台的 SDK 与适配器, 并在隐私政策中补充披露那一家。只改后台不改 App 拿不到广告;集成了却不披露构成违规。 这一步不能只由运营侧决定,必须同步到 App 发版。
2.2 优量汇(腾讯广告联盟)
| 项目 | 内容 |
|---|---|
| SDK 名称 | 优量汇广告 SDK(腾讯广告联盟,GDT) |
| 包名前缀 | com.qq.e |
| 提供方 | 深圳市腾讯计算机系统有限公司 |
| 使用目的 | 广告投放、广告归因、反作弊 |
| 收集的个人信息 | 设备标识(OAID、Android ID)、网络状态与网络类型、设备型号、操作系统版本、粗略位置信息(aar 声明了 ACCESS_COARSE_LOCATION)、应用安装情况(见第 7 节) |
| 处理方式 | 加密传输至腾讯服务器 |
| 官方隐私政策 | https://e.qq.com/dev/help_detail.html?cid=2005&pid=5983 |
优量汇 SDK 内含腾讯自有的安全 / 反作弊模块(
gdt_plugin中的 yaq / Turing), 该模块在 SDK 初始化后会做设备环境与应用安装情况检测。详见第 7 节。
2.3 AdMix 聚合 SDK(我方,供备查)
| 项目 | 内容 |
|---|---|
| SDK 名称 | AdMix 广告聚合 SDK |
| 使用目的 | 调度上述广告平台、统一接口、出投放报表 |
| 收集的个人信息 | 无。只采集广告维度数据(广告位、平台、代码位、价格、耗时、错误码、事件类型),完整字段清单见 02-隐私合规说明.md 6.2 |
| 明确不采集 | IMEI / OAID / Android ID / MAC / IP / 手机号 / 用户 ID / 位置 / 机型 / 系统版本 / 应用列表,一项都没有 |
| 上报地址 | https://api.maemi.cn(HTTPS,地址内置) |
| 上报前提 | 严格晚于 AdMix.start(),即用户同意隐私政策之后 |
AdMix 自身是聚合调度层,不是个人信息处理者。它是否需要在隐私政策里单列, 取决于 App 侧的披露口径(按「委托处理的技术服务方」列出更稳妥)。
3. 权限清单(打包产物实测,非文档推测)
下表由外部最小工程(minSdk 29、两家 adapter 全引、R8 混淆)的清单合并报告逐条核对得出, 不是抄 SDK 文档。AdMix 自身的三个 aar 不声明任何权限(清单为空),全部权限都来自两家广告 SDK。
| 权限 | 来源 | 用途 | 是否敏感 |
|---|---|---|---|
INTERNET | 宿主 + 两家 | 请求广告、上报曝光点击 | 否 |
ACCESS_NETWORK_STATE | 宿主 + 两家 | 判断网络类型,决定是否加载视频素材 | 否 |
ACCESS_WIFI_STATE | 宿主 + 两家 | 网络质量判断 | 否 |
CHANGE_NETWORK_STATE | 穿山甲 + 优量汇 | 网络切换 | 否 |
CHANGE_WIFI_STATE | 穿山甲 | 网络切换 | 否 |
VIBRATE | 穿山甲 + 优量汇 | 互动广告振动反馈 | 否 |
WAKE_LOCK | 穿山甲 | 视频播放期间保持屏幕常亮 | 否 |
READ_EXTERNAL_STORAGE | 穿山甲 | 素材缓存(SDK 侧 isCanUseWriteExternal()=false 已关闭外部存储写入) | 是 |
WRITE_EXTERNAL_STORAGE | 穿山甲 | 同上 | 是 |
REQUEST_INSTALL_PACKAGES | 优量汇 | 下载类广告安装应用 | 是 |
ACCESS_COARSE_LOCATION | 优量汇 | 广告地域定向 | 是 |
REORDER_TASKS | 优量汇 | 广告落地页 / 任务栈调整 | 否 |
com.asus.msa.SupplementaryDID.ACCESS | 穿山甲 | 华硕机型取 OAID(MSA 服务) | 否(厂商自定义) |
${applicationId}.openadsdk.permission.TT_PANGOLIN | 穿山甲 | 穿山甲自定义的应用内私有权限 | 否 |
QUERY_ALL_PACKAGES | 优量汇 aar 声明 | 已在宿主清单中以 tools:node="remove" 移除,打包产物中不存在(清单合并报告可证) | — |
接入方必须在自己的清单里写这两行(《集成快速指南》第 2 节已给):
xml
<uses-permission android:name="android.permission.QUERY_ALL_PACKAGES" tools:node="remove" />
<uses-permission android:name="com.android.permission.GET_INSTALLED_APPS" tools:node="remove" />关于第二行:GET_INSTALLED_APPS 不是任何 SDK 声明的 —— 是华为 ROM 在应用运行时枚举应用列表时 自己加进 requested permissions 的(系统日志 add requested permission),所以 tools:node="remove" 挡不住华为弹窗,真正的开关在 SDK 里(见第 7 节)。 写上它的作用是「显式声明我们不要这个权限」,构建时会有一条 tagged ... to remove other declarations but no other declaration present 的 Warning,属正常, 它恰好证明了没有任何 SDK 声明这一项。
3.1 <queries> 声明(Android 11+ 包可见性,容易被漏掉)
合并后的清单里有一个 <queries> 段,同样来自两家 SDK,合规检测工具会扫它:
| 声明 | 来源 | 作用 |
|---|---|---|
<package> 抖音、抖音极速版 | 穿山甲 | 按包名查这两个(下载类广告拉起用),不是枚举 |
<intent> VIEW + BROWSABLE + https | 穿山甲 | 判断能否打开 https 落地页 |
<intent> MAIN + LAUNCHER | 优量汇 | ⚠️ 声明它之后,即使没有 QUERY_ALL_PACKAGES,queryIntentActivities 也能列出全部可启动应用。这是第 7 节那条枚举行为在 Android 11+ 上仍然可行的原因 |
可选加固(不建议未验证就上线):宿主清单里加 <queries><intent tools:node="remove"><action android:name="android.intent.action.MAIN"/></intent></queries> 可以去掉这条声明。但它可能影响优量汇的落地页跳转与归因, 必须先真机复验填充率与点击跳转正常再上线,不要在提交审核前临时加。
4. init / start 分离:时机与验证(违反会被驳回)
这是整份清单里唯一「写错就必然被驳回」的一条。
| 阶段 | 调什么 | SDK 做什么 | 允许在哪调 |
|---|---|---|---|
| 冷启动 | AdMix.init(context, AppID, App密钥) | 只读本地配置。不联网、不读写持久化数据、不采集任何设备信息、一家广告 SDK 都不初始化 | Application.onCreate(安全) |
| 用户点「同意」之后 | AdMix.start(listener) | 拉配置 → 按需初始化广告 SDK → 开始采集与上报 | 只能在同意之后,不能在 Application 里 |
java
// ① Application.onCreate
AdMix.init(this, appId, appKey);
// ② 首次启动弹隐私政策弹窗;用户点「同意」之后才:
AdMix.start(listener);另有一道兜底红线:任何广告 load() 在用户未同意时都会直接失败(错误码 -1006 「用户尚未同意隐私政策」),不管从哪个入口进来都不会碰到任何广告 SDK。
按需初始化,可作为自查证据:start() 成功之后仍然一家广告 SDK 都没初始化 —— 某家只在「首次加载到配置了它的广告位」时才初始化。所以如果 App 只用激励视频、 而激励视频的瀑布里没有优量汇,那优量汇 SDK 在这台设备上就从未运行过。
可复现的验证步骤(提交材料里可以写「已按此方法实测通过」):
bash
adb shell pm clear <包名> # 清空应用数据
adb shell am start -n <包名>/<启动 Activity> # 启动,停在隐私弹窗,不要点同意
adb shell run-as <包名> ls files/ # 应为空:没有任何埋点队列文件同时在抓包或服务端访问日志中确认此阶段没有 /v1/config 与 /v1/events 请求, 且 logcat 里没有任何 adapter 初始化 记录。点「同意」之后才会出现。
4.1 隐私政策弹窗的三条细节(被驳回最多的地方)
- 同意结果必须持久化,否则每次启动都弹,用户会当成弹窗广告
- 不同意不能不让用:只是没广告,其余功能照常。做法是禁掉广告入口 + 留一个「重新查看隐私政策」按钮
- 弹窗文案要能对应到实际集成的 SDK:把第 2 节的目录写进隐私政策全文,弹窗里给出入口
4.2 个性化广告开关
App 的设置里如果有「关闭个性化广告推荐」,接到这里:
java
AdMix.init(context, appId, appKey, new AdMixConfig.Builder()
.limitPersonalAds(true) // true = 用户已关闭个性化推荐
.build());会透传给:穿山甲 MediationPrivacyConfig.isLimitPersonalAds()(GroMore 继续下发给瀑布流里每一家, 不需要为新增平台再写一遍)、优量汇 GlobalSetting.setPersonalizedState(1)。
4.3 SDK 已默认收紧的设备信息采集(无需接入方配置)
穿山甲 TTCustomController:
| 项目 | 默认 | 实现 |
|---|---|---|
| 位置信息 | 关 | isCanUseLocation() = false |
| 手机状态 / IMEI | 关 | isCanUsePhoneState() = false、getDevImei() 返回空 |
| MAC 地址 | 关 | getMacAddress() 返回空 |
| 外部存储写入 | 关 | isCanUseWriteExternal() = false |
| 录音 | 关 | isCanUsePermissionRecordAudio() = false |
| 短信 | 关 | isCanUseMessage() = false |
| 已安装应用列表 | 关 | alist() = false |
| Android ID | 开 | 广告归因必需 |
| OAID | 开 | 广告归因必需(未覆写 getDevOaid(),按 SDK 默认取值) |
| WiFi 状态 | 开 | 网络质量判断 |
优量汇 GlobalSetting(全部在 SDK 初始化之前调用,顺序不可颠倒):
| 调用 | 值 | 作用 |
|---|---|---|
setAgreePrivacyStrategy | true | 已由聚合层保证用户已同意 |
setAgreeReadAndroidId | true | 广告归因必需 |
setAgreeReadDeviceId | false | 不读设备号 |
setEnableCollectAppInstallStatus | false | 关闭后台收集已安装应用列表(见第 7 节,这一行是华为弹窗的修复点) |
setPersonalizedState | 按 limitPersonalAds | 个性化推荐开关 |
5. 「只披露实际集成的那一家」是可取证的
这不是口头承诺,是构建产物层面的事实。合规自查时可以直接出证据:
bash
# ① 实际集成了哪几家适配器(这就是应当披露的清单,不多不少)
unzip -p your-app.apk META-INF/services/com.admix.adapter.IAdnAdapter
# 只引穿山甲时输出只有一行:com.admix.adapter.csj.CsjAdapter
# ② 反查广告 SDK 的类在不在 dex 里
# com.qq.e. → 优量汇
# com.bytedance.sdk.openadsdk. → 穿山甲成立的原因:每家的适配器是独立的 aar,各自把自家广告 SDK 作为运行期依赖带进来; 聚合核心不在代码里写死"支持哪几家",各适配器通过 Java SPI 自己声明身份。 不引那个坐标,那家的 SDK 文件就不在 APK 里 —— 不存在「代码在包里但没启用」这种灰色状态。
运行期日志也能对上:启动时每个被发现的适配器打一行 adapter 就绪: csj (SDK 7.7.1.6)。
6. 广告交互样式:诱导点击(监管通报高发项)
开屏广告的「摇一摇」「扭一扭」「上滑」等交互样式由广告平台后台配置,热区设置过大即构成诱导点击。
- AdMix 在开屏请求时已显式关闭聚合侧的摇一摇按钮(
MediationAdSlot.setSplashShakeButton(false)) - 但平台后台配置的交互样式优先级更高,仍须请平台运营在穿山甲 / 优量汇后台逐项确认
- 金融类 App 的广告若被认定诱导点击,影响面大于普通工具类,建议纳入上架前检查项(本文第 1 节第 7 条)
7. ⚠️ 必须知悉的遗留风险:优量汇仍会探测约 276 个指定包名
这一条金融类 App 上架前必须知道。 它不触发系统弹窗,但本质上仍是「探测应用是否安装」的采集行为, 合规检测工具可能会标出来。
7.1 事实(真机抓栈确认,证据完整)
已修复的部分:读取已安装应用列表枚举行为,来自优量汇(不是穿山甲)。 优量汇初始化约 60 秒后,其内置的腾讯安全模块(gdt_plugin 中的 yaq / Turing, 调用链 com.qq.e.comm.plugin.u3$c.run → yaq.pro.* native)会调 getInstalledPackages + queryIntentActivities(MAIN+LAUNCHER) 把应用全部枚举一遍, 华为 ROM 随即弹出「是否允许读取已安装应用列表」。
修法:GdtAdapter 在优量汇 init 之前调 GlobalSetting.setEnableCollectAppInstallStatus(false) (优量汇客服已确认该开关即为「关闭后台收集已安装包名列表」)。 修复后 Debug 两轮 + Release 一轮真机验证:零枚举调用、无权限申请、无弹窗、三种广告位广告正常。
仍然存在的部分:开关关掉之后,同一个安全模块(yaq.pro.getJresult ← com.qq.e.comm.plugin.u3$d,线程 GDT_NET_THREAD)改为逐个调用 getPackageInfo 探测约 276 个指定包名(如美团外卖、陌陌、B 站、饿了么、携程,以及一批 com.yw.cps.new.tencent.*), 约 0.2 秒查完,同样发生在优量汇初始化后约 60 秒。
7.2 影响与口径
| 项 | 结论 |
|---|---|
| 会不会触发系统弹窗 | 不会(华为不为按包名查询弹窗) |
| 是不是采集行为 | 是。它在探测用户装了哪些应用,属于「应用安装情况」 |
| 会不会被合规检测工具标出 | 可能会。GB/T 41391、App 违法违规认定方法都覆盖这类行为 |
| 名单是写死的还是服务端下发的 | 未确认(方法体加壳,静态读不到;已向优量汇提工单) |
| 有没有开关能关 | 未确认,setEnableCollectAppInstallStatus(false) 只关掉了枚举那一路 |
移除 QUERY_ALL_PACKAGES 会不会影响填充 / 归因 | 未确认(同一工单)。目前实测移除后三种广告位照常填充 |
7.3 上架前的应对建议
- 隐私政策里把「应用安装情况」写进优量汇的收集信息(第 2.2 节已按此写)。 优量汇客服的原话要点:第三方 SDK 在静默或后台运行时收集个人信息的, 需在隐私政策中明示收集频率并经用户同意 —— 频率可写「SDK 初始化后约 1 分钟,每进程一次」
- 风险不能接受时,只引
adapter-csj(不引adapter-gdt)。 优量汇 SDK 与这段行为就都不在包里,可用第 5 节的方法取证。 代价是少一家竞价方、填充率与 eCPM 下降 - 等优量汇工单答复后,本文与
02-隐私合规说明.md会同步更新 (工单入口:腾讯营销联盟首页右上角问号 →「反馈中心」)
7.4 穿山甲侧的对照结论(不是问题,供备查)
穿山甲 mediation-sdk 7.7.1.6 已逐类扫过常量池(9444 个类)并真机观察两轮共约 25 分钟:
- 没有
getInstalledPackages/getInstalledApplications的引用,不做枚举 queryIntentActivities只用于判断调用方传入的单个 Intent 能否打开(deeplink 判定),不枚举- 真机上只按包名查了少数几个包(自身、抖音系、华为账号 / WebView),没有触发任何弹窗
- aar 清单没有声明
QUERY_ALL_PACKAGES/GET_INSTALLED_APPS
早期把这件事误判成穿山甲,是因为弹窗常常刚好出现在穿山甲广告展示期间。 完整证据(调用栈、logcat、静态分析、修复前后对照)在仓库 读取应用列表排查-证据包/。
8. 其他需要知道的限制
| 项 | 说明 |
|---|---|
| 奖励类广告必须服务端验证 | 金融类 App 的激励奖励通常有现金价值(提现 / 抵扣 / 抽奖),onReward 发生在用户手机上、可被 Hook 和重放伪造。真实发奖必须以服务端回调为准,接法见《接入文档》四「服务端发奖验证」 |
| AppSecret 绝不能进 APK | 它只用于你的服务器与平台之间验签。SDK 没有任何接收它的入口 |
不要开 usesCleartextTraffic | AdMix 全链路 HTTPS,不需要 network_security_config。开明文会把两家广告 SDK 的全部上报和素材请求一起降级,授权范围远超需要 |
| 禁投类目需与运营确认 | 金融类 App 的广告位需要设置禁投类目(含是否禁投借贷类)。这是平台运营在后台配置的事,接入前先确认清单 |
| 多机型覆盖不足 | SDK 目前只在华为 ALN-AL10 / Android 12 上做过完整真机验证。上架前建议在自有机型矩阵上回归一轮(尤其小米 / OPPO / vivo 的应用列表与位置权限弹窗行为各家不同) |
| 埋点数据保留 90 天 | 广告维度明细在平台服务端保留 90 天,之后只保留不可还原到单次事件的聚合统计 |
9. 参考依据
- GB/T 43435-2023《信息安全技术 移动互联网应用程序(App)软件开发工具包(SDK)安全要求》
- GB/T 41391-2022《信息安全技术 移动互联网应用程序(App)收集个人信息基本要求》
- 《App 违法违规收集使用个人信息行为认定方法》
- 《移动互联网应用程序信息服务管理规定》