Help us understand the problem. What is going on with this article?

Android Gradle 3.0以上で出力するapkのファイル名を変更する

More than 3 years have passed since last update.

3.0以前の設定方法と3.0以降で発生する問題

これまでGradle上で出力するapkのファイル名を変更するときは、下のような設定を記述していました。

app/build.gradle
android {
    applicationVariants.all { variant ->
        if (variant.buildType.name.equals("release")) {
            // releaseビルドのみ、ファイル名にVesionNameとビルド時間を付与
            variant.outputs.each { output ->
                if (output.outputFile != null && output.outputFile.name.endsWith('.apk')) {
                    def versionName = variant.versionName
                    def date = new java.text.SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date())
                    def newName = "apk_v${versionName}_${date}.apk"
                    output.outputFile = new File(output.outputFile.parent, newName)
                }
            }
        }
    }
}

しかしこの設定、Android Gradle 3.0(自分は3.0.0-arpha5にて確認)だと、output.outputFileが読み取り専用のプロパティとなってしまうためエラーが起きてしまいます。

* What went wrong:
A problem occurred configuring project ':app'.
> Cannot set the value of read-only property 'outputFile' for ApkVariantOutputImpl_Decorated{apkData=Main{type=MAIN, fullName=release, filters=[]}} of type com.android.build.gradle.internal.api.ApkVariantOutputImpl.

* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output.

BUILD FAILED in 0s

解決策

variant.outputs.each ではなく variant.outputs.all とし、outputFileNameに出力したいファイル名を設定することで解決できました。

app/build.gradle
applicationVariants.all { variant ->
    if (variant.buildType.name.equals("release")) {
        // releaseビルドのみ、ファイル名にVesionNameとビルド時間を付与
        variant.outputs.all {
            def versionName = variant.versionName
            def date = new java.text.SimpleDateFormat("yyyyMMdd_HHmmss").format(new Date())
            def newName = "apk_v${versionName}_${date}.apk"
            outputFileName = newName
        }
    }
}

ただしこの場合だと、apk以外のファイルを出力させている場合は上書きしてしまうかもしれません。よりよい変更方法がありましたらコメントもしくは編集リクエストお待ちいたしております。

参考

Android Gradle 3.0.0-alpha2 plugin, Cannot set the value of read-only property 'outputFile' - Stack Overflow

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away