注意:如果使用的是AndroidStudio支持的多渠道打包方式的话,将不会出现此问题。
官方说明
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 添加到您的版本签名配置中:
android {
...
defaultConfig { ... }
signingConfigs {
release {
storeFile file("myreleasekey.keystore")
storePassword "password"
keyAlias "MyReleaseKey"
keyPassword "password"
v2SigningEnabled false
}
}
}
注意:如果您使用 APK Signature Scheme v2 签署您的应用,并对应用进行了进一步更改,则应用的签名将无效。出于这个原因,请在使用 APK Signature Scheme v2 签署您的应用之前、而非之后使用 zipalign 等工具。
场景
当我们需要多渠道打包时 且是使用了V2签名的话 将有可能出现 包将无法在Android7.0上进行安装 并提示错误为:INSTALL_PARSE_FAILED_NO_CERTIFICATES
实质原因是 在签完名后进行多渠道打包(会修改原先的包)造成了在安装的时候签名验证时 提示验证失败 无法安装。
简述V2签名原理:
签名将在图中粉色位置创建APKSigningBlock文件,保存签名信息。
当用户在Android7.0安装的时候 如果发现签完名后的apk包被修改过 则判断为验证失败 将无法安装。
多渠道打包方式
修改后重新打包或签名的,例如在AndroidMainfest里面添加mata-data等(此处使用的就是AndroidStudio直接支持的方式)
修改后不需要重新签名,主要有两种: (自行编写程序代码 对于APK文件直接修改)
直接把apk包看成一个zip包,然后在zip包的注释段添加对应的渠道信息
直接把apk包看成一个zip包,然后利用相关命令在META-INF内注入${channel}.txt 文件
问题详情与解决办法
当我们使用第二种打包方式的时候,在V1签名下是不会出现问题的。
但是如果使用的是V2签名就会出现这些问题(V2验证更加严格)
解决办法:
使用第一种打包方式
如果使用第二种打包方式的话 就可以使用 美团新出的多渠道打包工具Walle
新一代开源Android渠道包生成工具Walle