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

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

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

  • Windows コマンドシェル:

    gradlew task-name
    
  • Mac、Linux、Windows PowerShell の場合:

    ./gradlew task-name
    

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

gradlew tasks

このページの残りの部分では、Gradle ラッパーを使用してアプリをビルドして実行するための基本事項について説明します。Android ビルドの設定方法については、ビルドを構成するをご覧ください。

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

ビルドタイプの概要

デフォルトでは、すべての Android アプリに 2 つのビルドタイプが用意されています。1 つはアプリのデバッグ用(debug ビルド)、もう 1 つはユーザーへのアプリのリリース用(release ビルド)です。各ビルドの結果として得られる出力は、アプリをデバイスにデプロイする前に証明書で署名する必要があります。デバッグビルドは、SDK Tools によって提供されるデバッグ鍵で自動的に署名されます(この鍵は安全ではなく、Google Play ストアに公開することはできません)。リリースビルドは、独自の秘密鍵で署名する必要があります。

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

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

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

アプリをパッケージ化して Google Play Console にアップロードするには、App Bundle をビルドするのが最善の方法ですが、デバッグビルドを簡単にテストする場合や、デプロイ可能なアーティファクトとしてアプリを他のユーザーと共有する場合は、APK をビルドする方が適しています。

デバッグ APK をビルドする

アプリのテストとデバッグをすぐに実施するには、デバッグ APK をビルドします。デバッグ APK は、SDK Tools によって提供されるデバッグ鍵で署名され、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 <var>avd_name</var>
    

    AVD 名が不明な場合は、emulator -list-avds を実行します。

  2. これで、デバッグ APK をビルドする方法に関するセクションで説明した Gradle インストール タスクか、adb ツールのいずれかを使用して、アプリをインストールできるようになりました。

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

    adb install <var>path/to/your_app</var>.apk
    

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

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

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

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

デバイスをセットアップして 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

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

App Bundle への署名を別のステップとして行う場合は、jarsigner を使用してコマンドラインから App Bundle に署名できます。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 はコンパイルされたさまざまなリソースを単一の APK にリンクします。このとき、次の例に示すように、--proto-format フラグを追加して、アプリのマニフェストとコンパイルされたリソースを protobuf 形式に変換するよう AAPT2 に指示します。

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

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

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

ファイルまたはディレクトリ 説明
manifest/AndroidManifest.xml protobuf 形式のモジュールのマニフェスト。
dex/... アプリのコンパイル済み DEX ファイルを 1 つ以上含むディレクトリ。これらのファイルには、classes.dex、classes2.dex、classes3.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 で構成できる内容の詳細については、bundletool config.proto ファイルを調べてください。このファイルは Proto3 構文を使用して記述されています。

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

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

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

アプリに署名するために Android Studio は必要ありません。コマンドラインから、APK の場合は apksigner、App Bundle の場合は jarsigner を使用してアプリに署名できます。また、ビルド中に署名するように 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 に署名する場合は、zipalign と apksigner を使用する必要があります。

  1. コマンドラインを開き(Android Studio で [View] > [ツール ウィンドウ] > [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
    

    この例では、1 つのキーストア ファイル my-release-key.jks に保存されている秘密鍵と証明書を使用して APK に署名し、署名済みの APK を my-app-release.apk に出力します。

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

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

    apksigner verify my-app-release.apk
    

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

モジュール レベルの build.gradle.kts ファイルを開き、storeFile、storePassword、keyAlias、keyPassword の各エントリを含む 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 のリリース チェックリストを確認する必要があります。