通过 ADB Shell 获取 Android ID
摘要 TL;DR
Android ID 是一个以十六进制字符串体现的 64 位数字,在用户第一次启用设备的时候随机生成,并且在用户使用设备时不会发生改变。而当设备恢复出厂设置时可能发生改变。
什么是 Android ID?
A 64-bit number (as a hex string) that is randomly generated when the user first sets up the device and should remain constant for the lifetime of the user’s device. The value may change if a factory reset is performed on the device.
String ANDROID_ID in Settings.Secure—Android Developers
在运行有 Android 4.2 或更高版本的某些设备上可以创建多用户,每个用户都相当于拥有一个独立的设备,因而每个用户的 ANDROID_ID 也是不同的。
获取 Android ID
获取 Android ID 的方法有很多种,如果你是 Android 开发者,自然不必多说;或者可以在 Google Play 上下载相关的 app 同样可以获取到 Android ID,然而作为用户,很难得知下载的 app 除了获取 Android ID 还会获取什么其他的信息,又是如何来使用这些信息的。因而最简单也是最安全的方法就是通过 ADB Shell1 自行查询。
如何安装和使用 ADB Shell 这里不再赘述。你只需要在连接 Android 设备并且在 Developer options 中允许 USB debugging 后使用以下的命令行查询 Android ID。
adb shell settings get secure android_id
或者查询 Settings 的 content provider 的值。
adb shell content query --uri content://settings/secure/android_id --projection value
使用以上两个命令中所获得的结果就像以下图示。(在这里我的设备的 Android ID 已被隐藏。)
Android 标识符的使用原则
最重要地,如果你是 Android 开发者,那么请仔细阅读 Android Developers 提供的 唯一标识符最佳做法 的文档,请尽可能地使用广告 ID2、实例 ID 和 GUID3 替代使用 Android ID 或 MAC 地址4。
根据 Android 开发指南,建议在使用 Android 标识符时遵循以下原则:
原则 1:避免使用硬件标识符。 您可以在大多数用例中避免使用 SSAID(Android ID)和 IMEI 等硬件标识符,而必需功能也不会受到限制。
原则 2:只为用户分析或广告用例使用广告 ID。 使用 广告 ID 时,务必遵守限制广告追踪标记,确保标识符无法与个人可识别信息(PII)建立关联,并避免桥接广告 ID 重置。
原则 3:尽一切可能为防欺诈支付和电话以外的所有其他用例使用实例 ID 或私密存储的 GUID。 对于绝大多数非广告用例,使用实例 ID 或 GUID 应该足矣。
原则 4:使用适合您的用例的 API 以尽量降低隐私权风险。 为高价值内容保护使用 DRM API,为滥用预防使用 SafetyNet API。Safetynet API 是能够确定设备真伪而又不会招致隐私权风险的最简单方法。
-
Android 调试桥(adb)是一个通用命令行工具,其允许您与模拟器实例或连接的 Android 设备进行通信。它可为各种设备操作提供便利,如安装和调试应用,并提供对 Unix shell(可用来在模拟器或连接的设备上运行各种命令)的访问:https://developer.android.com/studio/command-line/adb.html?hl=zh-cn ↩
-
广告 ID 是一种可由用户重置的标识符,适用于广告用例。 ↩
-
标识运行在设备上的应用实例最简单明了的方法就是使用实例 ID,在大多数非广告用例中,这是建议的解决方案。只有进行了针对性配置的应用实例才能访问该标识符,并且标识符重置起来(相对)容易,因为它只存在于应用的安装期。 ↩
-
从 Android M 开始,无法再通过第三方 API 获得 本地设备 MAC 地址(例如,WLAN 和蓝牙)。 ↩