应用签名

应用签名允许开发者识别应用的作者,并在无需创建复杂接口和权限的情况下更新其应用。在 Android 平台上运行的每个应用都必须由开发者签名。尝试安装未经签名的应用将被 Google Play 或 Android 设备上的包安装程序拒绝。

APK 签名方案

Android 支持四种应用签名方案:

  • v1 方案基于 JAR 签名。

  • v2 方案APK 签名方案 v2,在 Android 7.0 中引入。

  • v3 方案APK 签名方案 v3,在 Android 9 中引入。

  • v4 方案APK 签名方案 v4,在 Android 11 中引入。

为了向后兼容,APK 可以使用多个签名方案进行签名,以使应用在较新和较旧的 SDK 版本上都能运行。

JAR 签名 (v1 方案)

APK 签名从一开始就是 Android 的一部分。它基于签名 JAR

v1 签名不保护 APK 的某些部分,如 ZIP 元数据。APK 验证器需要处理大量不可信(尚未验证)的数据结构,然后丢弃未被签名覆盖的数据。此外,APK 验证器必须解压缩所有压缩条目,消耗更多时间和内存。

APK 签名方案 v2

APK 签名方案 v2 是一种全文件签名方案,通过检测 APK 受保护部分的任何更改来提高验证速度并加强完整性保证。

使用 APK 签名方案 v2 签名会在 APK 文件中 ZIP 中央目录部分之前插入一个 APK 签名块。在 APK 签名块内,v2 签名和签名者身份信息存储在 APK 签名方案 v2 块中。参见文档了解更多信息。

APK 签名方案 v3

Android 9 支持 APK 密钥轮换,这使得应用能够在 APK 更新过程中更改其签名密钥。为了使轮换实用,APK 必须指示新旧签名密钥之间的信任级别。v3 在 APK 签名块中添加了有关支持的 SDK 版本信息和轮换证明结构。参见文档了解更多信息。

APK 签名方案 v4

APK 签名方案 v4 是一种流兼容的签名方案。v4 基于在 APK 所有字节上计算的 Merkle 哈希树。它完全遵循 fs-verity 哈希树的结构。Android 11 将签名存储在单独的文件 <apk name>.apk.idsig 中。v4 签名需要补充的 v2 或 v3 签名。参见文档了解更多信息。

参考资料

最后更新于