2020谷歌新规下,Android Java如何获取持久化设备唯一ID?
合规且持久的Android设备唯一ID解决方案
我之前在项目里碰到过一模一样的问题——用UUID存在SharedPreferences里,用户清个应用数据就全白搭,再加上谷歌2020年的合规限制,IMEI、Android ID这些老路子根本碰不得。下面几个是我实际验证过的靠谱方案,你可以根据自己的场景选:
1. 使用Advertising ID(广告标识符)
这是谷歌官方推荐的用于广告场景的唯一标识,完全符合合规要求。它的特点是用户可以在系统设置里主动重置或关闭,但只要用户没操作,就能保持持久唯一性。
实现步骤:
- 先引入Google Play Services的广告库:
implementation 'com.google.android.gms:play-services-ads-identifier:18.0.1' - 获取ID的代码示例(Kotlin):
private fun getAdvertisingId(context: Context): String? { return try { val adInfo = AdvertisingIdClient.getAdvertisingIdInfo(context) // 检查用户是否开启了限制广告追踪 if (!adInfo.isLimitAdTrackingEnabled) { adInfo.id } else { // 用户关闭了广告追踪,这里可以生成临时ID或做其他处理 null } } catch (e: Exception) { e.printStackTrace() null } }
优缺点:
- ✅ 完全合规,无需申请特殊权限
- ✅ 同一设备上的不同应用能拿到相同ID(除非用户重置)
- ❌ 用户可主动重置或关闭,可能导致ID变更
2. 自定义设备特征哈希 + 系统自动备份
如果不需要对接广告生态,可以用设备公开的、不受限的硬件/软件特征生成唯一哈希,再结合Android的自动备份功能,保证应用数据被清除后还能恢复这个ID。
实现思路:
- 收集合规的设备信息:比如
Build.BRAND、Build.MODEL、Build.MANUFACTURER、Build.VERSION.SDK_INT这类公开字段(注意:Android 10+部分设备的Build.FINGERPRINT可能受限,需要提前测试) - 将这些信息拼接成字符串,用SHA-256生成哈希值
- 把生成的哈希存在SharedPreferences,同时在
AndroidManifest.xml开启自动备份:<application ... android:allowBackup="true" android:fullBackupContent="@xml/backup_rules"> - 备份规则文件(
res/xml/backup_rules.xml):<?xml version="1.0" encoding="utf-8"?> <full-backup-content> <include domain="sharedpref" path="your_unique_id_prefs.xml" /> </full-backup-content>
优缺点:
- ✅ 完全合规,不依赖第三方服务
- ✅ 应用卸载重装后,只要用户开了系统备份就能恢复ID
- ❌ 极端场景下,不同设备可能生成相同哈希(概率极低)
- ❌ 用户关闭系统备份或清除备份数据时,ID会丢失
3. Firebase Installations ID(适合Firebase生态项目)
如果你已经接入了Firebase,Firebase Installations提供的ID是天生持久化的——哪怕应用卸载重装,只要用户没清除Firebase相关数据,ID就不会变,而且完全符合谷歌合规要求。
实现步骤:
- 确保已经接入Firebase核心库
- 获取ID的代码示例:
FirebaseInstallations.getInstance().getId() .addOnCompleteListener { task -> if (task.isSuccessful) { val installationId = task.result // 拿到ID后做业务处理 } else { task.exception?.printStackTrace() } }
优缺点:
- ✅ 完全合规,持久化效果稳定
- ✅ 自动处理备份和恢复逻辑
- ❌ 依赖Firebase生态,不适合未接入Firebase的独立应用
总结
- 做广告相关的用户追踪,优先选Advertising ID
- 独立应用且不想依赖第三方,用自定义哈希+系统自动备份
- 已经在用Firebase生态,直接上Firebase Installations ID就完事了
内容的提问来源于stack exchange,提问作者Anthony Shoshi Gomes
相关产品推荐
相关产品推荐

