コマンドラインからアプリをビルドする

Gradle ラッパー コマンドライン ツールを使用して、Android プロジェクトで利用可能なビルドタスクをどれでも実行できます。このツールは、Windows ではバッチファイル(gradlew.bat)として、Linux と Mac ではシェル スクリプト(gradlew.sh)として使用でき、Android Studio で作成した各プロジェクトのルートからアクセスできます。

ラッパーを使ってタスクを実行するには、ターミナル ウィンドウで次のいずれかのコマンドを使用します(Android Studio で [View] > [Tool Windows] > [Terminal] を選択します)。

  • Windows Command Shell の場合:
    gradlew task-name
  • Mac、Linux、Windows PowerShell の場合:
    ./gradlew task-name

プロジェクトで利用可能なビルドタスクのリストを表示するには、tasks コマンドを実行します。

gradlew tasks

続いて、Gradle ラッパーを使用してアプリをビルド、実行するための基本事項について説明します。Android ビルドの設定方法について詳しくは、ビルドを設定するをご覧ください。

コマンドライン ツールではなく Android Studio ツールを使用する場合は、アプリをビルドして実行するをご覧ください。

ビルドタイプの概要

どの Android アプリでも、デバッグするための「デバッグ」ビルドと、ユーザーにリリースするための「リリース」ビルドの 2 種類のビルドタイプをデフォルトで利用できます。各ビルドで生成されるアプリは、デバイスにデプロイする前に、証明書で署名する必要があります。デバッグビルドは SDK ツールから提供されるデバッグ鍵で自動的に署名されます(これは安全ではないため、Google Play ストアに公開できません)。リリースビルドには自身の秘密鍵で署名する必要があります。

リリース用にアプリをビルドする場合は、適切な署名鍵でアプリに署名することが重要です。一方、アプリの開発を始めたばかりの場合はデバッグ APK をビルドすれば、エミュレータまたは接続されたデバイスでアプリをすぐに実行できます。

build.gradle.kts ファイルでカスタム ビルドタイプを定義し、debuggable true を指定することでデバッグビルドとして署名するように設定することもできます。詳細については、ビルド バリアントの設定をご覧ください。

APK をビルドしてデプロイする

アプリをパッケージ化して Play Console にアップロードするには App Bundle をビルドする方法が最適ですが、デバッグビルドをすぐにテストしたり、アプリをデプロイ可能なアーティファクトとして共有したりする場合は、APK をビルドするほうが適しています。

デバッグ APK をビルドする

デバッグ APK をビルドすると、すぐにアプリをテストしてデバッグできます。デバッグ APK は SDK ツールから提供されるデバッグ鍵で署名され、adb を使用してデバッグできます。

デバッグ APK をビルドするには、コマンドラインを開いてプロジェクト ディレクトリのルートに移動します。デバッグビルドを開始するには、assembleDebug タスクを呼び出します。

gradlew assembleDebug

これにより、module_name-debug.apk という APK が project_name/module_name/build/outputs/apk/ に生成されます。このファイルはデバッグ鍵ですでに署名されており、zipalign でアライメントされているため、すぐにデバイスにインストールできます。

APK をビルドした直後に実行中のエミュレータまたは接続されたデバイスにインストールする場合は、installDebug を実行します。

gradlew installDebug

上記タスクの「Debug」の部分はビルド バリアント名をキャメルケースで指定しただけなので、実際にアセンブルまたはインストールするビルドタイプかバリアントで置き換えることができます。たとえば、「demo」プロダクト フレーバーの場合は assembleDemoDebug タスクでデバッグ版をビルドできます。

各バリアントで使用できるすべてのビルドタスクとインストール タスク(アンインストール タスクを含む)を確認するには、tasks タスクを実行します。

エミュレータでアプリを実行する方法とデバイスでアプリを実行する方法についてのセクションもご覧ください。

リリース バンドルまたは APK をビルドする

