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