Android 开发人员文档(针对 API > 26)说明了有关ANDROID_ID的以下内容:
在 Android 8.0(API 级别 26)和更高版本的平台上,一个 64 位数字(表示为十六进制字符串),对于应用签名密钥、用户和设备的每个组合都是唯一的。ANDROID_ID 的值受签名密钥和用户的限制。如果在设备上执行恢复出厂设置或 APK 签名密钥更改,则该值可能会更改。
在 O 中,Android ID(Settings.Secure.ANDROID_ID 或 SSAID)对于每个应用程序和设备上的每个用户都有不同的值。需要设备范围标识符的开发人员应改用可重置的标识符,例如广告 ID,为用户提供更多控制权。
广告 ID 还提供面向用户的设置以限制广告跟踪。
另外在 Android O 中:只要软件包名称和签名密钥相同,ANDROID_ID 值在软件包卸载/重新安装时就不会改变。应用程序可以依靠此值在重新安装时保持状态。
如果应用安装在运行较早版本 Android 的设备上,当设备更新到 Android O 时,Android ID 保持不变,除非卸载并重新安装该应用。
仅当设备恢复出厂设置或签名密钥在卸载和重新安装事件之间轮换时,Android ID 值才会更改。此更改仅适用于随附 Google Play 服务和广告 ID 的设备制造商。其他设备制造商可能会提供替代的可重置 ID 或继续提供 ANDROID ID。
而且,查看了计算SSAID的SettingsProvider.java的源码,好像流程如下:
- 每个设备用户都被分配了一个 32 字节的随机密钥。
- 对于每个 APK:带有 sha256 的 hmac 用于计算 APK 签名者密钥的 SSAID(其中使用的密钥是在步骤 1 中生成的密钥)。
- hmac 被截断为 16 个字符。
- 截断的值被保存到settings_ssaid.xml(ANDROID_ID从这个文件中查找未来的请求)。
因此,安全性似乎完全取决于步骤 1 中生成的密钥(也存储在 中settings_ssaid.xml)的保密性。
查看微博、QQ这些应用写入的ssaid值如下,他们通过这样的方式来识别登录设备:
127|LAX53:/data/system/users/0 # cat settings_ssaid.xml
<?xml version='1.0' encoding='UTF-8' standalone='yes' ?>
<settings version="-1">
<setting id="5" name="userkey" value="82EAFEC6513D9ED124CF9324591D09BAECC1729C24DD8406051ADD3C51FBAFE5" package="android" defaultValue="82EAFEC6513D9ED124CF9324591D09BAECC1729C24DD8406051ADD3C51FBAFE5" defaultSysSet="true" tag="null" />
<setting id="3" name="10017" value="7a6026fde685fce3" package="com.yueme.itv" defaultValue="7a6026fde685fce3" defaultSysSet="false" tag="null" />
<setting id="2" name="10028" value="1a606f39beae91d3" package="com.hisense.hiphone.appstore" defaultValue="1a606f39beae91d3" defaultSysSet="false" tag="null" />
<setting id="4" name="10031" value="960cb1bc9c65a8e2" package="com.sohu.inputmethod.sogou" defaultValue="960cb1bc9c65a8e2" defaultSysSet="false" tag="null" />
<setting id="1" name="10032" value="db099c001d559093" package="com.ctg.itrdc.file" defaultValue="db099c001d559093" defaultSysSet="false" tag="null" />
<setting id="7" name="10060" value="4145e238e054cc8a" package="com.tencent.mobileqq" defaultValue="4145e238e054cc8a" defaultSysSet="false" tag="null" />
<setting id="6" name="10062" value="e1220d9271c69e66" package="com.sina.weibo" defaultValue="e1220d9271c69e66" defaultSysSet="false" tag="null" />