中安拓也のブログ

プログラミングについて書くブログ。 Twitterやってます @takuya_nakayasu

【Cordova】[Android] APK/AABのファイル名を変更する

はじめに

Androidビルド時に作成されるAPK(Android Application Package)とAAB(Android App Bundle)のファイル名を変更する方法について説明していきます。

APK/AABファイルの名称変更の方法のうち、ビルドタイプ/プロダクトフレーバーも含めて変更する方法と、ビルドタイプ/プロダクトフレーバーについては変更しない方法がありますが、今回は前者について説明します。

環境

今回の記事では、IonicCordova/Angular)で作成したAPK/AABファイルの名称を変更しています。

ionic infoコマンドの実行結果

% ionic info

Ionic:

   Ionic CLI                     : 6.17.1 (/usr/local/lib/node_modules/@ionic/cli)
   Ionic Framework               : @ionic/angular 5.7.0
   @angular-devkit/build-angular : 12.1.4
   @angular-devkit/schematics    : 12.2.6
   @angular/cli                  : 12.1.4
   @ionic/angular-toolkit        : 4.0.0

Cordova:

   Cordova CLI       : 10.0.0
   Cordova Platforms : android 9.1.0
   Cordova Plugins   : cordova-plugin-ionic-keyboard 2.2.0, cordova-plugin-ionic-webview 4.2.1, (and 4 other plugins)

Utility:

   cordova-res : not installed globally
   native-run  : not installed globally

System:

   NodeJS : v14.17.6 (/usr/local/bin/node)
   npm    : 6.14.15
   OS     : macOS Big Sur
   Xcode  : Xcode 12.5.1 Build version 12E507

デフォルトのファイル名

ファイル名について何も設定をしていない状態では、どのような命名規則でファイル名が設定されるのかをまず確認していきます。

Android Application Package(.apk)の場合

Ionic(Cordova)では、以下のコマンドで.apkファイルを作成することができます。

ionic cordova build android

上記のコマンドの結果、[ionicプロジェクト]/platforms/android/app/build/outputs/apk/debug配下にapp-debug.apkファイルが作成されます。

f:id:l08084:20210918163454p:plain
app-debug.apkファイルが作成される

このように、デフォルトでは.apkファイルは以下のような命名規則でファイルが命名されます。

app-[プロダクトフレーバー]-[ビルドタイプ].apk

今回は、ビルドタイプをdebugに設定しプロダクトフレーバーは作成していないため、ファイル名がapp-debug.apkになっています。

Android App Bundle(.aab)の場合

Ionic(Cordova)では、以下のコマンドで.aabファイルを作成することができます。

ionic cordova build android -- -- --packageType=bundle

上記のコマンドの結果、[ionicプロジェクト]/platforms/android/app/build/outputs/bundle/debug配下にapp-debug.aabファイルが作成されます。

f:id:l08084:20210918170602p:plain
app-debug.aabファイルが作成される

.aabファイルの命名規則も、拡張子(.aab)以外は.apkファイルと同じになります。1

app-[プロダクトフレーバー]-[ビルドタイプ].aab

ファイル名の変更方法

APK/AABファイルをそれぞれ以下の通り、名称を変更することで、ファイル名の変更方法について説明します。

  • APKファイル
    • 変更前: app-debug.apk
    • 変更後: android-application-package.apk
  • AABファイル
    • 変更前: app-debug.aab
    • 変更後: android-app-bundle.aab

APK/AABのファイル名を変更する方法についてですが、Cordova のフックスクリプトで直接ファイル名を変更する方法などもありますが、今回はGradle経由で変更する方法について説明します。

Gradle経由でファイル名を変更する

それでは、Gradle経由でAPK/AABのファイル名を変更する方法について説明していきます。

Gradleでファイル名を変更する大まかな流れですが、以下になります。

  1. before_buildにフックされたCordovaフックスクリプト(JavaScript)がビルド前のタイミングでコールされる

  2. コールされたCordovaフックスクリプトがbuild-extras.gradleファイルを[ionicプロジェクト]/platforms/android/appディレクトリ配下にコピーする

  3. ファイル名を変更する処理が設定されたbuild-extras.gradleappディレクトリ配下に配置されることにより、AndroidビルドのタイミングでAPK/AABのファイル名が変更される

ビルドの設定ファイルであるbuild.gradleはAndroidビルド後に作成されるため、ビルドの設定を拡張するためには上記のようにフックスクリプトを経由する必要があります。

build-extras.gradleをコピーするCordovaフックスクリプトを作成する

APK/AABファイルの両方で使用する、build-extras.gradleをコピーするCordovaフックスクリプトを作成します。

