コマンドラインからのアプリのビルド

Gradle ラッパー コマンドライン ツールを使用した Android プロジェクト。

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 エミュレータを使用する場合は、Android Studio で Android 仮想デバイス(AVD)を作成する必要があります。

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

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

    emulator -avd avd_name

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

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

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

        adb install path/to/your_app.apk
        

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

詳しくは、Android エミュレータでのアプリの実行をご覧ください。

物理デバイスにアプリをデプロイする

デバイスでアプリを実行するには、そのデバイスで [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 を生成するために使用するコマンドライン ツールです。

そのため、アプリを bundletool でテストして Google Play がどのように APK を生成するかを再現すると役に立ちますが、通常は App Bundle 自体をビルドするのに bundletool を呼び出す必要はありません。代わりに、前のセクションで説明した Android Studio または Gradle タスクを使用してください。

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

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

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

bundletool では、アプリのマニフェストとリソースなどアプリ プロジェクトの特定の情報が、「protobuf」とも呼ばれるファイル拡張子が *.pbGoogle の Protocol Buffer 形式である必要があります。protobuf は、構造化データをシリアル化するためのメカニズムです。言語やプラットフォームに依存せず、拡張することも可能です。XML に似ていますが、規模、処理速度、複雑さの点で XML より優れています。

AAPT2 をダウンロード

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

AAPT2 を Google の Maven Repository からダウンロードする方法は以下のとおりです。

  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 構文を使用して書かれた bundletoolconfig.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 のリリース チェックリストを確認してください。