在任意一台现代安卓上执行 adb shell getprop ro.build.fingerprint,会拿到类似这样的东西:
samsung/dm3qxxx/dm3q:14/UP1A.231005.007/S911BXXS5BXG2:user/release-keys
出厂时设定,烧进 system 分区,从你的银行 App 到 Play Store 到广告网络都会读。几乎所有「这机器是真的吗」的判断,都从解这段字符串开始。
6 段结构
照 AOSP 源码,它永远是这个样子:
<brand>/<product>/<device>:<release>/<id>/<incremental>:<type>/<tags>
6 段用 / 分隔,其中第 3 段和第 5 段里各塞了一个 :。每一段独立设置,编码不同的信息。
第 1 段:brand
来自 ro.product.brand。真三星 Galaxy 永远是小写的 samsung。大小写不对 —— Samsung、SAMSUNG、或者经典的 SAMUNG —— 是山寨机最稳定的破绽之一。想查任意机型该有的 brand 字符串,翻我们的品牌数据库。
第 2 段:product
产品代号。上面的 dm3qxxx 是三星给 Galaxy S23 Ultra 国际版起的名字。每个 SKU 各自一个:dm1qxxx 是 S23,dm2qxxx 是 S23+,dm3qxxx 是 S23 Ultra。地区也讲究 —— dm3qins 是印度版。
难伪造,因为这个代号必须跟内核的 device-tree 绑定对齐。拿 S23 ROM 刷到 S22 板子上,这段字段会跟硬件打架,早期启动就会崩溃。
第 3 段:device:release
两段用冒号连在一起。dm3q:14 意思是设备代号 dm3q 跑在安卓 14。设备代号通常是产品代号的短版本,标示内核为哪块硬件平台构建;release 是用户看到的版本号。
这里对不上就是诊断信号。设备代号 generic = 模拟器。release 从未在这个硬件上官方发布过 = 定制 ROM。
第 4 段:id
OEM 构建系统里的内部 build ID。三星用 UP1A.231005.007:UP 是 Android 14 的平台代号("Upside-down cake"),1A 是平台版本,231005 是构建日期(2023-10-05),007 是增量号。Pixel 同样的格式换字母:AP2A.240605.005 是 Pixel 上的 Android 14。
「固件是不是最新」这个问题,这段是最直接的答案 —— 拿它跟该机型最新官方版本 diff 一下。
第 5 段:incremental:type
两段用冒号连在一起。S911BXXS5BXG2:user 拆开是:
S911BXXS5BXG2—— 三星的增量字符串。S911B是机型前缀,XX是地区,S5是固件版本,BXG2编码构建日期。user—— 构建类型。任何量产机上都应该是user。看到userdebug或eng,眼前是开发机或定制 ROM。
第 6 段:tags
量产机上几乎永远是 release-keys。另外一个能看到的值是 test-keys,意思是这份 build 是用 AOSP 测试密钥签的,不是 OEM 的正式密钥。
发现定制 ROM 最实用的单字段。以 test-keys 结尾 → 手机 Root 了、或者刷了定制 ROM、或者两个都占。很多银行 App 直接拒绝启动。
什么能信、什么不能
Build.FINGERPRINT 存在 system 分区、由框架读取、对 App 只读。基本上。Magisk 的 DenyList 能钩住那次属性读取,给设置 App 一份、给你的银行 App 另一份。这也是为什么银行早就不再单靠这个字符串,而是叠上 Play Integrity、StrongBox 证明、硬件绑定密钥证明。
但对你自己 —— 买二手手机前想验一下 —— Build.FINGERPRINT 仍然是信噪比最高的字段之一。卖家没法预先钩住它,结构上的破绽只要你知道字段形状就一眼能看出来。
30 秒自查
拿出字符串,依次过:
- brand 小写? ✓
- product 代号跟宣称机型对上? 拿设备数据库查。
- device 代号在这台硬件上合理。 ✓
- release 版本官方在这台机型上发过。 ✓
- build ID 符合 OEM 已知格式。 ✓
- 构建类型是
user,不是userdebug。 ✓ - tags 是
release-keys,不是test-keys。 ✓
7 个格子。任何一个失败,这台机器就被改过 —— 付钱之前你需要知道被改了什么。