为什么要签名:
通过代码签名,开发者可以标识应用创作者并更新其应用,而无需创建复杂的接口和权限。当应用(APK 文件)安装到 Android 设备上时,软件包管理器会验证 APK 是否已经过适当签名,如果该证书(或更准确地说,证书中的公钥)与为设备上的任何其他 APK 签名时使用的密钥一致,那么这个新 APK 可以选择在清单中指定它将与其他以类似方式签名的 APK 共用一个 UID。在 Android 上,应用签名是将应用放入其应用沙盒的第一步。已签名的应用证书定义了哪个用户 ID 与哪个应用相关联;不同的应用要以不同的用户 ID 运行。应用签名可确保一个应用无法访问任何其他应用,通过明确定义的 IPC 进行访问时除外。
Android 平台提供了一个可扩展的 DRM 框架,以便应用根据与受版权保护的内容相关的许可限制条件来管理这些内容。DRM 框架支持多种 DRM 方案;设备具体支持哪些 DRM 方案由设备制造商决定。
DRM Framework API:通过 Android 应用框架提供给应用,并通过适用于标准应用的 Dalvik VM 运行。
原生代码 DRM 管理器:用于实现 DRM 框架,并为 DRM 插件(代理)提供接口,以便处理各种 DRM 方案的版权管理和解密操作。
Android 现在已经支持三种应用签名方案:
v1 方案:基于 JAR 签名。
v2 方案:APK 签名方案 v2,在 Android 7.0 引入。
v3 方案:APK 签名方案v3,在 Android 9.0 引入。
v4 方案:APK 签名方案v4,在Android11.0引入。
v1 → v2 是颠覆性的,为了解决 JAR 签名方案的安全性问题,对开发者影响最大的,就是渠道签署的问题。在当下这个大环境下,我们想让不同渠道、市场的安装包有所区别,携带渠道的唯一标识,这就是我们俗称的渠道包。好在各大厂都开源了自己的签渠道方案,例如:Walle(美团)、VasDolly(腾讯)都是非常优秀的方案。
v2 → v3 方案,其实结构上并没有太大的调整,可以理解为 v2 签名方案的升级版,有一些资料也把它称之为 v2+ 方案。因为这种签名方案的升级,就是向下兼容的,所以只要使用得当,这个过程对开发者是透明的。
APK 签名方案 v2 :
是一种全文件签名方案,该方案能够发现对 APK 的受保护部分进行的所有更改,从而有助于加快验证速度并增强完整性保证。
使用 APK 签名方案 v2 进行签名时,会在 APK 文件中插入一个 APK 签名分块,该分块位于“ZIP 中央目录”部分之前并紧邻该部分。在“APK 签名分块”内,v2 签名和签名者身份信息会存储在 APK 签名方案 v2 分块中。
APK 签名方案 v2 是在 Android 7.0 (Nougat) 中引入的。为了使 APK 可在 Android 6.0 (Marshmallow) 及更低版本的设备上安装,应先使用 JAR 签名功能对 APK 进行签名,然后再使用 v2 方案对其进行签名。
APK 签名方案 v3:
Android 9 支持 APK 密钥轮替,这使应用能够在 APK 更新过程中更改其签名密钥。为了实现轮替,APK 必须指示新旧签名密钥之间的信任级别。为了支持密钥轮替,我们将 APK 签名方案从 v2 更新为 v3,以允许使用新旧密钥。v3 在 APK 签名分块中添加了有关受支持的 SDK 版本和 proof-of-rotation 结构的信息。
v3 方案的设计与 v2 方案非常相似,它们采用相同的常规格式,并支持相同的签名算法 ID、密钥大小和 EC 曲线。
但是,v3 方案增添了有关受支持的 SDK 版本和 proof-of-rotation 结构的信息。
APK 签名方案 v4:
Android 11 通过 APK 签名方案 v4 支持与流式传输兼容的签名方案。v4 签名基于根据 APK 的所有字节计算得出的 Merkle 哈希树。它完全遵循 fs-verity 哈希树的结构(例如,对盐进行零填充,以及对最后一个分块进行零填充。)Android 11 将签名存储在单独的 <apk name>.apk.idsig
文件中。v4 签名需要 v2 或 v3 签名作为补充。
运行 adb install --incremental 命令时,adb 会要求 .apk.idsig 文件存在于 .apk 旁边,默认情况下,它还会使用 .idsig 文件尝试进行增量安装;如果此文件缺失或无效,该命令会回退到常规安装。