发布人:Google Android 开发顾问 Wojtek Kaliciński
欢迎关注『谷歌开发者』官方微信公众号,与谷歌一起创造未来!
Android Studio 2.2 最近发布了许多新增功能和改进功能(详情请戳这里)。在 Android Gradle 插件中,由于部分变更发生在后台,因此很容易被忽略,如最近重新设计的集成 APK 打包和签署步骤。
1. APK Signature Scheme v2
在 Android 7.0 Nougat 中引入了全新的 APK Signature Scheme v2 后,我们决定重新设计汇编 APK 在 Android Gradle 插件中的工作方式。您可以在文档中阅读有关 v2 签名的所有底层技术信息,下面只是简要介绍您作为 Android 应用开发者所需了解的信息:
用于验证 APK 完整性的 APK 加密签名现在直接位于 ZIP Central Directory 前面。
在 v1 中,签名通过整个 APK 文件的二进制内容进行计算并验证,而不是通过归档中每个文件的已解压文件内容。
可同时通过 v1 和 v2 签名对 APK 进行签署,以使其仍能向后兼容以前的 Android 版本。
为什么针对 Android 的 APK 验证方式做出此变更?首先是为了增强这个全新的签名格式的安全性和扩展性,其次是为了改进性能,新的签名可大幅缩短在设备上进行验证的时间(不需要费时地解压缩),从而加快应用安装速度。
不过,这个全新的签名架构对 APK 创建进程有新的限制。由于在 v1 中仅验证未解压的文件内容,因此,在 APK 签署后可进行许多修改 - 可以移动甚至重新压缩文件。事实上,编译过程中要用到的 zipalign 工具就是这么做的,它用于根据正确的字节限制调整 ZIP 条目,以改进运行时性能。
由于 v2 签名将验证归档中的所有字节,而不是单个 ZIP 条目,因此,在签署后无法再运行 zipalign。正因如此,现在,在编译过程中,我们将压缩、调整和签署合并成一步完成。
在编译过程中,如有任何自定义任务篡改 APK 文件或对其进行后处理(无论以任何方式),请务必停用它们,否则,v2 签名会有作废的风险,从而导致您的 APK 与 Android 7.0 及更高版本不兼容。
如果您选择手动签署和调整(例如,通过命令行),我们在 Android SDK 中提供了一个名为 apksigner 的新工具,该工具可同时提供 v1 和 v2 APK 签署与验证。请注意,如果您使用 v2 签名,则在运行 apksigner之前,必须先运行 zipalign。还要记住,来自 JDK 的 jarsigner 工具与 Android v2 签名不兼容,因此,如果您要保留 v2 签名,您不能用它来重新签署 APK。
在使用 Android Gradle 插件进行编译时,如果您要停用添加 v1 或 v2 签名功能,您可以在 build.gradle 中将以下行添加到 signingConfig 部分:
v1SigningEnabled false
v2SigningEnabled false
注:默认情况下,Android Gradle 插件 2.2 同时启用这两个签署架构。
2. 发行编译版本,减小 APK 大小
在重新设计打包程序时,我们借此机会对发布的 APK 大小进行了一些优化,从而实现更快的下载,减小了 Play 商店上的增量更新大小并减少设备空间的浪费。以下是我们做出的一些变更:
现在,对归档中的文件进行了排序,以最大程度减少 APK 编译之间的差异。
所有文件时间戳和元数据均清零。
针对所有文件并行选择级别 6 和级别 9 压缩,并使用其中最优的压缩,例如,就压缩包大小而言,级别 9 压缩作用不大,此时,选择级别 6 可实现更好的性能。
以未压缩的形式存储原生库,并在 APK 中调整页面。这样一来,可为 Android 6.0 Marshmallow 中的 android:extractNativeLibs="false" 选项提供支持,并允许应用使用较少的设备空间,同时在 Play 商店上产生较小的更新。
使用 Zopfli 压缩并不能更好地支持 Play 商店更新算法。因此,不建议您使用 Zopfli 重新压缩您的 APK。您仍可以并且我们也建议您预优化单个资源,如项目中的 PNG 文件。
这些变更有助于确保您的版本尽可能精简,以便即使网络连接较慢或设备性能不佳,用户仍可以下载和更新您的应用。但对于调试版本会怎样呢?
3. 调试版本,加快安装速度
开发应用时,您想要实现快速的迭代周期 - 在连接的设备或模拟器上更改代码、进行编译并部署。
自 Android Studio 2.0 开始,我们就一直致力于尽可能加快所有步骤。借助 Instant Run,我们现在可在运行时只更新更改的代码和资源,而新的模拟器可提供多处理器支持和更快的 ADB 速度,从而可以加快 APK 传输和安装。编译改进可进一步缩短所需的时间,在 Android Studio 2.2 中,我们针对调试版本引入了增量打包和并行压缩。通过结合其他功能,如针对目标设备密度和 ABI 有选择性地打包资源,可加快您的开发速度。
注意:为 Instant Run 创建或通过调用调试版本创建的 APK 文件不能在 Play 商店上分发!它们包含用于 Instant Run 的其他仪器代码,但缺少除开始编译时连接的设备配置资源之外的其他设备配置资源。
请确保您仅分发可使用 Android Studio Generate Signed APK 命令或 assembleRelease Gradle 任务创建的 APK 的发行版本。