You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 07:36:32