Safe Haven 中文文档 下载 App

Safe Haven 重复版本与 APK 哈希,三种自动拒绝规则

Safe Haven 的三个去重关卡

一个 APK 进入 Safe Haven 扫描管线后,会按顺序过三个去重检查。任何一个触发,直接进 rejected 状态:

关卡检查什么触发后果
SHA-256 重复这个 APK 的哈希和数据库里已有的某个 live 版本完全一样拒绝
versionCode 重复APK manifest 里的 versionCode 和同包名下某个 live 版本的 versionCode 相同拒绝
包名不匹配APK manifest 里的包名和应用条目记录的包名不一样拒绝

这三个关卡是 Safe Haven 最基础的去重逻辑,机器可判定、不需要人工介入。

SHA-256 重复是什么意思

你上传了一个 APK,扫描管线算它的 SHA-256,发现数据库里同一个包名下已经有某个 live 版本的 SHA-256 完全相同 → 直接拒绝。

SHA-256 是"碰撞概率可以忽略"的强哈希——两个不同 APK 文件产生相同 SHA-256 的概率接近零。所以这个检查几乎 100% 准确。

可能误触发的场景:

versionCode 重复是什么意思

从 APK manifest 里真实提取 versionCode(安卓内部版本号,整数),和数据库里同包名下所有 live 版本的 versionCode 做比对。有一样的 → 拒绝。

这个检查只比 versionCode(整数),不比 versionName(字符串)。所以:

manifest reconciliation:扫描管线会自动用 manifest 里提取的 versionCode 覆盖开发者可能填错的值。但如果覆盖后发现和已有版本撞了 → 还是被拒。

包名不匹配是什么意思

从 APK manifest 里提取真实包名,和应用条目记录的包名比对。不一样 → 拒绝。

这个检查防的是:

三种重复的实际含义

开发者遇到 rejected 状态时,Safe Haven 会记录触发了哪个规则:

触发规则含义修正方法
APK SHA-256 重复你上传的 APK 和已有版本一模一样不要重复上传,确实有新版本就换一个 APK
versionCode 重复新版本和已有版本的内部版本号一样改 manifest 里的 versionCode 再重新构建
包名不匹配APK 和条目不是同一个应用检查你是不是传错了条目

retired 状态:live 之后的淘汰

除了 pending_upload → pending_scan → scanning → pending_review → live 的正向路径,还有一个 live → retired 的回退路径。触发条件通常在复扫管线里:

retired 不是删除——数据库记录还在,只是从全局索引里移除。客户端下次同步时会删除对应的版本记录。

版本记录里怎么区分重复

进入公开目录的应用,在详情页的版本历史区能看到:

如果你注意到"两个版本的 SHA-256 一样",说明那个重复版本被 retired 处理掉了——你可能只看到一个(不是两个),因为版本记录里只保留不重复的版本。

为什么要三重去重

三个关卡各有侧重:

任何一个能过但另一个通不过的场景都是有意义的边界情况,三个一起查是最保险的做法。