1***@163.com
1***@163.com
  • 发布:2026-05-26 20:48
  • 更新:2026-05-26 20:49
  • 阅读:56

Android 隐私合规检测发现 DCloud 原生层和友盟 SDK 存在敏感 API 调用异常

分类:uni-app

问题描述

uni-app Android App 在用户同意隐私协议后,友盟 SDK 初始化时,同一时间连续两次调用 Android ID 获取接口:

android.provider.Settings$Secure$getString

调用参数为:

android_id

两次调用堆栈完全一致,均来自友盟 SDK 内部:

com.umeng.umzid.ZIDManager

请协助确认 uni-app / DCloud 集成的友盟 SDK 是否存在重复初始化或 ZIDManager 重复采集 Android ID 的问题,以及是否有配置方式避免同一次初始化中重复读取 Android ID。

复现步骤

  1. 使用 HBuilderX 云打包 Android App。
  2. 卸载旧 App,重新安装新包。
  3. 首次启动 App。
  4. 用户点击同意隐私协议。
  5. 使用合规检测工具检测敏感 API 调用。
  6. 检测到同一时间连续两次读取 Android ID。

期望结果

用户同意隐私协议后,友盟 SDK 可以按需初始化,但同一次初始化流程中不应重复读取 Android ID。

如果该行为属于友盟 SDK 内部逻辑,请说明是否符合合规要求,以及 DCloud 当前集成版本是否可升级或规避。

实际结果

同一时间出现两条完全一致的 Android ID 读取记录:


敏感函数: android.provider.Settings$Secure$getString  
函数参数: [ContentResolver, android_id]  

堆栈信息:  
com.umeng.commonsdk.statistics.common.DeviceConfig.getAndroidId(DeviceConfig.java:153)  
java.lang.reflect.Method.invoke(Native Method)  
com.umeng.umzid.d.a(Unknown Source:31)  
com.umeng.umzid.ZIDManager.a(Unknown Source:14)  
com.umeng.umzid.ZIDManager.b(:8)  
com.umeng.umzid.ZIDManager$b.run(:1)  
java.util.concurrent.Executors$RunnableAdapter.call  
java.util.concurrent.FutureTask.run  
java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run  
java.util.concurrent.ThreadPoolExecutor.runWorker  
java.lang.Thread.run
2026-05-26 20:48 负责人:无 分享
已邀请:
Ask小助手

Ask小助手 - Ask社区AI助手

欢迎到专业群( uni-app 官方技术交流群 1 ) 咨询,群中有相关专业的管理员和群友。

根据你的描述和堆栈信息,这个重复调用 Android ID 的行为确实是由友盟 SDK 内部的 ZIDManager 触发的。

关于你的疑问和解决方案,我基于知识库和通用技术经验给你梳理一下:

1. 这是否属于友盟 SDK 的内部逻辑?是否符合合规要求?

是的,这属于友盟 SDK 的内部逻辑。 从堆栈 com.umeng.umzid.ZIDManager 可以明确看出,这是友盟用于生成设备唯一标识(ZID)的模块在初始化时进行的操作。

关于合规性,这需要分情况看:

  • 如果你 App 集成的 DCloud 内置友盟统计模块(Statistic):根据 DCloud 官方文档说明,HBuilderX 3.1.14+ 版本已将友盟 SDK 升级到 9.3.8 版本以适配了合规问题。官方要求的做法是确保在用户同意《隐私政策》之后,再调用相关的 API。如果你正确配置了隐私弹窗,那么 DCloud 引擎会在用户同意后才初始化这些模块。在同意之后发生的调用,即使有两次,也属于合规范围内的业务行为。你可以参考文档 android-store > Statistic
  • 如果你是自己集成的友盟 SDK(如通过 uni 原生插件):你需要检查插件代码,确保友盟 SDK 的初始化(如 UMConfigure.init)和隐私状态提交(UMConfigure.submitPolicyGrantResult)都严格放在了用户同意隐私协议之后执行。只要在同意后调用,行为本身是合规的。

2. 是否有配置方式避免同一次初始化中重复读取 Android ID?

目前没有直接配置可以禁用 ZIDManager 的第一次调用。

这个重复调用是友盟 SDK 自身的一个已知行为。从 ask 社区的过往反馈来看(如 友盟组件 在 用户 同意隐私政策前 获取安卓ID),有开发者遇到过完全相同的堆栈和问题。友盟的 ZID 生成逻辑中,会通过反射的方式获取 Android ID,并且由于其内部缓存或异步检查机制,确实可能在同一时间点触发两次 Settings$Secure.getString 调用。

实际处理建议:

  1. 确认隐私协议配置:确保你使用的是 template 模式的隐私弹窗,而不是自定义的。这是 DCloud 控制所有原生模块(包括友盟)初始化时机的关键。详细配置请参考 Android平台隐私与政策提示框
  2. 升级工具和版本:确保你的 HBuilderX 是最新版本,云打包时才会使用最新的 DCloud 引擎和友盟 SDK 版本,这可能在一定程度上优化或缓解此问题。
  3. 应对应用市场审核
    • 如果你的 App 因为这个问题被应用市场(如华为)驳回,但你能100%确认,通过合规检测工具抓取的这两次调用,都发生在用户点击“同意”按钮之后,那么这属于友盟 SDK 在授权后的正常内部业务行为。
    • 你可以尝试联系友盟官方技术支持,获取关于 ZIDManager 重复调用问题的官方说明或最新修复版本。
    • 在向应用市场申诉时,你可以附上合规检测工具的完整时间线截图,明确证明这两次调用均在用户授权之后发生,并说明这是友盟 SDK 生成内部标识符的正常行为,不涉及违规提前收集。

总的来说,只要调用发生在用户同意之后,这个重复行为虽然不完美,但通常不会被判定为合规问题。如果你的 App 在同意前就出现了这个调用,那么一定是隐私弹窗配置或初始化时机出了问题,需要优先排查。

内容为 AI 生成,仅供参考

要回复问题请先登录注册