事情起因:接到客服反馈说有一个用户无法安装我们的 APP,客服记录了用户的手机型号(华为 Mate 8 联通版)反馈给研发。研发拿着线上的安装包在云真机上选择对应机型进行测试,发现果然无法安装,下载的日志也没有多大的参考价值,Google 了很久没有找到解决办法。
参数 | 华为 Mate 8 联通版 |
---|---|
型号 | HUAWEI NXT-DL00 |
版本 | 7.0 |
分辨率 | 1920x1080 |
上市时间 | 2015-11 |
APP 无法安装到华为 Mate8 引发的思考
开始以为是打包过程中文件发生损坏导致的,于是又重新进行打包在云真机上进行测试,发现可以顺利安装。但是无法重现客户的安装问题。后来注意到版本是 7.0 的系统,才和签名方式 V2(Full APK Signature) 联系起来,Android 7.0 引入的 V2 签名方案是禁止对应用进行进一步更改的,这才记起来我们的应用在打包过程中勾选了 V2 选项,并且在签名完毕后习惯性的对 APK 进行了 zipalign 优化。然而,正是这个签名后的优化导致了签名无效,最终在用户 7.0 的系统上无法安装。那为什么我们后来打包的 APK 可以在云真机上顺利安装呢?因为是作为测试用,就没有进行 zipalign 优化。
APK signature scheme v2
Android 7.0 引入一项新的应用签名方案 APK Signature Scheme v2,它能提供更快的应用安装时间和更多针对未授权 APK 文件更改的保护。在默认情况下,Android Studio 2.2 和 Android Plugin for Gradle 2.2 会使用 APK Signature Scheme v2 和传统签名方案来签署您的应用。
虽然我们建议您对您的应用采用 APK Signature Scheme v2,但这项新方案并非强制性的。如果您的应用在使用 APK Signature Scheme v2 时不能正确开发,您可以停用这项新方案。禁用过程会导致 Android Studio 2.2 和 Android Plugin for Gradle 2.2 仅使用传统签名方案来签署您的应用。要仅用传统方案签署,打开模块级 build.gradle 文件,然后将行 v2SigningEnabled false 添加到您的版本签名配置中:
1 | android { |
注意:如果您使用 APK Signature Scheme v2 签署您的应用,并对应用进行了进一步更改,则应用的签名将无效。出于这个原因,请在使用 APK Signature Scheme v2 签署您的应用之前、而非之后使用 zipalign 等工具。这个提示可以理解为:如果应用在签名的过程中勾选了 V2(Full APK Signature) 选项,生成的签名包如果再进行 zipalign 优化会导致签名无效,所以应该在签名前对应用进行 zipalign 优化,开发者需要在模块级 build.gradle 文件中将 zipAlignEnabled 设置为 true。
1 | android { |