web-dev-qa-db-ja.com

Gradleでapk名を変更する

ビルドプロセスにGradleを使用するAndroidプロジェクトがあります。ステージングとプロダクションの2つのビルドタイプを追加したいので、build.gradleに以下を含めます。

Android {
    buildTypes {
        release {
            runProguard false
            proguardFile getDefaultProguardFile('proguard-Android.txt')
        }

        staging {
            signingConfig signingConfigs.staging

            applicationVariants.all { variant ->
                appendVersionNameVersionCode(variant, defaultConfig)
            }
        }

        production {
            signingConfig signingConfigs.production
        }
    }
}

私のappndVersionNameVersionCodeは次のようになります:

def appendVersionNameVersionCode(variant, defaultConfig) {
    if(variant.zipAlign) {
        def file = variant.outputFile
        def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
        variant.outputFile = new File(file.parent, fileName)
    }

    def file = variant.packageApplication.outputFile
    def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
    variant.packageApplication.outputFile = new File(file.parent, fileName)
}

タスクassembleStagingを実行すると、apkの適切な名前が取得されますが、assembleProductionを実行すると、apkの名前が変更されます(ステージングの場合のように)。例えば:

MyApp-defaultFlavor-production-9.9.9-999.apk
MyApp-defaultFlavor-production-9.9.9-999.apk

実動ビルドタイプではappendVersionNameVersionCodeが実行されているようです。どうすれば回避できますか?

41
Grzegorz

CommonsWareが彼のコメントで書いたように、appendVersionNameVersionCodeはステージングバリアントに対してのみ呼び出す必要があります。 appendVersionNameVersionCodeメソッドをわずかに変更するだけで、簡単にそれを行うことができます。次に例を示します。

def appendVersionNameVersionCode(variant, defaultConfig) {
    //check if staging variant
    if(variant.name == Android.buildTypes.staging.name){
        if(variant.zipAlign) {
            def file = variant.outputFile
            def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
            variant.outputFile = new File(file.parent, fileName)
        }

    def file = variant.packageApplication.outputFile
    def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
    variant.packageApplication.outputFile = new File(file.parent, fileName)
    }
}
37
Leszek

Lechoのソリューションは、Android Gradle Plugin 0.14.3+では機能しません。廃止されたAPISが削除されているためです。 http://tools.Android.com/tech-docs/new-ビルドシステム

ほぼ1.0:非推奨のプロパティ/メソッドを削除

...

  • Variant.packageApplication/zipAlign/createZipAlignTask/outputFile/processResources/processManifest(バリアント出力を使用)

以下は私のために働く:

def appendVersionNameVersionCode(variant, defaultConfig) {
    variant.outputs.each { output ->
        if (output.zipAlign) {
            def file = output.outputFile
            def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
            output.outputFile = new File(file.parent, fileName)
        }

        def file = output.packageApplication.outputFile
        def fileName = file.name.replace(".apk", "-" + defaultConfig.versionName + "-" + defaultConfig.versionCode + ".apk")
        output.packageApplication.outputFile = new File(file.parent, fileName)
    }
}
20
Piotr Zawadzki

私はそれの少し汎用バージョンを使用しています。ビルドしてインストールしてください。たとえば、projectNameが「Salad」の場合、apkのステージングの名前は「Salad-staging-dd-MM-YY」になります。また、apkのデバッグおよびリリース用に変更できます。私のソリューションが良くなることを願っています。
projectName/app/build.gradleの変更

buildTypes {

debug{

}

staging{
 debuggable true
 signingConfig signingConfigs.debug
 applicationVariants.all { variant ->
 variant.outputs.each { output ->
 def date = new Date();
 def formattedDate = date.format('dd-MM-yyyy')
 def appName = getProjectDir().getParentFile().name
 output.outputFile = new File(output.outputFile.parent,
                                output.outputFile.name.replace(getProjectDir().name +"-staging", "$appName-staging-" + formattedDate)
                                //for Debug use output.outputFile = new File(output.outputFile.parent,
                                //                             output.outputFile.name.replace("-debug", "-" + formattedDate)
                        )
  }
 }
}

release {
  minifyEnabled false
 proguardFiles getDefaultProguardFile('proguard-Android.txt'), 'proguard-rules.pro'
}

変更するAndroidアプリ名 ref

0
Qamar

ここに私がやったことがあります:

 def appName
        if (project.hasProperty("applicationName")) {
            appName = applicationName
        } else {
            appName = parent.name
        }
        applicationVariants.all { variant ->
            variant.outputs.each { output ->
                output.outputFile = new File(output.outputFile.parent, output.outputFile.name.replace("app-release.apk", appName + "_V" + versionCode + ".apk"))
            }
        }
0
Droid Chris