如何选择 Android 唯一标识符

7,643 阅读3分钟

前言

大家好,我是未央歌,一个默默无闻的移动开发搬砖者~

本文针对 Android 各种标识符做了统一收集,方便大家比对,以供选择适合大家的唯一标识符。

标识符

IMEI

  • 从 Android 6.0 开始获取 IMEI 需要权限,并且从 Android 10+ 开始官方取消了获取 IMEI 的 API,无法获取到 IMEI 了
fun getIMEI(context: Context): String {
    val telephonyManager = context
        .getSystemService(TELEPHONY_SERVICE) as TelephonyManager
    return telephonyManager.deviceId
}

Android ID(SSAID)

  • 无需任何权限
  • 卸载安装不会改变,除非刷机或重置系统
  • Android 8.0 之后签名不同的 APP 获取的 Android ID 是不一样的
  • 部分设备由于制造商错误实现,导致多台设备会返回相同的 Android ID
  • 可能为空
fun getAndroidID(context: Context): String {
    return Settings.System.getString(context.contentResolver,Settings.Secure.ANDROID_ID)
}

MAC 地址

  • 需要申请权限,Android 12 之后 BluetoothAdapter.getDefaultAdapter().getAddress()需要动态申请 android.permission.BLUETOOTH_CONNECT 权限
  • MAC 地址具有全局唯一性,无法由用户重置,在恢复出厂设置后也不会变化
  • 搭载 Android 10+ 的设备会报告不是设备所有者应用的所有应用的随机化 MAC 地址
  • 在 Android 6.0 到 Android 9 中,本地设备 MAC 地址(如 WLAN 和蓝牙)无法通过第三方 API 使用 会返回 02:00:00:00:00:00,且需要 ACCESS_FINE_LOCATION 或 ACCESS_COARSE_LOCATION 权限

Widevine ID

  • DRM 数字版权管理 ID ,访问此 ID 无需任何权限
  • 对于搭载 Android 8.0 的设备,Widevine 客户端 ID 将为每个应用软件包名称和网络源(对于网络浏览器)返回一个不同的值
  • 可能为空
fun getWidevineID(): String {
    try {
        val WIDEVINE_UUID = UUID(-0x121074568629b532L, -0x5c37d8232ae2de13L)
        val mediaDrm = MediaDrm(WIDEVINE_UUID)
        val widevineId = mediaDrm.getPropertyByteArray(MediaDrm.PROPERTY_DEVICE_UNIQUE_ID);
        val sb = StringBuilder();
        for (byte in widevineId) {
            sb.append(String.format("%02x", byte))
        }
        return sb.toString();
    } catch (e: Exception) {
    } catch (e: Error) {
    }
    return ""
}

AAID

  • 无需任何权限
  • Google 推出的广告 ID ,可由用户重置的标识符,适用于广告用例
  • 系统需要自带 Google Play Services 才支持,且用户可以在系统设置中重置

重置后,在未获得用户明确许可的情况下,新的广告标识符不得与先前的广告标识符或由先前的广告标识符所衍生的数据相关联。

还要注意,Google Play 开发者内容政策要求广告 ID“不得与个人身份信息或任何永久性设备标识符(例如:SSAID、MAC 地址、IMEI 等)相关联。”

在支持多个用户(包括访客用户在内)的 Android 设备上,您的应用可能会在同一设备上获得不同的广告 ID。这些不同的 ID 对应于登录该设备的不同用户。

OAID

  • 无需任何权限
  • 国内移动安全联盟出台的“拯救”国内移动广告的广告跟踪标识符
  • 基本上是国内知名厂商 Android 10+ 才支持,且用户可以在系统设置中重置

UUID

  • 生成之后本地持久化保存
  • 卸载后重新安装、清除应用缓存 会改变

如何选择

同个开发商需要追踪对比旗下应用各用户的行为

  • 可以采用 Android ID(SSAID),并且不同应用需使用同一签名
  • 如果获得的 Android ID(SSAID)为空,可以用 UUID 代替【 OAID / AAID 代替也可,但需要引入第三方库】
  • 在 Android 8.0+ 中, Android ID(SSAID)提供了一个在由同一开发者签名密钥签名的应用之间通用的标识符

希望限制应用内的免费内容(如文章)

  • 可以采用 UUID ,作用域是应用范围,用户要想规避内容限制就必须重新安装应用

用户群体主要是大陆

  • 可以采用 OAID ,低版本配合采用 Android ID(SSAID)/ UUID
  • 可以采用 Android ID(SSAID),空的时候配合采用 UUID 等

用户群体在海外

  • 可以采用 AAID
  • 可以采用 Android ID(SSAID),空的时候配合采用 UUID 等

最后

如果你对 Android 感兴趣,可以订阅我的专栏:

感谢大家的支持,码字实在不易,其中如若有错误,望指出,记得点赞关注加收藏哦 ~