业务代码检查了没有调用个推的代码,求助。HBuilderX 5.21+uniapp x环境。
2026-07-25 16:33:11.615 -> [测试动作] 启动史宾格隐私合规检测
2026-07-25 16:33:54.586 -> (SDK: 个推消息推送SDK)读取OAID
2026-07-25 16:35:09.808 -> 弹出隐私政策
堆栈:
com.heytap.openid.IOpenID
at android.os.Parcel.writeInterfaceToken()
at com.getui.gtc.dim.c.d$d.a(Unknown Source:10)
at com.getui.gtc.dim.c.d$b.b(Unknown Source:37)
at com.getui.gtc.dim.c.d$l.b(Unknown Source:0)
at com.getui.gtc.dim.c.d.c(Unknown Source:15)
at com.getui.gtc.dim.c.a.a(Unknown Source:48)
at com.getui.gtc.dim.b.g.b(Unknown Source:635)
at com.getui.gtc.dim.b.g.a(Unknown Source:196)
at com.getui.gtc.dim.b.g.a(Unknown Source:1017)
at com.getui.gtc.dim.a.a(Unknown Source:514)
at com.getui.gtc.dim.DimManager.get(Unknown Source:13)
at com.getui.gtc.h.c.a(Unknown Source:72)
at com.getui.gtc.h.c$1.run(Unknown Source:2)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
1 个回复
大写Neil (作者)
一、项目背景
项目类型:uni-app x
HBuilderX 版本:5.21.2026071110-alpha
Android 包中已集成 uni-push
当前已按官方《uni-app x 开发者应用合规指南》处理隐私弹框与同意逻辑
二、已按官方推荐做的处理
应用启动时先展示隐私政策提示框,同意按钮使用了官方推荐的button open-type="agreePrivacyAuthorization"
在用户同意隐私协议前,不主动调用:
uni.getPushClientId
uni.onPushMessage
通知初始化、push 绑定等逻辑都放在用户同意隐私协议之后
三、确认过的代码侧情况
项目里同意按钮已经接入官方推荐做法,例如:使用了open-type="agreePrivacyAuthorization",并且 push 初始化逻辑已经做了隐私同意守卫,没有在同意前主动触发 getPushClientId/onPushMessage。
四、当前实际问题
尽管如此,Android 合规检测仍然发现:
在用户点击“同意”按钮之前,SDK 仍然发生了设备标识相关信息获取行为。
抓到的调用堆栈如下:
com.heytap.openid.IOpenID
at android.os.Parcel.writeInterfaceToken()
at com.getui.gtc.dim.c.d$d.a(Unknown Source:10)
at com.getui.gtc.dim.c.d$b.b(Unknown Source:37)
at com.getui.gtc.dim.c.d$l.b(Unknown Source:0)
at com.getui.gtc.dim.c.d.c(Unknown Source:15)
at com.getui.gtc.dim.c.a.a(Unknown Source:48)
at com.getui.gtc.dim.b.g.b(Unknown Source:635)
at com.getui.gtc.dim.b.g.a(Unknown Source:196)
at com.getui.gtc.dim.b.g.a(Unknown Source:1017)
at com.getui.gtc.dim.a.a(Unknown Source:514)
at com.getui.gtc.dim.DimManager.get(Unknown Source:13)
at com.getui.gtc.h.c.a(Unknown Source:72)
at com.getui.gtc.h.c$1.run(Unknown Source:2)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:457)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:301)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
at java.lang.Thread.run(Thread.java:764)
从堆栈看,像是 getui gtc dim 在后台线程里提前触发了 OpenID/OAID 相关能力。
五、从 APK manifest 中看到的静态信息
当前 APK 中可见以下与 push/getui 相关组件或配置:
uts.sdk.modules.DCloudUniPush.UniPushService
uts.sdk.modules.DCloudUniPush.UniPushIntentService
com.igexin.sdk.PushService
com.igexin.sdk.GService
com.igexin.sdk.GTIntentService
com.igexin.sdk.GetuiActivity
com.getui.gtc.GtcService
com.getui.gtc.base.GtcProvider
GETUI_APPID
PUSH_APPID
因此我们怀疑问题不在 JS/UTS 代码主动调用,而在于:
uni-push/getui 被打进包后,宿主层或原生组件存在提前初始化/提前取标识的行为。
六、查到的官方文档理解
uni-app x 中开发者代码启动较早,建议自己先弹隐私框
同意前不要调用涉及隐私的 API / SDK
uni-push 文档提到:调用 getPushClientId 或 onPushMessage 时才会初始化个推 SDK
agreePrivacyAuthorization 只是隐私同意状态的通信方式,并不是强制拦截所有隐私 API 的技术开关
但当前现象与第 3 点的理解不一致,因为代码中没有在同意前主动调用这两个 API,仍然发生了 getui 相关调用链。