android7.0 多渠道打包和gradle打包常见问题

闻人飞翼
2023-12-01

在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
写入

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文件的忽略就行



 类似资料: