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,无法确保没有冲突。对于一般应用来说方案四就已经足够了。

参考资料