android deviceid - eju-front/mobile-solution GitHub Wiki
Android 唯一设备 ID 方案
方案列表
方案一、依赖 IMEI
依赖 IMEI,通过 TelephonyManager.getDeviceId()
获得唯一 ID
缺点
- 不支持电话功能的机器只能获取到空值,比如说平板电脑,智能电视等
- wipe 后值会变更
- 需要 READ_PHONE_STATE 权限,对于一些用户来说这是非常敏感的权限
- 部分手机返回
0
或者*
或者其它无意义的符号
方案二、Mac Address
依赖 WiFi 连接获得唯一地址
缺点
- 依赖于 WiFi 模块,不支持或者不连接 WiFi 时无法获得
- 部分手机返回空
方案三、Serial Number
依赖 android.os.Build.SERIAL
缺点
- 不是所有机器都支持
方案四、Android ID
依赖 Settings.Secure.ANDROID_ID
api 可以获得一个 64位的 UUID,该值在设备第一次启动时生成
缺点
- wipe 后值会变
- 在少量 Room 或者机型上会返回固定的值
方案五、UUID
手动生成 UUID 并保存到内部或外部存储卡上
缺点
- 依赖于存储卡,容易被修改
方案六、Advertising ID
依赖 Google 广告服务的唯一 ID
缺点
- 依赖于 Google Play Service,国内不可用
方案七、硬件信息
依赖多种硬件信息计算而成
缺点
- 依赖于选取的指标数量和算法,算法不可靠时重复率高
- 多种硬件信息 Root 后可修改
方案八、综合
综合以上各个方案,比如说当方案一无法获得时取方案二,方案二无法获得时取方案三
缺点
- 依赖于选取的算法
- 代码复杂,容易出错
- 只能解决无法获得的问题,无法解决冲突问题
- 友盟采用此种方案,实际情况冲突率并不小
结论
目前来说 Android 平台并没有完全可靠的设备 ID,无法确保没有冲突。对于一般应用来说方案四就已经足够了。