uni.getSystemInfoSync().deviceId不可靠,是uni-app首次启动生成的非持久字符串,卸载重装必变,不能用于设备绑定;推荐用plus.android调用Settings.Secure.ANDROID_ID,兼容性好且无需敏感权限。

uni.getSystemInfoSync() 返回的 deviceId 不可靠
它不是硬件 ID,而是 uni-app 框架在首次启动时生成并缓存的一个字符串,卸载重装 App 后必然变化,不能用于设备绑定或用户去重。很多开发者误以为这是 Android ID 或 IMEI,结果上线后发现同一台手机反复注册新设备。
-
uni.getSystemInfoSync().deviceId在安卓上实际是plus.device.uuid,由运行时生成,非持久、不可跨 App 共享 - 它不依赖任何权限,但也不代表设备本身——模拟器、某些厂商 ROM(如华为 EMUI 12+)甚至会返回空字符串或固定值
- 如果你正用它做登录态设备校验或防刷,建议立刻停用
Android ID 获取最稳路径:plus.android + Settings.Secure.ANDROID_ID
这是目前兼容性最好、无需敏感权限、且在绝大多数安卓 5.0+ 设备上能稳定返回的标识。注意它不是永久不变(恢复出厂设置、部分深度定制系统可能重置),但日常升级、重装 App 完全不受影响。
- 必须用
plus.android调用原生 API,uni.getSystemInfo拿不到 - 代码里要加 SDK 版本判断:
android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.FROYO(即 ≥ 2.2) - 常见错误:漏掉
getApplicationContext()导致 Context 错误,或直接传runtimeMainActivity()引发空指针 - 实操示例(放在 onLaunch 或工具函数中):
function getAndroidId() {
if (uni.getSystemInfoSync().platform !== 'android') return '';
const context = plus.android.importClass('android.content.Context');
const settingsSecure = plus.android.importClass('android.provider.Settings$Secure');
const main = plus.android.runtimeMainActivity();
const resolver = main.getContentResolver();
return settingsSecure.getString(resolver, 'android_id') || '';
}
OAID 是广告场景唯一合规出路,但别指望它“永远存在”
从安卓 10 开始,IMEI 彻底被限制(需 READ_PHONE_STATE + 用户授权 + targetSdkVersion ≤ 28),而 OAID 是官方推荐替代方案——但它不是系统原生提供,而是由厂商或三方 SDK(如移动安全联盟 MSAC)动态注入,不同设备支持程度差异极大。
- 华为、小米、OPPO、vivo 均已内置 OAID 支持,但部分低端机或海外版 ROM 可能返回空或报错
- 用户可在「设置 → 隐私 → 广告服务」中一键重置,所以它只适合广告归因、AB 测试等允许“失联”的场景
- 获取需引入原生插件(如
uni-plugin-oaid),纯 JS 无法调用;不要试图用plus.android.runtimeExec硬调,多数情况下会失败 - 别和 Android ID 混用:OAID 是用户可控的,Android ID 是系统级的,二者语义和生命周期完全不同
IMEI 已基本不可用,除非你明确接受高风险和低覆盖率
即使你在 manifest.json 中配置了 "READ_PHONE_STATE",并在 Android 9 及以下机型上成功获取,2026 年当前主流新机(安卓 12+、targetSdkVersion ≥ 31 的包)已完全屏蔽该权限对 IMEI 的访问。系统直接返回 null 或占位符(如 000000000000000)。
- 双卡手机有
getDeviceId(0)和getDeviceId(1),但安卓 10+ 后统一失效 - Google Play 强制要求声明理由并审核用途,国内上架也面临应用市场拒审风险
- 如果真有强合规需求(如金融类设备锁),应转向服务端结合多因子(Android ID + OAID + 设备特征哈希)交叉验证,而非依赖单一字段

