build_scripts/copy-build-extras.js

/*
 * customize build.gradle
 */
const fs = require("fs");
const path = require("path");

const androidAppFolderPath = ["platforms", "android", "app"];
const extrasGradleFilePath = ["build_scripts", "build_extras"];
const extrasGradleFileName = "build-extras.gradle";

const copyBuildExtras = (
  androidAppFolderFullPath,
  extrasGradleFileFullPath,
  destinationFullPath
) => {
  if (
    !fs.existsSync(
      androidAppFolderFullPath || !fs.existsSync(extrasGradleFileFullPath)
    )
  ) {
    console.log(`${extrasGradleFileFullPath} not found. Skipping`)
    return;
  }
  fs.copyFile(extrasGradleFileFullPath, destinationFullPath, (err) => {
    if (err) {
      console.error(err);
      return;
    }
    console.log('copied build-extras.gradle');
  })
};

module.exports = (context) => {
  copyBuildExtras(
    path.join(context.opts.projectRoot, ...androidAppFolderPath),
    path.join(
      context.opts.projectRoot,
      ...extrasGradleFilePath,
      extrasGradleFileName
    ),
    path.join(context.opts.projectRoot, ...androidAppFolderPath, extrasGradleFileName)
  );
};

続いて、上記で作成したCordovaフックスクリプトをビルド前(before_build)に呼び出されるようにフックします。

config.xml

<?xml version='1.0' encoding='utf-8'?>
<widget id="io.ionic.starter" version="0.0.1" xmlns="http://www.w3.org/ns/widgets" xmlns:cdv="http://cordova.apache.org/ns/1.0">
    ...
    <platform name="android">
        ...
        <hook src="build_scripts/copy-build-extras.js" type="before_build" />
    ...
    </platform>
    <platform name="ios">
    ...
    </platform>
</widget>

これでCordovaフックスクリプトの作成とフックの設定が完了したので、続いてAPKとAABのファイル名を変更するbuild-extras.gradleを作成していきます。

APKファイルの名称を変更する

以下がAPKファイルの名称を変更するbuild-extras.gradleになります。

build_scripts/build_extras/build-extras.gradle

android {
    applicationVariants.all { variant ->
        if (variant.buildType.name != "debug") {
            return
        }
        variant.outputs.all {
            outputFileName = "android-application-package.apk"
        }
    }
}

AABファイルの名称を変更する

以下がAABファイルの名称を変更するbuild-extras.gradleになります。

build_scripts/build_extras/build-extras.gradle

android {
    task finalizeBundleDebug(type: Sync) {
        def path = "${buildDir}/outputs/bundle/debug/"
        from(path)
        include 'app-debug.aab'
        destinationDir file(path)
        rename 'app-debug.aab', 'android-app-bundle.aab'
    }
    tasks.whenTaskAdded { task ->
        if (task.name.equals('bundleDebug')) {
            task.finalizedBy finalizeBundleDebug
        }
    }
}

動作確認

フックスクリプトとbuild-extras.gradleの作成が終わったところで、APK/AABファイルの名称が変更されるか確認してみます。

APKファイル

以下のコマンドで.apkファイルを作成します。

ionic cordova build android

以下画像のようにファイル名が期待通り変更されています。

f:id:l08084:20210920182900p:plain
APKファイルの名称が変更されている

f:id:l08084:20210920182954p:plain
APKファイルの名称が変更されている

AABファイル

以下のコマンドで.aabファイルを作成します。

ionic cordova build android -- -- --packageType=bundle

.aabファイルも期待通り変更されていることがわかります。

f:id:l08084:20210920183329p:plain
AABファイルの名称が変更されている

f:id:l08084:20210920183411p:plain
AABファイルの名称が変更されている

参考サイト

Android Platform Guide - Apache Cordova

How do I add a version specific filename to a Cordova .apk - Stack Overflow

Copy build-extras to platforms/android · GitHub

ビルド時に生成されるAPK/AABのファイル名を変更する方法 - Qiita

ビルド バリアントを設定する  |  Android デベロッパー  |  Android Developers

How to make use of Android App Bundle in Ionic Applications? - Stack Overflow

Androidのビルドバリアントをイチから理解する | フューチャー技術ブログ

How to change the generated filename for App Bundles with Gradle?

Copy build-extras to platforms/android · GitHub


  1. Android Gradle プラグインの3.5.0 alpha 04以前では、Android App Bundleのデフォルトのファイル名にはビルドタイプもプロダクトフレーバーも含まれていなかった。Android Gradle プラグイン 3.5.0 alpha 04以前のAABファイルのデフォルトのファイル名はapp.aabとなる