このチュートリアルでは、Bazel を使用してシンプルな Android アプリを作成する方法について説明します。
Bazel は、Android ルールを使用した Android アプリのビルドをサポートしています。
このチュートリアルは Windows、macOS、Linux ユーザーを対象としており、Bazel や Android アプリ開発の経験は必要ありません。このチュートリアルでは、Android コードを記述する必要はありません。
学習内容
このチュートリアルでは、次の方法について学習します。
- Bazel と Android Studio をインストールし、サンプル プロジェクトをダウンロードして、環境をセットアップします。
- アプリのソースコードと、ワークスペース ディレクトリの最上位を識別する
MODULE.bazelファイルを含む Bazel ワークスペースを設定します。 - Android SDK などの必要な外部依存関係への参照を含むように
MODULE.bazelファイルを更新します。 BUILDファイルを作成します。- Bazel を使用してアプリをビルドします。
- Android エミュレータまたは実機にアプリをデプロイして実行します。
始める前に
Bazel をインストールする
チュートリアルを開始する前に、次のソフトウェアをインストールします。
- Bazel. インストールするには、インストール手順に沿って操作してください。
- Android Studio。インストールするには、Android Studio をダウンロードするの手順に沿って操作します。セットアップ ウィザードを実行して SDK をダウンロードし、環境を構成します。
- (省略可)Git。
gitを使用して Android アプリ プロジェクトをダウンロードします。
サンプル プロジェクトを取得する
サンプル プロジェクトには、Bazel のサンプル リポジトリにある基本的な Android アプリ プロジェクトを使用します。
このアプリには、クリックすると挨拶文を出力するボタンが 1 つあります。

