注: Android アプリのビルドに Bazel を使用する場合、既知の制限事項があります。 既知の問題の一覧については、GitHub の team-Android ホットリストをご覧ください。Bazel チームとオープンソース ソフトウェア(OSS)のコントリビューターは、既知の問題への対処に積極的に取り組んでいますが、Android Studio では Bazel プロジェクトを正式にサポートしていない点に注意する必要があります。
このチュートリアルでは、Bazel を使用して簡単な Android アプリを作成する方法について説明します。
Bazel は、以下を使用した Android アプリのビルドをサポートしています。 Android のルール。
このチュートリアルは、Windows、macOS、Linux のユーザーを対象としており、 Bazel または Android アプリ開発の経験が必要です。必ずしも このチュートリアルでは、Android コードを記述します。
学習内容
このチュートリアルでは、次の方法について学びます。
- Bazel と Android Studio をインストールして環境をセットアップする サンプル プロジェクトをダウンロードします。
- ソースコードを含む Bazel ワークスペースをセットアップする
そのアプリの最上位のレベルを特定する
WORKSPACE
ファイルと、 ディレクトリにあります。 WORKSPACE
ファイルを更新して、必要なファイルへの参照を含めます。 依存関係が存在します。BUILD
ファイルを作成します。- Bazel を使用してアプリをビルドします。
- Android Emulator または実機にアプリをデプロイして実行します。
始める前に
Bazel をインストールする
チュートリアルを開始する前に、次のソフトウェアをインストールしてください。
- Bazel。インストールするには、インストール手順に沿って操作してください。
- Android Studioインストールするには、Android スマートフォンから 。 設定ウィザードを実行して SDK をダウンロードし、環境を構成します。
- (省略可)Git。
git
を使用して Android アプリ プロジェクトをダウンロードします。
サンプル プロジェクトを取得する
サンプル プロジェクトでは、基本的な Android アプリ プロジェクトを使用します。 Bazel のサンプル リポジトリ。
このアプリには、クリックすると挨拶メッセージを出力するボタンが 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 を使用したビルド
ワークスペースを設定する
ワークスペースとは、ファイルの内容が
ソースファイルがあり、WORKSPACE
ファイルが
されます。
WORKSPACE
ファイルは空であるか、外部への参照が含まれている可能性があります。
依存関係のリストをご覧ください。
まず、次のコマンドを実行して空の WORKSPACE
ファイルを作成します。
OS | コマンド |
---|---|
Linux、macOS | touch WORKSPACE |
Windows(コマンド プロンプト) | type nul > WORKSPACE |
Windows(PowerShell) | New-Item WORKSPACE -ItemType file |
Bazel の実行
次のコマンドを使用して、Bazel が正しく実行されているかどうかを確認できます。
bazel info workspace
Bazel が現在のディレクトリのパスを出力したら、完了です。もし
WORKSPACE
ファイルが存在しない場合は、次のようなエラー メッセージが表示されることがあります。
ERROR: The 'info' command is only supported from within a workspace.
Android SDK との統合
Bazel で Android SDK を実行する必要がある
ビルドツール
アプリを構築しました。つまり、
WORKSPACE
ファイルの場所を把握して、Bazel がその場所を見つけられるようにします。
WORKSPACE
ファイルに次の行を追加します。
android_sdk_repository(name = "androidsdk")
これにより、ANDROID_HOME
で参照されるパスで Android SDK が使用されます。
自動的に検出され、最も高い API レベルと
その場所にインストールされている最新バージョンのビルドツール。
ANDROID_HOME
変数を Android SDK の場所に設定できます。検索
Android Studio の SDK を使用してインストールされた 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 SDK の絶対パスを明示的に指定することもできます。
API レベル、使用するビルドツールのバージョンを指定します。path
api_level
および build_tools_version
属性。api_level
の場合、および
build_tools_version
が指定されていない場合、android_sdk_repository
ルールが適用されます。
SDK で入手できるそれぞれの最新バージョンを使用してください。必要に応じて、
組み合わせて使用する必要がありますが、SDK に存在していれば、
例:
android_sdk_repository(
name = "androidsdk",
path = "/path/to/Android/sdk",
api_level = 25,
build_tools_version = "30.0.3"
)
Windows では、path
属性には、混合スタイルのパスを使用する必要があります。
スラッシュが付いた Windows パスです。
android_sdk_repository(
name = "androidsdk",
path = "c:/path/to/Android/sdk",
)
省略可: ネイティブ コードを Android アプリにコンパイルする場合は、
また、Android Studio SDK を
NDK
WORKSPACE
ファイルに次の行を追加して、Bazel の場所を指示します。
android_ndk_repository(name = "androidndk")
android_sdk_repository
と同様に、Android NDK へのパスが推測されます。
デフォルトで ANDROID_NDK_HOME
環境変数から設定されます。パスには、
android_ndk_repository
の path
属性で明示的に指定する。
詳細については、Android Native Development Kit を Bazel。
api_level
は、SDK と NDK で実装されている Android API のバージョンです。
たとえば、Android 6.0 の場合は 23、Android 7.1 の場合は 25 を設定します。回答が「いいえ」の場合
api_level
は、デフォルトで使用可能な最大の API レベルに設定されます。
android_sdk_repository
と android_ndk_repository
。
SDK と NDK で API レベルを同じ値に設定する必要はありません。 このページ には、Android リリースから NDK サポート API レベルへのマップが含まれています。
BUILD ファイルを作成する
BUILD
ファイルには、関係を記述する
aapt
からコンパイルされた Android リソースや、
javac
のクラスファイルとその依存関係。これらの依存関係は、
ソースファイル(Java、C++)をワークスペースやその他のビルド出力に含めます。BUILD
ファイル
Starlark という言語で記述されています。
BUILD
ファイルは、パッケージ階層と呼ばれる Bazel のコンセプトの一部です。
パッケージ階層は、ディレクトリをオーバーレイする論理構造
おすすめします。各パッケージは
関連するソースファイルのセットを含むディレクトリ(およびそのサブディレクトリ)
と BUILD
ファイルです。パッケージにはサブディレクトリも含まれます。
独自の BUILD
ファイルを含むファイル。[package name] はアプリケーションのパス
WORKSPACE
に対応する BUILD
ファイル。
Bazel のパッケージ階層は、概念的に Java の
BUILD
ファイルがある Android アプリ ディレクトリのパッケージ階層
ただし、ディレクトリは同じように構成されていてもかまいません。
このチュートリアルのシンプルな Android アプリの場合、src/main/
にあるソースファイル。
単一の Bazel パッケージで構成されています。より複雑なプロジェクトでは、多数のネストされた
提供します。
android_library ルールを追加する
BUILD
ファイルには、Bazel のさまざまなタイプの宣言が含まれています。「
最も重要なタイプは
build rule は、
Bazel: 一連のソースから中間または最終的なソフトウェア出力をビルドする方法
使用できます。Bazel ではビルドルールが 2 つ用意されています。
android_library
、
android_binary
:
Android アプリを作成します。
このチュートリアルでは、最初に
Bazel に Android ライブラリのビルドを指示する android_library
ルール
モジュール
リソース ファイルから削除します。次に
Android アプリ パッケージのビルド方法を Bazel に指示する android_binary
ルール。
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
属性は greeter_activity
ルールの出力を参照しています。
先ほどの BUILD
ファイルに追加したものが表示されます。つまり、Bazel がビルドを実行したときに
このルールの出力が最初にチェックされて、
greeter_activity
ライブラリ ルールがビルドされ、最新です。存在しない場合、Bazel
ビルドし、その出力を使用してアプリケーション パッケージ ファイルをビルドします。
ファイルを保存して閉じます。
アプリを作成する
アプリを作成してみましょう。次のコマンドを実行して
android_binary
目標:
bazel build //src/main:app
build
サブコマンドは、Bazel に次のビルドを指示します。
使用します。target は、内部のビルドルールの名前として
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 では、中間ビルド オペレーションと最終ビルド オペレーションの出力がセットにまとめられています
ユーザーごと、ワークスペースごとの出力ディレクトリがあります。これらのディレクトリはシンボリック リンクされた
プロジェクト ディレクトリの最上位にある次の場所から
WORKSPACE
は次のとおりです。
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 |
アプリを実行する
接続した Android デバイスまたはエミュレータに、
コマンドラインで bazel
mobile-install
コマンドを実行できます。このコマンドでは
Android Debug Bridge(adb
)を使用してデバイスと通信する。次を設定する必要があります
Android Debug の手順に沿って、デバイスで adb
を使用してください。
ブリッジしてからデプロイします。マイページ
Android に含まれている Android Emulator にアプリをインストールすることもできます。
できます。以下のコマンドを実行する前に、エミュレータが実行されていることを確認してください。
次の情報を入力します。
bazel mobile-install //src/main:app
次に、「Bazel チュートリアル アプリ」を探して起動します。
図 2. Bazel チュートリアル アプリ。
これで、Bazel でビルドした初めての Android アプリをインストールできました。
なお、mobile-install
サブコマンドは
--incremental
フラグ。これは、
前回のデプロイ以降に変更された部分のみをデプロイします。
また、すぐにアプリを起動する --start_app
フラグもサポートされます。
インストールします。
関連情報
詳しくは、次のページをご覧ください。
- GitHub で未解決の問題
- モバイル インストールの詳細
- Maven から AppCompat、Guava、JUnit などの外部依存関係を統合する rules_jvm_external を使用したリポジトリ
- robolectric-bazel を使用して Robolectric テストを実行する 統合されています
- Android インストルメンテーション テストでアプリをテストする
- NDK を使用して C / C++ コードを Android アプリに統合する
- 以下の Bazel プロジェクトの例をご覧ください。
ご利用をお待ちしております。