5

異なるフレーバーのアプリがあります。各フレーバーには 2 つの buildTypes があります。

マニフェストのいくつかの行の名前を変更した後、apk の名前も変更します。すべて正常に動作します - 同じ apk を 2 回取得するのはなぜでしょうか? 一度改名せず、一度改名...

異なる名前を持つ同じアプリの短い例:

  • "myApp-flavor-buildType.apk" (名前は変更されていません)
  • "myApp-appName-buildType-version.apk" (名前が変更された apk)

私のbuild.gradleファイルのコードは次のとおりです。

// *** OVERRIDE data in MANIFEST ***
android.applicationVariants.each { variant ->
    variant.processManifest.doLast {
        overrideDataInManifest(variant)
    }
}

def overrideMapsKey(buildVariant){
    def appName = getAppName(buildVariant)

    // override line ... this is not necessary to this question

    renameAPK(buildVariant, appName)
}

// *** RENAME APK ***
def renameAPK(buildVariant, appName){
    def apk = buildVariant.packageApplication.outputFile;
    def newName = "";

    // get data for apk renaming
    def versionName = android.defaultConfig.versionName 
    def versionNameSuffix = buildVariant.buildType.versionNameSuffix
    if(versionNameSuffix.toString().equals("null"))
        versionNameSuffix = ""
    def buildTypeOfApp= buildVariant.buildType.name 

    if (buildVariant.zipAlign) {
        newName = "etscanner-" + appName + "-" + buildTypeOfApp.toUpperCase() + "-v" + versionName + versionNameSuffix + ".apk"
    }else{
        newName = "etscanner-" + appName + "-" + buildTypeOfApp.toUpperCase() + "-v" + versionName + versionNameSuffix + "-ALIGNED" + ".apk"
    }
    buildVariant.packageApplication.outputFile = new File(apk.parentFile, newName);
}

何が起こっているのか、2 つの APK を取得せずに同じタスクが可能かどうかを知りたいだけです。

4

4 に答える 4

11

zipAlign オプションが true に設定されたバリアントには、常に 2 つの APK ファイルが存在します。最初に gradle は元の APK ファイルをビルドし、次にそれを zipalign して、元の APK ファイルを削除せずに最適化されたバージョンを生成します。

buildVariant.packageApplication.outputFile はビルド プロセスの中間生成物であり、私の観察では、1 つが常に調整されていない APK ファイルであることがわかりました。

buildVariant.outputFile は、zipAlign オプションが適用される最終出力です。

一方、build.gradile ファイルを修正することをお勧めします。実際には、整列されていないバージョンの APK ファイルの名前が「ALIGNED」バージョンに変更され、zipalign APK ファイルは変更されません。これが私の修正版です:

if (buildVariant.zipAlign) {
    newName = "etscanner-" + appName + "-" + buildTypeOfApp.toUpperCase() + "-v" + versionName + versionNameSuffix + "-ALIGNED.apk"
    buildVariant.outputFile = new File(apk.parentFile, newName);
}

newName = "etscanner-" + appName + "-" + buildTypeOfApp.toUpperCase() + "-v" + versionName + versionNameSuffix + "-UNALIGNED" + ".apk"
buildVariant.packageApplication.outputFile = new File(apk.parentFile, newName);
于 2013-09-02T15:43:08.043 に答える
2

Androidライブラリファイル(aar)の名前を変更することを探している人のために、gradle 2.+バージョンについて私が思いついたのは次のとおりです。

android.libraryVariants.all { variant ->
    if (variant.buildType.name == 'release') {
        def oldFile = variant.outputs.get(0).getOutputFile()
        if (oldFile.name.contains("release")) {
            def newPath = oldFile.name.replace("release.aar", version.toString() + ".aar")
            variant.outputs.get(0).
                    setOutputFile(new File(oldFile.parentFile.toString(), newPath.toString()))
        }
    }
}

より良い方法を思いついたら教えてください。

于 2014-10-30T20:34:33.690 に答える
0

Android Gradle プラグイン 0.13 以降を使用している場合、インターフェースが少し変更されています。

android.applicationVariants.all { variant ->

    def name
    variant.outputs.each { output ->

        def apkDirectory = variant.packageApplication.outputFile.parentFile

        if (output.zipAlign) {
            name = "yourAppName.apk"
            output.outputFile = new File(apkDirectory, name);
        }

        name = "yourAppName-UNALIGNED.apk"
        variant.packageApplication.outputFile = new File(apkDirectory, name);
    }    
}
于 2014-10-02T13:27:56.743 に答える