MobileInfo 设备指纹实践:如何基于 Build 与 Serial 生成不碰撞的设备唯一 ID
MobileInfo 设备指纹实践:如何基于 Build 与 Serial 生成不碰撞的设备唯一 ID
【免费下载链接】MobileInfo【Android】Hardware Information. For detailed network diagnosis, please refer to【HttpInfo】项目地址: https://gitcode.com/gh_mirrors/mo/MobileInfo
MobileInfo是一款 Android 硬件信息库,它内置了基于Build常量与Serial序列号生成设备指纹的方案:把七个 Build 字段压缩成机型短码,再与设备 Serial 的哈希一起打包进 UUID,从而生成不碰撞的设备唯一 ID。本文带你逐行拆解 PhoneIdHelper.java 中的实现,讲透取舍、碰撞风险与合规边界。
一、先搞懂:Android 设备指纹的三个要素
所谓设备指纹,就是用一组稳定的硬件/系统标识拼出一个"这台设备"的唯一 ID。MobileInfo 的方案只依赖三样东西:
| 要素 | 来源 | 稳定性 | 唯一性 |
|---|---|---|---|
Build.BOARD/BRAND/DEVICE/MANUFACTURER等 | android.os.Build静态字段 | 高(刷机可能变化) | 低,同机型完全相同 |
Serial序列号 | Build.getSerial()/Build.SERIAL | 极高 | 唯一性的主力 |
UUID打包 | 本地计算 | 确定性 | 无碰撞的哈希组合 |
二、MobileInfo 的 UUID 打包算法:两步走
核心实现只有两小步,位于 PhoneIdHelper.getUniqueID():
第 1 步:生成 14 位机型短码
以固定前缀35开头,依次拼接七个 Build 常量的长度取模值:
String shortCode = "35" + (Build.BOARD.length() % 10) + (Build.BRAND.length() % 10) + (Build.CPU_ABI.length() % 10) + (Build.DEVICE.length() % 10) + (Build.MANUFACTURER.length() % 10) + (Build.MODEL.length() % 10) + (Build.PRODUCT.length() % 10);注意源码特意避开了DISPLAY、HOST、ID—— 这些字段会随系统升级或 OTA 而改变,一旦变化,同一台设备就会算出不同的 ID(源码注释说明)。
第 2 步:与 Serial 组合成 128 位 UUID
return new UUID(shortCode.hashCode(), serial.hashCode()).toString();短码的哈希作为高 64 位、序列号哈希作为低 64 位,两台设备只要机型不同或序列号不同,生成的设备唯一 ID 就不同。Demo 中可直接通过 IDFragment.java 的uniqueID页面查看结果,库的对外入口在 MobileHardWareHelper.java 的getUniqueIDInfo()。
三、Build 与 Serial 的取舍:谁扛唯一性,谁扛稳定
- Build 常量:优点是任何权限都能读、永不抛异常;缺点是同一机型的所有设备算出的短码完全一样,它只能回答"这是什么机型",回答不了"是哪一台"。
- Serial:出厂唯一,是唯一性的核心。MobileInfo 在 BuildInfo.java 中做了版本兼容——Android 8.0 及以上走
Build.getSerial(),之前用Build.SERIAL,并额外通过 native 层补充读取ro.boot.serialno、ro.serialno等系统属性作为兜底。
四、权限兼容与防碰撞:生产环境这样兜底
这里必须正视两个现实:
- Android 8.0 起 Serial 需要
READ_PHONE_STATE权限,普通应用拿不到时会返回"unknown"。此时第 2 步中所有同机型设备的serial.hashCode()相同 ——同机型设备会碰撞成同一个 ID。这也是 Demo 页描述标注 "invalid" 的原因。 - 模拟器上 Serial 常为
unknown或0,风险同样存在。
生产环境的防碰撞建议:
- 拿不到 Serial 时,降级改用
Build.FINGERPRINT(包含品牌、机型、编译版本,比短码信息量大得多)拼接Settings.Secure.ANDROID_ID; - 再兜底则用"应用安装时自生成的随机 UUID 并持久化到本地",保证换机可识别、重装可追踪;
- 上线后监测 ID 分布,若同一 ID 关联设备数异常升高,即可判定发生了碰撞。
五、合规提示:设备指纹不是想采就采
📌 采集 Serial、Android ID 属于个人信息收集,请遵循《信息安全技术 移动互联网应用(App)收集个人信息基本规范》,做到最小化采集、弹窗告知、可拒绝(项目 README 开头也特别强调了这一点)。设备指纹用得好是防作弊利器,用得激进则是隐私合规红线。
写在最后
MobileInfo 这套"Build 短码 + Serial → UUID"的设备指纹生成方式,胜在零依赖、可离线、确定性强,非常适合学习设备唯一 ID 的构造思路;但 Serial 的权限限制决定了它不能作为生产方案的唯一支柱。理解了 Build 与 Serial 各自的角色,你才能组合出真正不碰撞的设备指纹。
【免费下载链接】MobileInfo【Android】Hardware Information. For detailed network diagnosis, please refer to【HttpInfo】项目地址: https://gitcode.com/gh_mirrors/mo/MobileInfo
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
