0%

APK Signature Scheme v2

Android 7.0 introduces APK Signature Scheme v2, a new app-signing scheme that offers faster app install times and more protection against unauthorized alterations to APK files. By default, Android Studio 2.2 and the Android Plugin for Gradle 2.2 sign your app using both APK Signature Scheme v2 and the traditional signing scheme, which uses JAR signing.

Android Signature V2 Scheme签名下的新一代渠道包打包神器
新一代开源Android渠道包生成工具Walle
美团Android自动化之旅—生成渠道包

Although we recommend applying APK Signature Scheme v2 to your app, this new scheme is not mandatory. If your app doesn’t build properly when using APK Signature Scheme v2, you can disable the new scheme. The disabling process causes Android Studio 2.2 and the Android Plugin for Gradle 2.2 to sign your app using only the traditional signing scheme. To sign with only the traditional scheme, open the module-level build.gradle file, then add the line v2SigningEnabled false to your release signing configuration:

1
2
3
4
5
6
7
8
9
10
11
12
13
android {
...
defaultConfig { ... }
signingConfigs {
release {
storeFile file("myreleasekey.keystore")
storePassword "password"
keyAlias "MyReleaseKey"
keyPassword "password"
v2SigningEnabled false
}
}
}

Caution: If you sign your app using APK Signature Scheme v2 and make further changes to the app, the app’s signature is invalidated. For this reason, use tools such as zipalign before signing your app using APK Signature Scheme v2, not after.

For more information, read the Android Studio documents that describe how to sign an app in Android Studio and how to configure the build file for signing apps using the Android Plugin for Gradle.

APK Signature Scheme v2

背景知识

老司机要开车了,你准备好了吗?
Android Studio 2.2 最近发布了许多新增功能和改进功能(详情请戳这里)
对于Android开发者来说,我想大家应该都知道,在 Android 7.0 Nougat 中引入了全新的 APK Signature Scheme v2,所以我大致总结一下,我们开发者需要了解的新的打包的方式和签名步骤。

基本信息

用于验证 APK 完整性的 APK 加密签名现在直接位于 ZIP Central Directory 前面。
在 v1 中,签名通过整个 APK 文件的二进制内容进行计算并验证,而不是通过归档中每个文件的已解压文件内容。
可同时通过 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签名:
    1
    2
    v1SigningEnabled false
    v2SigningEnabled false

总结

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

欢迎关注我的其它发布渠道