一、APK 签名的本质作用Android 要求所有 APK 必须经过数字签名才能安装。签名的核心作用有三点身份认证证明 APK 来自同一个开发者packageName 决定是什么应用签名决定是谁发布的。完整性保护APK 被篡改后签名校验会失败。覆盖安装判定同一 packageName 的更新必须签名一致才能覆盖安装。二、V1 签名JAR Signing原理V1 签名基于传统的JAR 文件签名RFC 1991。它将 APK 视为一个 ZIP 压缩包对其中每个文件单独计算摘要签名信息存放在 META-INF/ 目录下META-INF/ ├── MANIFEST.MF ← 记录每个文件的 SHA-1/SHA-256 摘要 ├── CERT.SF ← 对 MANIFEST.MF 的摘要和签名 └── CERT.RSA ← 开发者证书 对 CERT.SF 的签名校验流程用公钥验证 CERT.RSA 中的签名确认 CERT.SF 未被篡改。用 CERT.SF 验证 MANIFEST.MF 的完整性。逐个比对 APK 中每个文件的摘要与 MANIFEST.MF 中记录的是否一致。致命缺陷不保护 ZIP 元数据Central Directory、EOCDZIP 文件结尾标记等 ZIP 结构不受保护。攻击面大攻击者可以修改 ZIP 结构如插入文件、调整偏移量而不破坏签名。性能差安装时需要解压 APK逐个文件验证时间复杂度 O(n)。三、V2 签名APK Signature Scheme v2原理Android 7.0API 24引入 V2 签名核心改进是不再把 APK 当 ZIP 逐个文件签而是把 APK 当整体二进制 blob 签。V2 在 APK 文件中插入了一个APK Signing Block位于 ZIP 数据区和 Central Directory 之间[ZIP 条目数据区] ↓ [APK Signing Block] ← 新增区域存放 V2/V3 签名数据 ↓ [ZIP Central Directory] ↓ [ZIP EOCD]签名时将 APK 内容按 1MB 分块计算 SHA-256 摘要再对这些摘要集合进行签名。签名块本身不参与哈希计算。核心优势优势说明全文件保护除签名块外的所有字节包括 ZIP 元数据都被保护任何修改都会破坏签名防 ZIP 攻击阻止了 V1 时代的修改 ZIP 结构不破坏签名漏洞安装更快无需解压直接校验整包哈希速度提升 3-5 倍前向兼容签名块使用 ID-Value 对结构支持未来扩展如 V3、V4兼容性Android 7.0 优先校验 V2。Android 7.0 以下不识别 V2如果 APK 只有 V2 签名老设备无法安装。因此实际工程中通常V1 V2 共存。四、V3 签名APK Signature Scheme v3原理Android 9.0API 28引入 V3在V2 的 APK Signing Block 结构基础上增加了密钥轮换Key Rotation能力。V3 的核心数据结构是proof-of-rotation签名谱系一条旧证书 → 新证书的单链用旧私钥对新证书进行签名证明新证书是旧证书的合法继承者。旧证书 A 的私钥 ──签名──→ 新证书 B ↑ ↓ └──────── proof-of-rotation ──┘解决的核心痛点在 V1/V2 时代应用一旦发布签名证书终身不能更换。如果私钥泄露、过期或算法被破解开发者只能放弃旧应用发布新包名损失用户祈祷私钥没泄露V3 允许开发者安全地更换签名密钥系统通过验证 proof-of-rotation 链确认新密钥签名的 APK 是旧密钥应用的合法更新。限制不支持多签者Google Play 也不发布多证书签名的应用。是单链轮换不是任意图结构。五、V4 签名APK Signature Scheme v4原理Android 11API 30引入 V4是一种增量签名机制用于支持 ADB 的流式/增量安装Streaming Install。V4 的签名信息不嵌入 APK 本体而是生成一个独立的 .apk.idsig 文件app.apk ← APK 本体含 V2/V3 签名 app.apk.idsig ← V4 签名文件基于 Merkle 哈希树核心用途ADB 增量安装adb install --incremental只传输差异部分大幅加速大 APK 的安装。必须与 V2 或 V3 配合使用不能单独使用。设备/环境不支持 V4 时自动回退到普通安装。六、系统校验优先级Android 9.0 的系统安装器按以下优先级校验签名① 优先校验 V3 → 若有效直接通过 ② 回退到 V2 → V3 不存在/无效时 ③ 回退到 V1 → V2 不存在/无效时 ④ 全部失败 → 拒绝安装七、核心对比总览签名方案引入版本签名位置校验范围核心优势兼容性V1 (JAR)Android 1.0META-INF/*.RSA单个文件兼容所有版本全版本V2 (APK)Android 7.0APK Signing Block整包除签名块安全性性能7.0V3 (APK)Android 9.0APK Signing Block整包 证书链密钥轮换9.0V4 (增量)Android 11.apk.idsig文件Merkle 树哈希流式安装11 (辅助)八、工程实践建议Gradle 配置android{signingConfigs{release{v1SigningEnabledtrue// 兼容 Android 6.0 以下v2SigningEnabledtrue// 必须启用现代安全基石v3SigningEnabledtrue// 如需密钥轮换v4SigningEnabledfalse// 仅开发调试/大包分发时开启}}}关键注意事项签名顺序必须先 zipalign再 apksigner。签名后禁止再修改 APK否则 V2/V3 签名会失效。minSdk 24必须保留 V1否则老设备无法安装。密钥轮换规划提前使用 apksigner rotate 生成 proof-of-rotation 谱系文件。排查签名不要用 keytool -jarfile只能识别 V1应使用apksigner verify-v--print-certs app.apk九、总结V1 逐页签合同易被插入假页V2 把整个合同封进玻璃盒任何拆封都被发现V3 玻璃盒 可以指定继承人安全换钥匙V4 给玻璃盒配了个快递单增量安装不拆盒。