アプリのリリースと配布の準備が整ったら、リリース バンドルまたは APK をビルドして秘密鍵で署名する必要があります。詳細については、コマンドラインからアプリに署名する方法をご覧ください。

アプリをエミュレータにデプロイする

Android エミュレータを使用する場合は、Android Studio で Android Virtual Device(AVD)を作成する必要があります。

AVD を作成したら、Android Emulator を起動し、次の手順でアプリをインストールします。

  1. コマンドラインで android_sdk/tools/ に移動し、AVD を指定してエミュレータを起動します。

    emulator -avd avd_name

    AVD 名がわからない場合は、emulator -list-avds を実行します。

  2. デバッグ APK をビルドする方法として説明した Gradle インストール タスクのうちのいずれか、または adb ツールを使用して、アプリをインストールします。

    APK のビルドに Developer Preview SDK を使用した場合(targetSdkVersion が数字ではなく文字の場合)、install コマンドで -t オプションを指定してテスト APK をインストールする必要があります。

    adb install path/to/your_app.apk
    

    ビルドした APK はすべて project_name/module_name/build/outputs/apk/ に保存されています。

詳細については、Android Emulator 上でアプリを実行するをご覧ください。

実機にアプリをデプロイする

デバイスでアプリを実行するには、そのデバイスで [USB デバッグ] を有効にしておく必要があります。このオプションは [設定] > [開発者向けオプション] にあります。

: Android 4.2 以降のバージョンでは、[開発者向けオプション] はデフォルトで非表示になっています。表示するには、[設定] > [デバイス情報] に移動して [ビルド番号] を 7 回タップします。前の画面に戻ると、[開発者向けオプション] が表示されます。

デバイスを設定して USB 経由で接続したら、デバッグ APK をビルドする方法で説明した Gradle インストール タスク、または adb ツールを使用して、アプリをインストールできます。

adb -d install path/to/your_app.apk

ビルドした APK はすべて project_name/module_name/build/outputs/apk/ に保存されています。

詳細については、ハードウェア デバイス上でのアプリの実行をご覧ください。

App Bundle をビルドする

アプリのコンパイル済みコードとリソースはすべて Android App Bundle に含まれますが、APK の生成と署名は Google Play ストアで行います。APK とは異なり、App Bundle をデバイスに直接デプロイすることはできません。 そのため、APK を他のユーザーとすぐにテストまたは共有する場合は、代わりに APK をビルドする必要があります。

App Bundle をビルドするには、Android Studio を使用するほうが簡単です。ただし、コマンドラインから App Bundle をビルドする必要がある場合は、次のセクションで説明するように Gradle または bundletool を使用します。

Gradle を使用して App Bundle をビルドする

コマンドラインから App Bundle を生成する場合は、アプリのベース モジュールで bundleVariant Gradle タスクを実行します。たとえば、次のコマンドでベース モジュールのデバッグ版の App Bundle をビルドします。

./gradlew :base:bundleDebug

Play Console にアップロードするための署名済みバンドルをビルドする場合は、まずベース モジュールの build.gradle.kts ファイルをアプリの署名情報を含めて設定する必要があります。詳細については、Gradle を設定してアプリに署名する方法をご覧ください。これにより、たとえばアプリのリリース版をビルドすると、Gradle は自動的に App Bundle を生成し、build.gradle.kts ファイルに指定されている署名情報で署名します。

App Bundle に別のステップとして署名する場合は、 jarsigner を使用して、コマンドラインから App Bundle に署名してください。アプリをビルドするコマンド バンドル:

jarsigner -keystore pathToKeystore app-release.aab keyAlias

bundletool を使用して App Bundle をビルドする

bundletool は Android Studio、Android Gradle プラグイン、Google Play で使用するコマンドライン ツールです。アプリのコンパイル済みコードとリソースを App Bundle に変換し、そのバンドルからデプロイ可能な APK を生成します。

