在android7.0中谷歌更新了签名的方式 APK signature scheme v2
https://developer.android.com/about/versions/nougat/android-7.0.html#apk_signature_v2
导致使用多渠道打包工具在7.0的设备上安装失败,所以要对多渠道打包的方式进行更新
1.使用多渠道打包配置
使用
packer-ng-plugin 工具来进行多渠道打包
按照地址中的说明来配置插件
在这我们使用gradle方式来打包
另外,使用gradle打包需要在文件中配置签名信息
signingConfigs {
release {
v2SigningEnabled false
//添加如下keystore信息
storeFile file("xxx")
storePassword "xxx"
keyAlias "xxx"
keyPassword "xxx"
}
}
使用命令:
.\gradlew -Pmarket=markets.txt clean apkRelease
来打包即可
2.常见错误
Could not find com.android.tools.build:gradle:2.2.0
原因:mavenCentral仓库没有gradle:2.2.0
解决:
buildscript {
repositories {
jcenter() //增加jcenter仓库
mavenCentral()
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.0'
// add packer-ng
classpath 'com.mcxiaoke.gradle:packer-ng:1.0.4'
}
}
java.lang.UnsupportedClassVersionError: com/android/build/gradle/LibraryPlugin : Unsupported major.minor version 52.0
原因 :java7只支持51.0 需要升级到java8
解决:使用generate signed apk 不受影响 是因为android studio调用的是java 8 ,可以在skd location 中看到设置的路径
在gradle.properties中添加 org.gradle.java.home=D:/Android/Android Studio/jre 即可
Task 'apkRelease' not found in root project 'YourProject'.
原因 :没有在model的build.gradle 中添加
apply plugin: 'com.android.application'
apply plugin: 'packer' //一定要加这一行
android {
...
}
3.使用配置文件载入keystroe信息
在配置文件中直接写入keystore信息不太安全,会被传到git上也不太好可以对keystroe使用单独的配置
先在model的目录中新建文件signing.properties
写入
先在model的目录中新建文件signing.properties
写入
KEYSTORE_FILE= my.keystore
KEYSTORE_PASSWORD= xxx
KEY_ALIAS= xxx
KEY_PASSWORD= xxx
或者第一行写成
KEYSTORE_FILE= D:/my.keystore
也可以,但是要注意路径要使用 ' / ' 而不是 ' \ '
然后在model的build.gradle文件中添加
android {
...
}
def getSignInfo() {
def com.android.build.gradle.internal.dsl.SigningConfig signingConfig = new com.android.build.gradle.internal.dsl.SigningConfig("signInfo")
File propFile = file("signing.properties");
if (propFile.exists()) {
def Properties props = new Properties()
props.load(new FileInputStream(propFile))
signingConfig.storeFile = file(props['KEYSTORE_FILE'])
signingConfig.storePassword = props['KEYSTORE_PASSWORD']
signingConfig.keyAlias = props['KEY_ALIAS']
signingConfig.keyPassword = props['KEY_PASSWORD']
println('signConfig is exits')
} else {
println('sign config is null')
signingConfig = null
}
signingConfig.v2SigningEnabled=false
return signingConfig;
}
最后将
buildTypes {
release {
...
signingConfig signingConfigs.release
...
}
}
中的
signingConfig signingConfigs.release
改成
signingConfig getSignInfo()
将keystroe文件放到指定位置即可
命令执行的方法和apk文件生成的目录和之前一样只需要在git的ignore中添加
对signing.properties文件和keystroe文件的忽略就行