6 月 3 日の「#Android11: The Beta Launch Show」にぜひご参加ください。

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

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

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

  • Windows の場合:
    gradlew task-name
  • Mac または Linux の場合:
    ./gradlew task-name

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

    gradlew tasks
    

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

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

ビルドタイプの概要

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

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

build.gradle ファイルでカスタム ビルドタイプを定義し、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 Emulator を使用するには、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 タスクを実行します。たとえば、次のコマンドではベース モジュールのデバッグ バージョンの App Bundle をビルドします。

./gradlew :base:bundleDebug
    

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

別の手順で App Bundle に署名する場合は、jarsigner を使用してコマンドラインで App Bundle に署名できます。

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 のバージョン]/aapt2-[AAPT2 のバージョン]-[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 bundletool が App Bundle をビルドするために使用するモジュール 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 ファイルを開き、storeFilestorePasswordkeyAliaskeyPassword のエントリを含む signingConfigs {} ブロックを追加して、そのオブジェクトをビルドタイプの signingConfig プロパティに渡します。次に例を示します。

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 のリリース チェックリストを確認してください。