Android(以及其他手机设备)上用于唯一标识用户/设备实例的一套开源解决方案,常被称作 XUID(可能是某个项目或团队内部的叫法,类似“cross-user/device ID”或自定义唯一ID)。
2026 年 Android 生态下,获取稳定、持久、合规的唯一标识已非常严格(隐私政策、Google Play 规则、厂商限制)。以下是目前主流且开源的可行方案对比,按场景推荐:
| 方案 | 开源 | 稳定性(重装App后) | 跨App共享 | 需要权限 | 推荐场景 | 主要实现库/方式 | 备注(2026现状) |
|---|---|---|---|---|---|---|---|
| Firebase Installation ID (FID) | 是(Google 官方) | 高(安装期内稳定) | 否(每个App独立) | 无 | 大多数非广告场景(登录态、用户偏好同步、防刷等) | Firebase SDK 中的 FirebaseInstallations.getInstance() | Google 官方最推荐,非广告用例首选 |
| 自生成 UUID + 内部存储 | 是 | 中(卸载重装丢失) | 否 | 无 | 简单App实例标识 | UUID.randomUUID().toString() + SharedPreferences / EncryptedSharedPreferences | 最简单,合规,Google 文档推荐备用方案 |
| FingerprintJS Android | 是 | 高(设备指纹) | 否 | 无(基本信号) | 需要较高唯一性、防作弊、风控 | https://github.com/fingerprintjs/fingerprintjs-android | MIT 许可,Kotlin 编写,收集硬件/系统信号生成稳定指纹 |
| TrustDevice-Android | 是 | 很高(多信号+算法) | 否 | 少量可选 | 风控、反欺诈、设备唯一性要求高 | https://github.com/trustdecision/trustdevice-android | 轻量级开源设备指纹,号称稳定设备ID |
| Android_CN_OAID(国内特化) | 是 | 高(OAID/AAID) | 部分(厂商支持) | 无(OAID接口) | 中国市场、广告/统计需OAID | https://github.com/gzu-liyujiang/Android_CN_OAID | 替代 MSA 闭源 SDK,支持华为/小米/OPPO/vivo 等厂商 OAID + AAID |
| devEyosiyas/AndroidID | 是 | 高(DRM-based) | 否 | 无 | 追求无权限设备唯一ID | https://github.com/devEyosiyas/AndroidID | 使用 Widevine DRM API 生成稳定ID |
| 传统 ANDROID_ID (SSAID) | 系统API | 中高 | 同签名App可共享 | 无 | 旧项目兼容 | Settings.Secure.getString(context.contentResolver, Settings.Secure.ANDROID_ID) | Android 8+ 按签名+用户隔离,不建议新项目首选 |
2026 年最实用推荐组合(XUID 风格解决方案)
1. 首推:Firebase Installation ID(最合规、最稳定)
- Google 官方强烈推荐用于“标识应用实例”。
- 自动处理重置、备份等。
- 集成简单:
// build.gradle
implementation("com.google.firebase:firebase-installations:18.x.x") // 最新版
// 使用
FirebaseInstallations.getInstance().id.addOnCompleteListener { task ->
if (task.isSuccessful) {
val fid = task.result // 这就是你的 XUID / 设备实例唯一ID
// 存储或上传到后端与用户账号绑定
}
}
- 缺点:依赖 Google Play Services(GMS),鸿蒙/无GMS 设备不可用。
- 专门为中国厂商适配 OAID(开放匿名设备标识)。
- 支持 fallback 到 AndroidID / GUID / WidevineID 等。
- 仓库活跃,个人开发者友好(MSA 官方 SDK 企业才能用)。
- 集成后可得到 OAID/VAID/AAID,根据需求选。
- FingerprintJS Android 或 TrustDevice-Android。
- 生成类似
visitorId的字符串,基于 CPU、屏幕、字体、传感器等 20+ 信号。 - 即使卸载重装,同一物理设备大概率相同(80-95%+ 准确率)。
- 完全开源、无后门。
object XUID {
private const val PREF_KEY = "xuid"
fun getOrCreate(context: Context): String {
val prefs = context.getSharedPreferences("secure_prefs", Context.MODE_PRIVATE)
var id = prefs.getString(PREF_KEY, null)
if (id.isNullOrBlank()) {
id = UUID.randomUUID().toString()
prefs.edit().putString(PREF_KEY, id).apply()
}
return id!!
}
}
- 再结合 ANDROID_ID 或 Build.FINGERPRINT 做 salt,进一步提升区分度。