図 1. Android アプリボタンの挨拶。
git を使用してリポジトリのクローンを作成します(または、ZIP ファイルを直接ダウンロードします)。
git clone https://github.com/bazelbuild/examplesこのチュートリアルのサンプル プロジェクトは examples/android/tutorial にあります。このチュートリアルの残りの部分では、このディレクトリでコマンドを実行します。
ソースファイルを確認する
アプリのソースファイルを見てみましょう。
.
├── README.md
└── src
└── main
├── AndroidManifest.xml
└── java
└── com
└── example
└── bazel
├── AndroidManifest.xml
├── Greeter.java
├── MainActivity.java
└── res
├── layout
│ └── activity_main.xml
└── values
├── colors.xml
└── strings.xml
主なファイルとディレクトリは次のとおりです。
| 名前 | 場所 |
|---|---|
| Android マニフェスト ファイル | src/main/AndroidManifest.xml、src/main/java/com/example/bazel/AndroidManifest.xml |
| Android ソースファイル | src/main/java/com/example/bazel/MainActivity.java、Greeter.java |
| リソース ファイル ディレクトリ | src/main/java/com/example/bazel/res/ |
Bazel を使用したビルド
ワークスペースを設定する
ワークスペースは、1 つ以上のソフトウェア プロジェクトのソースファイルを含むディレクトリで、ルートに MODULE.bazel ファイルがあります。
MODULE.bazel ファイルは空の場合もあれば、プロジェクトのビルドに必要な外部依存関係への参照が含まれている場合もあります。
まず、次のコマンドを実行して空の MODULE.bazel ファイルを作成します。
| OS | コマンド |
|---|---|
| Linux、macOS | touch MODULE.bazel |
| Windows(コマンド プロンプト) | type nul > MODULE.bazel |
| Windows(PowerShell) | New-Item MODULE.bazel -ItemType file |
Bazel の実行
次のコマンドを使用して、Bazel が正しく実行されているかどうかを確認できます。
bazel info workspaceBazel が現在のディレクトリのパスを出力したら、準備完了です。MODULE.bazel ファイルが存在しない場合は、次のようなエラー メッセージが表示されることがあります。
ERROR: The 'info' command is only supported from within a workspace.
Android SDK と統合する
Bazel は、アプリをビルドするために Android SDK のビルドツールを実行する必要があります。そのため、Bazel がビルドツールの場所を認識できるように、MODULE.bazel ファイルに情報を追加する必要があります。
MODULE.bazel ファイルに次の行を追加します。
bazel_dep(name = "rules_android", version = "0.5.1")
これにより、ANDROID_HOME 環境変数で参照されるパスにある Android SDK が使用され、その場所でインストールされている最も高い API レベルと最新バージョンのビルドツールが自動的に検出されます。
ANDROID_HOME 変数に Android SDK の場所を設定できます。Android Studio の SDK Manager を使用して、インストールした SDK のパスを確認します。SDK がデフォルトの場所にインストールされている場合は、次のコマンドを使用して ANDROID_HOME 変数を設定できます。
| OS | コマンド |
|---|---|
| Linux | export ANDROID_HOME=$HOME/Android/Sdk/ |
| macOS | export ANDROID_HOME=$HOME/Library/Android/sdk |
| Windows(コマンド プロンプト) | set ANDROID_HOME=%LOCALAPPDATA%\Android\Sdk |
| Windows(PowerShell) | $env:ANDROID_HOME="$env:LOCALAPPDATA\Android\Sdk" |
上記のコマンドは、現在のシェル セッションでのみ変数を設定します。永続的にするには、次のコマンドを実行します。
| OS | コマンド |
|---|---|
| Linux | echo "export ANDROID_HOME=$HOME/Android/Sdk/" >> ~/.bashrc |
| macOS | echo "export ANDROID_HOME=$HOME/Library/Android/Sdk/" >> ~/.bashrc |
| Windows(コマンド プロンプト) | setx ANDROID_HOME "%LOCALAPPDATA%\Android\Sdk" |
| Windows(PowerShell) | [System.Environment]::SetEnvironmentVariable('ANDROID_HOME', "$env:LOCALAPPDATA\Android\Sdk", [System.EnvironmentVariableTarget]::User) |
省略可: ネイティブ コードを Android アプリにコンパイルする場合は、Android NDK もダウンロードし、MODULE.bazel ファイルに次の行を追加して rules_android_ndk を使用する必要があります。
bazel_dep(name = "rules_android_ndk", version = "0.1.2")
詳細については、Bazel で Android Native Development Kit を使用するをご覧ください。
SDK と NDK の API レベルを同じ値に設定する必要はありません。このページには、Android リリースから NDK でサポートされる API レベルへのマップが含まれています。
BUILD ファイルを作成する
BUILD ファイルは、aapt からのコンパイル済み Android リソースや javac からのクラスファイルなど、一連のビルド出力とその依存関係の関係を記述します。これらの依存関係は、ワークスペース内のソースファイル(Java、C++)やその他のビルド出力である場合があります。BUILD ファイルは、Starlark という言語で記述されています。
BUILD ファイルは、Bazel のパッケージ階層と呼ばれる概念の一部です。パッケージ階層は、ワークスペースのディレクトリ構造にオーバーレイされる論理構造です。各パッケージは、関連する一連のソースファイルと BUILD ファイルを含むディレクトリ(とそのサブディレクトリ)です。パッケージには、独自の BUILD ファイルを含むサブディレクトリを除く、すべてのサブディレクトリも含まれます。パッケージ名は、MODULE.bazel ファイルに対する BUILD ファイルの相対パスです。
Bazel のパッケージ階層は、BUILD ファイルが配置されている Android アプリ ディレクトリの Java パッケージ階層とは概念的に異なります。ただし、ディレクトリの構成は同じになる場合があります。
このチュートリアルの簡単な Android アプリでは、src/main/ のソースファイルは単一の Bazel パッケージで構成されています。より複雑なプロジェクトには、多くのネストされたパッケージが含まれている場合があります。
android_library ルールを追加する
BUILD ファイルには、Bazel のさまざまな種類の宣言が含まれています。最も重要なタイプはビルドルールです。これは、一連のソースファイルやその他の依存関係から中間または最終的なソフトウェア出力をビルドする方法を Bazel に指示します。Bazel には、Android アプリのビルドに使用できる 2 つのビルドルール(android_library と android_binary)が用意されています。
このチュートリアルでは、まず android_library ルールを使用して、アプリのソースコードとリソース ファイルから Android ライブラリ モジュールをビルドするよう Bazel に指示します。次に、android_binary ルールを使用して、Android アプリケーション パッケージのビルド方法を Bazel に指示します。
src/main/java/com/example/bazel ディレクトリに新しい BUILD ファイルを作成し、新しい android_library ターゲットを宣言します。
src/main/java/com/example/bazel/BUILD:
package(
default_visibility = ["//src:__subpackages__"],
)
android_library(
name = "greeter_activity",
srcs = [
"Greeter.java",
"MainActivity.java",
],
manifest = "AndroidManifest.xml",
resource_files = glob(["res/**"]),
)
android_library ビルドルールには、ソースファイルからライブラリ モジュールをビルドするために Bazel が必要とする情報を指定する一連の属性が含まれています。また、ルールの名前は greeter_activity です。この名前は、android_binary ルールの依存関係としてルールを参照するために使用します。
android_binary ルールを追加する
android_binary ルールは、アプリの Android アプリ パッケージ(.apk ファイル)をビルドします。
src/main/ ディレクトリに新しい BUILD ファイルを作成し、新しい android_binary ターゲットを宣言します。
src/main/BUILD:
android_binary(
name = "app",
manifest = "AndroidManifest.xml",
deps = ["//src/main/java/com/example/bazel:greeter_activity"],
)
ここで、deps 属性は、上記の BUILD ファイルに追加した greeter_activity ルールの出力を参照します。つまり、Bazel がこのルールの出力をビルドするときに、まず greeter_activity ライブラリ ルールの出力がビルド済みで最新かどうかを確認します。そうでない場合、Bazel はそれをビルドし、その出力を使用してアプリケーション パッケージ ファイルをビルドします。
ここでファイルを保存して閉じます。
アプリをビルドする
アプリをビルドしてみましょう。次のコマンドを実行して android_binary ターゲットをビルドします。
bazel build //src/main:appbuild サブコマンドは、後に続くターゲットをビルドするように Bazel に指示します。ターゲットは、BUILD ファイル内のビルドルールの名前として、ワークスペース ディレクトリに対するパッケージ パスとともに指定されます。この例では、ターゲットは app で、パッケージ パスは //src/main/ です。
コマンドラインの現在の作業ディレクトリとターゲットの名前によっては、パッケージ パスまたはターゲット名を省略できる場合があります。ターゲット ラベルとパスの詳細については、ラベルをご覧ください。
Bazel がサンプルアプリのビルドを開始します。ビルドプロセス中、次のような出力が表示されます。
INFO: Analysed target //src/main:app (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //src/main:app up-to-date:
bazel-bin/src/main/app_deploy.jar
bazel-bin/src/main/app_unsigned.apk
bazel-bin/src/main/app.apk
ビルド出力を探す
Bazel は、中間ビルド オペレーションと最終ビルド オペレーションの両方の出力を、ユーザーごと、ワークスペースごとの出力ディレクトリのセットに配置します。これらのディレクトリは、プロジェクト ディレクトリの最上位にある次の場所からシンボリック リンクされています。ここで、MODULE.bazel ファイルは次の場所にあります。
bazel-binには、バイナリ実行可能ファイルやその他の実行可能なビルド出力が保存されます。bazel-genfilesは、Bazel ルールによって生成された中間ソースファイルを保存します。bazel-outには他の種類のビルド出力が保存されます
Bazel は、android_binary ルールを使用して生成された Android .apk ファイルを bazel-bin/src/main ディレクトリに保存します。ここで、サブディレクトリ名 src/main は Bazel パッケージの名前から派生します。
コマンド プロンプトで、このディレクトリの内容を一覧表示し、app.apk ファイルを見つけます。
| OS | コマンド |
|---|---|
| Linux、macOS | ls bazel-bin/src/main |
| Windows(コマンド プロンプト) | dir bazel-bin\src\main |
| Windows(PowerShell) | ls bazel-bin\src\main |
アプリを実行する
bazel
mobile-install コマンドを使用して、接続された Android デバイスまたはエミュレータにコマンドラインからアプリをデプロイできるようになりました。このコマンドは、Android Debug Bridge(adb)を使用してデバイスと通信します。デプロイする前に、Android Debug Bridge の手順に沿って adb を使用するようにデバイスを設定する必要があります。Android Studio に含まれている Android エミュレータにアプリをインストールすることもできます。次のコマンドを実行する前に、エミュレータが実行されていることを確認してください。
次の情報を入力します。
bazel mobile-install //src/main:app次に、[Bazel Tutorial App] を探して起動します。

図 2. Bazel チュートリアル アプリ。
おめでとうございます。これで、Bazel でビルドされた最初の Android アプリがインストールされました。
mobile-install サブコマンドは、前回のデプロイ以降に変更されたアプリの部分のみをデプロイするために使用できる --incremental フラグもサポートしています。
また、インストール直後にアプリを起動する --start_app フラグもサポートしています。
関連情報
詳しくは、以下のページをご覧ください。
- GitHub で問題を報告する
- mobile-install の詳細
- rules_jvm_external を使用して、Maven リポジトリから AppCompat、Guava、JUnit などの外部依存関係を統合します。
- robolectric-bazel 統合を使用して Robolectric テストを実行します。
- Android インストルメンテーション テストでアプリをテストする
- NDK を使用して C / C++ コードを Android アプリに統合する
- Bazel のその他のサンプル プロジェクトについては、以下をご覧ください。
Happy building!