APK Signature Scheme v2

介绍了Android 7.0引入的APKSignatureSchemev2,包括其与v1的区别、安全性和性能改进,以及对开发者的影响和解决方案。

APK Signature Scheme v2

对于Android开发者来说,我想大家应该都知道,在 Android 7.0 Nougat 中引入了全新的 APK Signature Scheme v2,所以我大致总结一下,我们开发者需要了解的新的打包的方式和签名步骤。

基本信息

  1. 用于验证 APK 完整性的 APK 加密签名现在直接位于 ZIP Central Directory 前面。
  2. 在 v1 中,签名通过整个 APK 文件的二进制内容进行计算并验证,而不是通过归档中每个文件的已解压文件内容。
  3. 可同时通过 v1 和 v2 签名对 APK 进行签署,以使其仍能向后兼容以前的 Android 版本。

原因

为什么谷歌要做这个事情呢?第一点毋庸置疑,肯定是处于安全性的考虑,之前的校验方式开发者可以在打包之后对apk做很多处理,第二为了性能考虑,安装校验的时候不需要再解压缩校验,从而提升安装速度(说句玩笑话,个人感觉没什么鸟用,也不需要关系)

那么问题来了

全新的签名给我们程序员带来的麻烦却很大:

  1. 由于在 v1 中仅验证未解压的文件内容,因此,在 APK 签署后可进行许多修改 - 可以移动甚至重新压缩文件。事实上,编译过程中要用到的 zipalign 工具就是这么做的,它用于根据正确的字节限制调整 ZIP 条目,以改进运行时性能。而且我们也可以利用这个东西,在打包之后修改META-INF目录下面的内容,或者修改Zip的注释来实现多渠道的打包,在v1签名中都可以校验通过
  2. v2 签名将验证归档中的所有字节,而不是单个 ZIP 条目,因此, 在签署后无法再运行 zipalign 。正因如此,现在,在编译过程中,Google将压缩、调整和签署合并成一步完成。
  3. 如有任何自定义任务篡改 APK 文件或对其进行后处理(无论以任何方式),那么v2 签名会有作废的风险,从而导致您的 APK 与 Android 7.0 及更高版本不兼容。

解决途径

  1. 如果我们选择手动签名(比如使用命令行)那么 Android SDK 中提供了一个名为 apksigner 的新工具,该工具可同时提供 v1 和 v2 APK 签署与验证。请注意,如果您使用 v2 签名,则在运行 apksigner之前,必须先运行 zipalign 。
  2. 来自 JDK 的 jarsigner 工具与 Android v2 签名不兼容,因此,如果您要保留 v2 签名,您不能用它来重新签署 APK。
  3. 如果我们还想使用之前的打包方式,不做修改,那么Google也是为我们提供了配置方法的用来关闭v2签名:
    v1SigningEnabled false
    v2SigningEnabled false

总结

虽然说现在Google有提供方法来关闭v2校验,但是我相信,一旦等到这种方式成熟之后,它会成为一个必需品,毕竟安全第一嘛,我们还是要接纳新事物的,好了,大概就讲这么多,有需要的可以看看。

转自:APK Signature Scheme v2

在解决 `base.apk is signed using APK Signature Scheme v2, but no such signature was found` 错误时,需要关注 APK 签名流程中的关键步骤和工具使用顺序。该错误通常出现在 APK 签署后进行了额外修改,导致签名失效,或者工具链对 APK Signature Scheme v2 的支持不足。 ### 常见原因及解决方案 #### 1. 签名前使用 zipalign 工具 确保在使用 APK Signature Scheme v2 签名之前完成对 APK 文件的优化操作,例如使用 `zipalign` 工具。如果在签名后使用 `zipalign`,会导致 APK签名信息被破坏,从而验证失败。 正确的流程应为: 1. 生成未签名APK 文件。 2. 使用 `zipalign` 对 APK 文件进行优化。 3. 使用 `apksigner` 或其他支持 v2 签名的工具进行签名。 ```bash zipalign -v -p 4 app-release-unsigned.apk app-release-aligned.apk apksigner sign --ks my-release-key.jks --out app-release-signed.apk app-release-aligned.apk ``` #### 2. 检查 APK 签名是否包含 v2 签名块 使用 `apksigner` 工具验证 APK 是否成功应用了 v2 签名方案: ```bash apksigner verify --verbose app-release-signed.apk ``` 输出结果中应包含类似以下信息: ``` Verifies Verified using v1 scheme (JAR signing): false Verified using v2 scheme (APK Signature Scheme v2): true ``` 如果输出中未显示 v2 验证成功,则说明签名过程中存在问题。 #### 3. 避免在签名后修改 APK 一旦 APK签名,任何后续的修改(如重打包、文件替换等)都会破坏签名信息,导致验证失败。请确保签名操作是构建流程中的最后一步。 #### 4. 使用兼容的工具链 确保使用的构建工具和签名工具支持 APK Signature Scheme v2。例如,使用 Android SDK Build-Tools 24.0.0 或更高版本,并确保 `apksigner` 和 ` jarsigner` 配置正确。 #### 5. 清理构建环境 有时,构建过程中残留的临时文件或缓存可能导致签名失败。建议清理构建目录并重执行签名流程: ```bash ./gradlew clean ./gradlew assembleRelease ``` #### 6. 检查构建配置 在 Gradle 构建脚本中确认签名配置是否正确: ```gradle android { ... signingConfigs { release { keyAlias 'my-key-alias' keyPassword 'key-password' storeFile file('my-release-key.jks') storePassword 'store-password' } } buildTypes { release { signingConfig signingConfigs.release ... } } } ``` 确保构建脚本中没有禁用 v2 签名方案。 #### 7. 使用 `keytool` 检查密钥信息 确保使用的密钥格式和密码正确,可通过 `keytool` 检查密钥别名和有效期: ```bash keytool -list -v -keystore my-release-key.jks ``` #### 8. 系统预置 APK 的特殊处理 如果目标设备需要将 APK 预置进系统镜像,请确保在系统构建流程中正确集成 APK 文件,避免对已签名 APK 进行额外修改。某些设备制造商可能对签名流程有额外要求,需参考具体平台文档。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值