Bazel チュートリアル: Android アプリを作成する

<ph type="x-smartling-placeholder"></ph> 問題を報告する ソースを表示 夜間 · 7.3 · 7.2 · 7.1 · 7.0 · 6.5

注: 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.xmlsrc/main/java/com/example/bazel/AndroidManifest.xml
Android ソースファイル src/main/java/com/example/bazel/MainActivity.javaGreeter.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_repositorypath 属性で明示的に指定する。

詳細については、Android Native Development Kit を Bazel

api_level は、SDK と NDK で実装されている Android API のバージョンです。 たとえば、Android 6.0 の場合は 23、Android 7.1 の場合は 25 を設定します。回答が「いいえ」の場合 api_level は、デフォルトで使用可能な最大の API レベルに設定されます。 android_sdk_repositoryandroid_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_libraryandroid_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 チュートリアル アプリ」を探して起動します。

Bazel チュートリアル アプリ

図 2. Bazel チュートリアル アプリ。

これで、Bazel でビルドした初めての Android アプリをインストールできました。

なお、mobile-install サブコマンドは --incremental フラグ。これは、 前回のデプロイ以降に変更された部分のみをデプロイします。

また、すぐにアプリを起動する --start_app フラグもサポートされます。 インストールします。

関連情報

詳しくは、次のページをご覧ください。

ご利用をお待ちしております。