不能关闭三方SDK隐私合规检测,真正可控的是其初始化时机和触发条件;90%以上“未授权前获取OAID”问题源于SDK在onLaunch阶段自动初始化,早于隐私弹窗与用户授权。

不能“关闭”三方SDK的隐私合规检测——你真正能控制的,是它的初始化时机和触发条件。应用市场检测到的「未授权前获取OAID/设备信息」问题,90%以上不是因为SDK本身违规,而是它在onLaunch阶段就自动执行了初始化,早于隐私弹窗展示和用户授权。
为什么uni-app里三方SDK总在隐私弹窗前读设备信息
UniApp底层运行时(5+ Runtime)会在onLaunch后立即加载默认模块,包括uni-stat、UniPush、X5内核、个推等。这些模块只要被引入或配置启用,就会在App启动早期调用plus.device.getInfo()、plus.android.getIdentifier()等原生API,从而提前读取OAID、IMEI、应用列表等敏感字段。
关键点在于:custom模式的隐私弹窗不阻断JS执行流,而template模式由原生层接管,才能真正拦截设备信息读取。
- manifest.json中设
"privacy": { "prompt": "custom" }→ 无效:弹窗是Vue组件,JS早已跑完 - 没禁用
uni-stat或UniPush模块 → 默认启动时就调plus.device.getUUID() - 使用了X5内核(
webview.x5为true)→ 启动即加载腾讯SDK,读取OAID
如何延迟三方SDK初始化直到用户同意隐私政策
必须把SDK初始化逻辑从onLaunch中剥离,改到uni.onPrivacyAuthorization回调里,并确保该回调只在用户点击“同意”后触发一次。
- 在
App.vue的onLaunch中只做两件事:调用uni.getPrivacySetting+ 注册uni.onPrivacyAuthorization - 把所有SDK初始化代码(如
uniPush.init()、uniStat.init()、getui.init())全部移到uni.onPrivacyAuthorization回调内部 - 回调中需判断
res.authorized === true才执行初始化,否则不处理(拒绝时由你手动退出) - 如果SDK提供“懒加载”或“延迟初始化”开关(如个推的
autoInit: false),务必开启
示例片段:
uni.onPrivacyAuthorization((res) => {
if (res.authorized) {
// 此处才初始化三方SDK
uniPush.init()
uniStat.init({ appId: 'xxx' })
getui.init({ autoInit: false }) // 确保已设false
} else {
plus.runtime.quit() // Android必须主动退出
}
})
哪些SDK必须手动禁用默认初始化
以下SDK在HBuilderX 3.2.15+中仍默认随App启动激活,即使你没显式调用其API:
-
uni-stat:manifest.json中勾选了“统计”模块就会自动初始化 → 需在manifest.json → App模块配置中取消勾选,改用按需引入 -
UniPush:即使没调init(),只要模块启用,也会尝试注册广播接收器 → 必须在manifest.json → SDK配置中关闭推送模块,或使用uniPush.setConfig({ autoInit: false }) - X5内核:启用后无法绕过其设备信息采集 → 若非必需,建议改用系统WebView;若必须用,在
manifest.json → App SDK配置中确认未开启“X5内核加速” - 个推/极光/友盟等第三方统计/推送SDK:必须通过
nativePlugins目录引入,并在androidPrivacy.json中声明,且初始化代码严格包裹在onPrivacyAuthorization内
检查是否真被拦截:看编译后dist目录有没有“提前读取”痕迹
很多开发者以为配了template就万事大吉,但实际打包后仍被检测出OAID读取——问题往往出在编译产物里残留的初始化调用。
- 打开
dist/build/app/android/assets/apps/__UNI__XXXXXXX/www/下的app.js,搜索getIdentifier、getOAID、getDeviceId,确认它们只出现在onPrivacyAuthorization回调块内 - 检查
dist/build/app/android/res/values/strings.xml,确认没有硬编码的privacy_policy_url或oaid相关字段 - 真机安装APK后,用
adb logcat | grep -i "oaid\|identifier\|device"观察启动日志,确认首次出现时间晚于隐私弹窗显示
最常被忽略的是:你删掉了SDK调用,但忘了删掉require或import语句——Webpack仍会打包进去并执行模块顶层代码。


















