You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过ADB与Unity应用获取一致的Android ID?

问题根因

ADB与Unity应用获取到的Android ID不一致,核心是Android系统对ANDROID_ID的作用域隔离规则,常见触发场景有3种:

  • 多用户/工作配置文件/应用双开隔离:Android 4.2起支持多用户、工作资料(企业管控场景),国内定制系统的应用双开、系统分身也基于该机制实现,每个独立用户/分身空间下的ANDROID_ID完全独立。默认ADB命令读取的是主用户(user 0)空间的值,如果Unity应用安装在二级用户、工作配置文件、双开分身空间下,调用接口拿到的是对应空间的独立ID。
  • 应用签名作用域隔离:Android 8.0(API 26)及以上版本,ANDROID_ID不再是设备全局唯一值,而是按照「用户空间 + 应用签名密钥」两个维度生成:同一用户空间下,签名相同的应用拿到的ANDROID_ID一致,签名不同的应用拿到的值完全不同。ADB shell进程的签名与Unity应用签名不一致,自然会拿到不同值。
  • ADB命令未指定匹配上下文:默认执行adb shell settings get secure android_id时,读取的是shell进程自身所属用户、权限上下文的值,和前台应用的运行上下文不匹配。
可落地方案

按以下步骤操作即可获取两边完全一致的设备标识符:

步骤1:确认Unity应用所属的用户空间

先执行ADB命令查询Unity应用的安装所属用户ID:

# Windows系统用该命令
adb shell dumpsys package 替换为你的Unity应用包名 | findstr userId

# macOS/Linux系统用该命令
adb shell dumpsys package 替换为你的Unity应用包名 | grep userId

返回结果中userId=后的数字就是应用所属用户ID,主用户默认是0,工作配置文件/双开空间/二级用户一般为10、11等两位数值。

步骤2:指定用户空间读取对应ID(适用于无签名隔离的低版本系统)

拿到用户ID后,执行ADB命令时加上--user参数指定对应空间,比如用户ID为0时命令如下:

adb shell settings --user 0 get secure android_id

如果执行后返回值和Unity侧拿到的仍不一致,说明是签名隔离规则导致,按步骤3处理。

步骤3:同上下文取值(推荐,兼容所有Android版本/定制系统)

不要依赖系统全局ID做跨渠道校验,直接在ADB侧复用Unity应用的运行上下文取值,命令如下:

adb shell run-as 替换为你的Unity应用包名 settings get secure android_id

该命令会完全继承Unity应用的签名权限、所属用户空间,不受多用户、签名隔离、系统定制规则影响,返回值和Unity代码中调用原生接口拿到的结果完全一致。

注意事项
  • Android 10及以上版本,第三方应用已无权限读取非本应用作用域的全局设备标识,强行调用只会返回空值或随机生成的假值,不要尝试在Unity侧获取所谓的“全局唯一Android ID”。
  • 如果是做设备一致性校验,必须保证ADB和应用侧取值上下文完全一致,不要用默认无参数的ADB命令返回值作为校验基准。

内容的提问来源于stack exchange,提问作者eb1t

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.30 05:51:15