从零验证 Android 设备完整性:Play Integrity API Checker 快速上手指南 📅 2026/8/17 17:17:43 从零验证 Android 设备完整性Play Integrity API Checker 快速上手指南【免费下载链接】play-integrity-checker-appGet info about your Device Integrity through the Play Intergrity API项目地址: https://gitcode.com/gh_mirrors/pl/play-integrity-checker-app先交代一个背景如果你的应用曾经被模拟器批量刷过注册量或者被修改版 ROM 上的用户薅过羊毛你一定迫切想知道对面这台设备到底值不值得信任。Play Integrity API Checker 就是为此而生的一款开源 Android 应用——它把 Google Play Integrity API 的判定结果翻译成四项一眼就能看懂的体检指标让你在几分钟内摸清任何一台 Android 设备的真实安全状态。一、故事的起点我被模拟器刷量逼疯了事情发生在一个普通的周一。运营同事跑过来告诉我今天的新增用户里有将近三分之一是同一批神秘访客注册时间精确到秒设备型号清一色是某款早已停产的机型。不用猜这是有人开了个模拟器农场正在批量薅我们的新手福利。我当时的直觉是必须在服务端把这些假设备拦下来。但翻遍方案后发现IP 黑名单容易误伤设备指纹可以伪造光靠应用内自检更是形同虚设——攻击者只要反编译改两行代码检查逻辑就作废了。直到我接触到 Google 官方的 Play Integrity API事情才有了转机。它把设备可不可信的判断放到 Google 自己的服务里完成客户端和攻击者都无法篡改判定过程。但问题也随之而来官方 API 用起来并不轻量你需要搭服务器、写客户端、解析一堆 JSON 字段还没开始就劝退了不少人。正是在这个节骨眼上我找到了 Play Integrity API Checker——一个把整套流程打包成一键检测的开源应用。二、先看懂四张体检单再谈怎么用我把这个工具想象成带手机去做体检。Google 会针对你的设备出四份检查报告每一项对应一个判定词基本完整性MEETS_BASIC_INTEGRITY相当于基础生命体征检查设备有没有被 root、有没有跑非官方固件设备完整性MEETS_DEVICE_INTEGRITY确认系统是否通过官方认证是否存在完整性保护缺失强完整性MEETS_STRONG_INTEGRITY动用硬件级信任根专门揪出深度篡改和刷机痕迹虚拟完整性MEETS_VIRTUAL_INTEGRITY识别模拟器和虚拟化环境防刷量、防作弊都靠它。而 Play Integrity API Checker 做的事就是把这几行冷冰冰的判定字符串换成界面上直观的通过 / 失败 / 未知三色图标。打开应用点击 Check 按钮四项结果在几秒内全部点亮全程不需要写一行代码。界面布局可以在app/src/main/res/layout/activity_main.xml里看到四个指标图标由 ConstraintLayout 的 Flow 组件自动排列虚拟完整性那一项还会根据结果动态显隐——细节做得很贴心。三、揭开幕布一次完整性检查的完整旅程只看结果当然不够搞懂它内部怎么流转你才能判断能不能信任它。我在app/src/main/java/gr/nikolasspyr/integritycheck/MainActivity.java里把整条链路捋了一遍大致是这样生成随机数 nonce每次点击检查App 都会生成一段 50 位的随机字符串。它就像餐厅的叫号牌确保这次请求是新鲜的防止旧 token 被重放攻击。向 Google 申请完整性令牌App 通过IntegrityManagerFactory拿到 token这个动作发生在设备本地但真正的判定并不在这里。把 token 交给你的服务器App 用 OkHttp 发起一个 GET 请求把 token 转发到你自己的后端BuildConfig.API_URL /api/check?token...。服务器解密并验证这一步是安全的关键。只有你的服务器持有解密密钥能把 token 还原成 Google 的判定结果。解析并展示App 收到 JSON 后从deviceIntegrity.deviceRecognitionVerdict字段里提取四个判定词更新界面图标。其中最能体现思路的是下面这两段核心代码private String generateNonce() { int length 50; String nonce ; String allowed ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789; for (int i 0; i length; i) { nonce nonce.concat(String.valueOf(allowed.charAt( (int) Math.floor(Math.random() * allowed.length())))); } return nonce; }private Integer[] parseValues(String integrity) { return new Integer[]{ integrity.contains(MEETS_BASIC_INTEGRITY) ? 1 : 0, integrity.contains(MEETS_DEVICE_INTEGRITY) ? 1 : 0, integrity.contains(MEETS_STRONG_INTEGRITY) ? 1 : 0, integrity.contains(MEETS_VIRTUAL_INTEGRITY) ? 1 : -1 }; }第一段负责生成一次性随机数第二段负责把判定字符串翻译成 1通过、0失败、-1未知三种状态。逻辑都不复杂但组合在一起就构成了一个完整的设备完整性检测闭环。四、三步完成环境部署把检查器跑起来光看不练没意思。这个项目在本地跑起来其实很快我按下面三步操作前后不到十分钟就看到了检测结果。第一步准备三样东西。首先是配套的 Play Integrity Checker Server负责解密 token 的服务端其次是 Google Cloud 项目配置需要在 Play Console 里把应用与云项目关联并开启对应判定最后最好从 Play Store 安装应用——这一点非常重要原因我放在后面踩坑篇细说。第二步配置服务器地址。克隆代码后在项目根目录的local.properties文件里加上一行API_URLhttps://your-server-url.com这个值会被app/build.gradle里的buildConfigField读取编译期就写死进应用运行时代码里通过BuildConfig.API_URL访问。第三步构建安装。在项目根目录执行git clone https://gitcode.com/gh_mirrors/pl/play-integrity-checker-app cd play-integrity-checker-app ./gradlew assembleDebug构建产物是标准的 debug APK装到手机上就能用。整个项目的技术栈很干净Java 17、minSdk 21、targetSdk 36依赖只有 AppCompat、Material、ConstraintLayout、Play Integrity SDK 和 OkHttp 几项没有多余的历史包袱。五、复盘手记我踩过的五个坑真正让我长记性的是接下来这几个坑。如果你也打算上手建议提前绕行。坑一侧载安装拿不到基础判定。我第一次是直接把 APK 拖进模拟器装的结果 BASIC 和 STRONG 两项永远显示失败。查了 README 才明白Google 要求应用必须从 Play Store 安装侧载的包无法获得完整判定结果。这不是代码问题是官方限制调试时心里要有数。坑二错误码让人一头雾水。首次接入时我遇到了API_NOT_AVAILABLE当时完全不知道该怎么处理。后来翻MainActivity.java才发现作者给 18 种错误码都配了错误码 原因 解决方案三段式提示。比如PLAY_STORE_NOT_FOUND会提示尝试安装官方版 Play StoreNETWORK_ERROR会提示检查网络连接。排查问题时这个细节能省下大量查文档的时间。坑三服务器返回非 200 却不自知。这个 App 对服务器返回做了严格检查非成功状态码会直接弹窗报错。我一开始后端接口写错了路径返回 404界面就一直报API returned: 404排查后才定位到是路由问题。所以如果你自测报错优先检查后端接口是否正确。坑四nonce 长度有讲究。Google 官方要求 nonce 最短 16 字节太长或不是 Base64 编码都会报错。项目里用了 50 位随机串完全满足要求但如果你自己改造别把这段代码随手缩短。坑五别把演示逻辑直接搬进生产。这是 README 里反复强调的一点也是我最想提醒你的这个 App 会把完整的 JSON 判定结果原样返回给客户端展示这在检查工具场景没问题但在生产环境里是反模式——攻击者可以绕过 App 直接伪装请求。正确做法是服务器只回一个允许/拒绝的布尔值而不是把底层判定细节全盘托出。六、从查着玩到上线用的正确姿势如果你看完前面内容准备把它集成进自己的产品这里有几条来自实战的改造建议服务端只回 yes/no判定逻辑全部留在服务器客户端拿到的只有通过或拒绝即使 App 被反编译也无利可图把完整性校验和登录绑定在用户登录时一起发起完整性检查而不是单独暴露一个检查接口这样攻击者没有机会跳过校验别在客户端存任何密钥解密密钥、云项目编号这类敏感信息一律放在服务端客户端只需要持有 token 本身。说白了这个开源项目最大的价值是帮你把 Google 官方 API 的接入流程、错误码映射和判定解析全部趟了一遍。你可以在它的基础上做减法——砍掉展示层只保留校验逻辑也可以做加法——把它接进自己的风控链路在关键操作支付、提现、签到前做一次设备可信度评估。七、下一步行动清单给你一份可以直接照做的清单体验优先先装一个别人部署好的版本或者自己跑一遍 debug 包在真机和模拟器上各测一次直观感受四类判定的差异补齐服务端把 Play Integrity Checker Server 部署到支持 HTTPS 的环境配好 Google Cloud 项目跑通全链路按上文三步完成从 App 到服务器的完整调用故意用模拟器测一次确认虚拟完整性判定生效生产化改造把返回完整 JSON改成返回布尔结果并将校验挂到登录或支付流程上持续监控上线后关注接口调用成功率与错误码分布TOO_MANY_REQUESTS这类频控错误多了就该考虑加缓存或限流了。设备完整性检测不是银弹但它是你安全防线里不可或缺的一环。有了 Play Integrity API Checker 这类工具至少你不需要再从零造轮子——把 Google 的能力用好把判定逻辑落在服务端剩下的交给时间和数据来验证。希望这篇文章能帮你少踩几个坑更快地把设备安全这件事真正落地。【免费下载链接】play-integrity-checker-appGet info about your Device Integrity through the Play Intergrity API项目地址: https://gitcode.com/gh_mirrors/pl/play-integrity-checker-app创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考