1. 程式人生 > >AndroidStudio3.2版本自定義apk名稱編譯異常問題

AndroidStudio3.2版本自定義apk名稱編譯異常問題

專案從3.x版本升級到3.2版本時原有的自定義輸出apk名稱的程式碼已經失效新的寫法更改為
//這段指令碼是寫在專案級別的gradle檔案中的
//  AS3.2版本//輸出apk自定義名稱
android {
        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                output.versionCodeOverride = rootProject.gitVersionCode()
                output.versionNameOverride = rootProject.gitVersionTag()
                if (variant.name.endsWith("Debug")) {
                    //debug包使用git自動的版本號
                    output.outputFileName = "$applicationId _v${variant.mergedFlavor.versionName}_${debugTime()}_debug.apk"
                } else {
                    //release包使用git自動的版本號和版本名稱
                    output.outputFileName = "$applicationId _v${variant.mergedFlavor.versionName}_code${variant.mergedFlavor.versionCode}_${releaseTime()}_release.apk"
                }
            }
        }
    }
  1. 其中的rootProject.gitVersionCode()和rootProject.gitVersionTag()方法,是為了結合git自動的生成版本號和版本名稱.而它是在專案級別的gradle檔案中申明的(最外層宣告)相關程式碼如下
def gitVersionCode() {
//    def cmd = 'git rev-list --all-match --first-parent --count'
    def cmd = 'git rev-list HEAD --count'
    cmd.execute().text.trim().toInteger()
}

def gitVersionTag() {
    def cmd = 'git describe --tags'
    def version = cmd.execute().text.trim()

    def pattern = "-(\\d+)-g"
    def matcher = version =~ pattern

    if (matcher) {
        version = version.substring(0, matcher.start()) + "." + matcher[0][1]
    } else {
//        version = version + ".0"
    }
    return version
}

此處僅為程式碼片段,具體如何結合git自動生成版本號和版本名稱,請自行查閱(此處有坑,不同版本的AndroidStudio配置方法不同)

2.debugTime()方法和releaseTime()方法是在指令碼的頂部宣告的方法如下

static def releaseTime() {
    return new Date().format("yyyy-MM-dd-HH-mm", TimeZone.getDefault())//包含時分秒
}

static def debugTime() {
//    return new Date().format("yyyy-MM-dd", TimeZone.getDefault())
    return new Date().format("yyyy", TimeZone.getDefault())
}
原有的自定義apk名稱寫法為,具體示意見上述3.2版本
    //AS3.x版本//輸出apk自定義名稱
    android.applicationVariants.all { variant ->
        variant.outputs.all {
            variant.mergedFlavor.versionCode = rootProject.gitVersionCode()
            variant.mergedFlavor.versionName = rootProject.gitVersionTag()
            if (variant.name.endsWith("Debug")) {
                //debug包使用git自動的版本號
                outputFileName = "$applicationId _v${variant.mergedFlavor.versionName}_${debugTime()}_debug.apk"
            } else {
                //release包使用git自動的版本號和版本名稱
                outputFileName = "$applicationId _v${variant.mergedFlavor.versionName}_code${variant.mergedFlavor.versionCode}_${releaseTime()}_release.apk"
            }
        }
    }
3.x之前版本寫法也是不同的,這裡不做贅述