そのため、App Bundle を bundletool でテストし、Google Play による APK の生成方法をローカルで再現する場合には便利ですが、通常は App Bundle 自体をビルドするのに bundletool を呼び出す必要はありません。代わりに、前のセクションで説明した Android Studio または Gradle タスクを使用してください。

ただし、バンドルのビルドにカスタムビルド ツールチェーンを使用するなどして Android Studio や Gradle のタスクを使用しない場合は、コマンドラインから bundletool を使用して、事前にコンパイルされたコードとリソースから App Bundle をビルドできます。まだダウンロードしていない場合は、GitHub リポジトリから bundletool をダウンロードしてください。

ここでは、アプリのコンパイル済みコードとリソースをパッケージ化する方法と、コマンドラインで bundletool を使用して Android App Bundle に変換する方法について説明します。

proto 形式でマニフェストとリソースを生成する

bundletool を使用するには、アプリのマニフェストやリソースなどのアプリ プロジェクトに関する特定の情報を Google の Protocol Buffer 形式(別名「protobuf」、*.pb ファイル拡張子を使用)にしておく必要があります。protobuf は、構造化データをシリアル化するためのメカニズムであり、言語やプラットフォームに依存せず、拡張することも可能です。XML に似ていますが、XML より小さくなり、高速で、シンプルです。

AAPT2 をダウンロードする

Google の Maven リポジトリにある最新版の AAPT2 を使用すると、アプリのマニフェスト ファイルとリソース テーブルを protobuf 形式で作成できます。

