いまさらやけど
apkの場合であればAS3.3.x以降は次のようにすればapk名を変更できました。
1 2 3 4 5 6 7 8 9 10 11 12 |
android { ... applicationVariants.all { variant -> // after Android Studio 3.3.x / gradle 4.10.1 def list = applicationId.split("\\.") def appName = list[list.length - 1] variant.outputs.all { output -> outputFileName = "${appName}_${variant.buildType.name}_r${variant.versionName}_v${variant.versionCode}.apk" } } ... } |
AS3.3.x以前は少し違いますがapplicationVariantsで似たような設定をすればapk名を変更できました(自分でググっておくれ)。
一方、Android Studio(以下AS)3.4までは出力される.aabファイルは常時${モジュール名}.aabになっていました。
でも.aabファイル名にもプロダクトフレーバー, ビルドタイプ, バージョン名, バージョンコードを含むようにしたいのです。
そこでASが生成する.aabファイルを自動でリネームする方法を調べてみました。
StackOverflowやらなんやらwebをぐるぐるすることしばしばし、2つの方法が見つかりました。
tasks.whenTaskAddedでリネームタスクを追加する方法
- archivesBaseNameを使う
の2種類があるようです。
大きな問題が
しかぁ〜しarchivesBaseNameを使う方法だと巨大な問題があるのです。なんと(AS3.4までの場合)archivesBaseNameではプロダクトフレーバーやビルドタイプを.aab名に取り込むのが困難なのです。
例えばbuild.gradleに次のようにfreeとproのプロダクトフレーバー毎の設定を書けばエラーにならずビルド自体は正常に終了します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
... productFlavors { free { dimension "${DIMENSION}" ... versionCode appVersionCode versionName appVersionName archivesBaseName = "free_r${versionName}_v${versionCode}" } pro { dimension "${DIMENSION}" ... versionCode appVersionCode versionName appVersionName archivesBaseName = "pro_r${versionName}_v${versionCode}" } } ... |
ですが生成される.aabは、プロダクトフレーバーに関係なくすべてpro_r${versionName}v${versionCode}.aabになってしまうのです?つまり一番最後にセットされたarchivesBaseNameの値が有効ということです。
AS3.4までなら
ということでAS3.4まではarchivesBaseNameを諦めてStackOverflowを参考にwhenTaskAddedを次のようにしていました。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
tasks.whenTaskAdded { task -> if (task.name.startsWith("bundle")) { def app = "アプリ名" def flavor = task.name.substring("bundle".length()).uncapitalize() // app.aabをリネームしてコピーするCopyタスクを追加 def renameTaskName = "rename${task.name.capitalize()}" def deleteTaskName = "delete${task.name.capitalize()}" def rename = tasks.create(renameTaskName, Copy) { def path = "${buildDir}/outputs/bundle/${flavor}/" from(path) include "app.aab" destinationDir file(path) rename "app.aab", "${app}_${flavor}_r${appVersionName}_v${appVersionCode}.aab" } tasks.create(deleteTaskName, Delete) { delete "${buildDir}/outputs/bundle/${flavor}/app.aab" } task.finalizedBy(renameTaskName) rename.finalizedBy(deleteTaskName) } } |
これはAS3.4までは.aabファイルが${モジュール名}.aabになることと.aabを出力するタスク名がbundle+プロダクトフレーバー名+ビルドタイプだったことを利用しています。Stackoverflowの回答だとリネーム処理まででしたがここでは元ファイルの削除タスクも追加しています。ちなみにappVersionNameとappVersionCodeは別途定義しといてな。
A3.5やと動かん?
これで一件落着かと思いきやAS3.5にバージョンアップすると想定通りに動かんのんです。
なんとデフォで生成される.aab名が従来の${モジュール名}.aabから${モジュール名}-${プロダクトフレーバー}-${ビルドタイプ}.aabに変わってしまったのです?何しやがるぅ〜というかプロダクトフレーバーとビルドタイプを含むようになったのは本来の動作なのかもしれんけどさ(。・_・。)
ということでAS3.5ならこっちだ✨
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
tasks.whenTaskAdded { task -> if (task.name.startsWith("bundle")) { def app = "アプリ名" def flavor = task.name.substring("bundle".length()).uncapitalize() // app.aabをリネームしてコピーするCopyタスクを追加 def renameTaskName = "rename${task.name.capitalize()}" def deleteTaskName = "delete${task.name.capitalize()}" def rename = tasks.create(renameTaskName, Copy) { def path = "${buildDir}/outputs/bundle/${flavor}/" from(path) destinationDir file(path) rename (/app-(.+)-(.+).aab/, /${app}_$1_$2_r${appVersionName}_v${appVersionCode}.aab/) } tasks.create(deleteTaskName, Delete) { delete fileTree("${buildDir}/outputs/bundle/${flavor}/") { include "app*.aab" } } task.finalizedBy(renameTaskName) rename.finalizedBy(deleteTaskName) } } |
なんかもっとスマートな方法がありそうな気もするんやけど…まぁえっか(。・_・。)
これでデフォで出力される${モジュール名}-${プロダクトフレーバー}-${ビルドタイプ}.aabを${アプリ名}-${プロダクトフレーバー}-${ビルドタイプ}_r${バージョン名}_v${バージョンコード}.aabにリネームした後元ファイルを削除できるようになります。
AS3.4までと3.5をどちらでも行けるようにするにはバージョンわけが必要ですが使う人がそんなのいらんべと言ったので3.5のみ対応です?