AAPT2 を Google の Maven リポジトリからダウンロードする方法は次のとおりです。

  1. リポジトリのインデックスcom.android.tools.build > aapt2 に移動します。
  2. AAPT2 の最新版の名前をコピーします。
  3. コピーしたバージョン名を次の URL に挿入し、ターゲットとなるオペレーティング システムを指定します(https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/aapt2-version/aapt2-aapt2-version-[windows | linux | osx].jar)。

    たとえば、Windows 用のバージョン 3.2.0-alpha18-4804415 をダウンロードする場合は、次のようになります(https://dl.google.com/dl/android/maven2/com/android/tools/build/aapt2/3.2.0-alpha18-4804415/aapt2-3.2.0-alpha18-4804415-windows.jar)。

  4. ブラウザでこの URL にアクセスすると、AAPT2 のダウンロードが開始されます。

  5. ダウンロードした JAR ファイルを解凍します。

AAPT2 を使用して、次のコマンドでアプリのリソースをコンパイルします。

aapt2 compile \
project_root/module_root/src/main/res/drawable/Image1.png \
project_root/module_root/src/main/res/drawable/Image2.png \
-o compiled_resources/

AAPT2 がさまざまなコンパイル済みリソースを 1 つの APK にリンクするリンクフェーズで、AAPT2 がアプリのマニフェストとコンパイル済みリソースを protobuf 形式に変換するように、次のとおり --proto-format フラグを指定してください。

aapt2 link --proto-format -o output.apk \
-I android_sdk/platforms/android_version/android.jar \
--manifest project_root/module_root/src/main/AndroidManifest.xml \
-R compiled_resources/*.flat \
--auto-add-overlay

これにより、アプリの AndroidManifest.xmlresources.pb といったリソース ファイルなどのコンテンツを出力 APK から protobuf 形式で抽出できます。次のセクションで説明するように、App Bundle のビルドに bundletool で必要となる入力を準備する際に、これらのファイルが必要になります。

コンパイル済みのコードとリソースをパッケージ化する

bundletool を使用してアプリの App Bundle を生成する前に、まず各アプリ モジュールのコンパイル済みコードとリソースを含む ZIP ファイルを用意する必要があります。各モジュールの ZIP ファイルの内容と構成は、Android App Bundle 形式のものとよく似ています。たとえば、アプリのベース モジュールの base.zip ファイルを作成し、次のようにコンテンツを整理する必要があります。

ファイルまたはディレクトリ 説明
manifest/AndroidManifest.xml protobuf 形式のモジュールのマニフェスト。
dex/... アプリのコンパイル済み DEX ファイルを 1 つ以上含むディレクトリ。これらのファイルには、classes.dexclasses2.dexclasses3.dex といった名前を付ける必要があります。
res/... すべてのデバイス設定用に protobuf 形式のモジュールのリソースが含まれます。サブディレクトリとファイルは、一般的な APK のような形式にする必要があります。
root/...assets/...lib/... これらのディレクトリは、Android App Bundle 形式で説明したものと同じです。
resources.pb protobuf 形式のアプリのリソース テーブル。

アプリの各モジュール用の ZIP ファイルを準備したら、次のセクションで説明するように、bundletool に渡して App Bundle をビルドします。

bundletool を使用して App Bundle をビルドする

App Bundle をビルドするには、次のように bundletool build-bundle コマンドを使用します。

bundletool build-bundle --modules=base.zip --output=mybundle.aab

次の表で、build-bundle コマンドのフラグについて詳しく説明します。

フラグ 説明
--modules=path-to-base.zip, path-to-module2.zip,path-to-module3.zip App Bundle をビルドするために bundletool が使用するモジュール ZIP ファイルのリストを指定します。
--output=path-to-output.aab 出力 *.aab ファイルのパスとファイル名を指定します。
--config=path-to-BundleConfig.json ビルドプロセスをカスタマイズするために使用できる、オプションの構成ファイルへのパスを指定します。詳細については、ダウンストリームの APK 生成をカスタマイズするをご覧ください。
--metadata-file=target-bundle-path:local-file-path メタデータ ファイルを含める場合 App Bundle 内にパッケージ化するように bundletool に指示します。このファイルを使用して、ProGuard マッピングやアプリの DEX ファイルの全リストなどのデータを含めることができます。これらのデータは場合によって、ツールチェーンまたはアプリストアでの他の手順で使用するのにも便利です。

target-bundle-path には、メタデータ ファイルをパッケージ化する App Bundle のルートからの相対パスを指定し、local-file-path には、ローカルのメタデータ ファイル自体へのパスを指定します。

ダウンストリームの APK 生成をカスタマイズする

App Bundle には BundleConfig.pb ファイルが含まれます。このファイルは、Google Play などのアプリストアでバンドルから APK を生成する際に必要なメタデータを提供します。bundletool でこのファイルが作成されますが、BundleConfig.json ファイルにメタデータのいくつかの要素を設定して bundletool build-bundle コマンドに渡すことができます。bundletool が後でこのファイルを変換し、各 App Bundle に含まれる protobuf 版とマージします。

たとえば、どのカテゴリの設定 APK を有効または無効にするかを管理できます。次の BundleConfig.json ファイルの例では、それぞれ異なる言語をターゲットとする設定 APK を無効にします(つまり、全言語のリソースがそれぞれの基本 APK または機能 APK に含まれています)。

{
  "optimizations": {
    "splitsConfig": {
      "splitDimension": [{
        "value": "LANGUAGE",
        "negate": true
      }]
    }
  }
}

BundleConfig.json ファイルには、次のように glob パターンを使用して、APK をパッケージ化する際に圧縮しないファイル形式を指定することもできます。

{
  "compression": {
    "uncompressedGlob": ["res/raw/**", "assets/**.uncompressed"]
  }
}

bundletool はデフォルトで、アプリのネイティブ ライブラリ(Android 6.0 以上)とリソース テーブル(resources.arsc)を圧縮しません。BundleConfig.json で設定できる項目について詳しくは、Proto3 構文を使用して記述された bundletool config.proto ファイルをご覧ください。

App Bundle からアプリをデプロイする

App Bundle をビルドして署名した場合は、bundletool を使用して APK を生成し、デバイスにデプロイします。

コマンドラインからアプリに署名する

アプリの署名に Android Studio は必要ありません。apksigner(APK)または jarsigner(App Bundle)を使用してコマンドラインからアプリに署名するか、ビルド時にデベロッパーに代わって署名するように Gradle を設定できます。どちらの方法でも、下記のとおり keytool を使用して秘密鍵を最初に生成する必要があります。

keytool -genkey -v -keystore my-release-key.jks -keyalg RSA -keysize 2048 -validity 10000 -alias my-alias

上記の例では、キーストアと鍵のパスワード欄、および鍵の「識別名」欄への入力を求められます。次に、キーストアが my-release-key.jks というファイルとして生成され、現在のディレクトリに保存されます(任意の保存先に移動できます)。このキーストアには 10,000 日間有効な鍵が 1 つ含まれます。

これで、下記のセクションで説明するように APK または App Bundle に手動で署名する、または Gradle を設定してビルドプロセス時にアプリに署名することが可能になりました。

コマンドラインから手動でアプリに署名する

コマンドラインから App Bundle に署名する場合は、jarsigner を使用できます。代わりに APK に署名する場合は、下記のとおり zipalignapksigner を使用する必要があります。

  1. Android Studio からコマンドラインを開いて [View] > [Tool Windows] > [Terminal] を選択し、未署名の APK があるディレクトリに移動します。
  2. zipalign を使用して未署名の APK をアライメントします。

    zipalign -v -p 4 my-app-unsigned.apk my-app-unsigned-aligned.apk
    

    zipalign によって、すべての非圧縮データがファイルの先頭を基準とする特定のバイト アライメントで開始されるようになります。これにより、アプリが使用する RAM の量を削減できます。

  3. apksigner を使用して秘密鍵で APK に署名します。

    apksigner sign --ks my-release-key.jks --out my-app-release.apk my-app-unsigned-aligned.apk
    

    この例では、単一のキーストア ファイル my-release-key.jks に保存されている秘密鍵と証明書で署名された APK が my-app-release.apk に出力されます。

    apksigner ツールは、個別の秘密鍵と証明書ファイルを使用した APK ファイルの署名や、複数の署名者を使用した APK の署名を含め、その他の署名オプションもサポートしています。詳細については、apksigner のリファレンスをご覧ください。

    注: apksigner ツールを使用するには、リビジョン 24.0.3 以上の Android SDK Build Tools がインストールされている必要があります。このパッケージは、SDK Manager を使用してアップデートできます。

  4. APK が署名されたことを確認します。

    apksigner verify my-app-release.apk
    

Gradle を設定してアプリに署名する

モジュール レベルの build.gradle.kts ファイルを開き、storeFilestorePasswordkeyAliaskeyPassword の各エントリを含む signingConfigs {} ブロックを追加して、そのオブジェクトをビルドタイプの signingConfig プロパティに渡します。例:

Kotlin

android {
    ...
    defaultConfig { ... }
    signingConfigs {
        create("release") {
            // You need to specify either an absolute path or include the
            // keystore file in the same directory as the build.gradle file.
            storeFile = file("my-release-key.jks")
            storePassword = "password"
            keyAlias = "my-alias"
            keyPassword = "password"
        }
    }
    buildTypes {
        getByName("release") {
            signingConfig = signingConfigs.getByName("release")
            ...
        }
    }
}

Groovy

android {
    ...
    defaultConfig { ... }
    signingConfigs {
        release {
            // You need to specify either an absolute path or include the
            // keystore file in the same directory as the build.gradle file.
            storeFile file("my-release-key.jks")
            storePassword "password"
            keyAlias "my-alias"
            keyPassword "password"
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
            ...
        }
    }
}

Gradle タスクを呼び出してアプリをビルドすると、Gradle がアプリに署名します(zipalign も実行します)。

さらに、署名鍵でリリースビルドを設定したため、そのビルドタイプで「インストール」タスクを使用できます。そのため、installRelease タスクにより、すべてのエミュレータまたはデバイスでリリース APK のビルド、アライメント、署名、インストールが可能になります。

秘密鍵で署名されたアプリを配布する準備が整いましたが、まずアプリを公開する方法の詳細を確認し、Google Play のリリース チェックリストを確認してください。