Android のルール

ルール

android_binary

android_binary(name, deps, srcs, assets, assets_dir, compatible_with, crunch_png, custom_package, debug_key, debug_signing_keys, debug_signing_lineage_file, densities, deprecation, dex_shards, dexopts, distribs, enable_data_binding, exec_compatible_with, exec_properties, features, incremental_dexing, instruments, javacopts, key_rotation_min_sdk, licenses, main_dex_list, main_dex_list_opts, main_dex_proguard_specs, manifest, manifest_values, multidex, nocompress_extensions, package_id, plugins, proguard_apply_dictionary, proguard_apply_mapping, proguard_generate_mapping, proguard_specs, resource_configuration_filters, resource_files, restricted_to, shrink_resources, tags, target_compatible_with, testonly, visibility)

Android アプリ パッケージ ファイル(.apk)を生成します。

暗黙的な出力ターゲット

  • name.apk: デバッグキーで署名され、 zipalign された Android アプリ パッケージ ファイル。アプリの開発とデバッグに使用できます。デバッグキーで署名したアプリをリリースすることはできません。
  • name_unsigned.apk: 一般公開する前にリリースキーで署名できる、上記のファイルの未署名のバージョン。
  • name_deploy.jar: このターゲットの推移的クロージャを含む Java アーカイブ。

    deploy jar には、このターゲットのランタイム クラスパスを最初から最後まで検索したクラスローダーによって検出されるすべてのクラスが含まれています。

  • name_proguard.jar: name_deploy.jar で ProGuard を実行した結果を含む Java アーカイブ。 この出力は、proguard_specs 属性が指定されている場合にのみ生成されます。
  • name_proguard.map: name_deploy.jar で ProGuard を実行したときのマッピング ファイルの結果。 この出力は、proguard_specs 属性が指定され、proguard_generate_mapping または shrink_resources が設定されている場合にのみ生成されます。

Android ルールの例は、Bazel ソースツリーの examples/android ディレクトリにあります。

引数

属性
name

Name; required

このターゲットの一意の名前。

deps

List of labels; optional

バイナリ ターゲットにリンクする他のライブラリのリスト。許可されるライブラリ タイプは、android_libraryjava_libraryandroid 制約あり)、cc_library ラッピング、または Android ターゲット プラットフォーム用の .so ネイティブ ライブラリの生成です。
srcs

List of labels; optional

ターゲットを作成するために処理されたソースファイルのリスト。

.java タイプの srcs ファイルはコンパイルされます。読みやすくするため、生成された .java ソースファイルの名前を srcs に含めることはおすすめしません。代わりに、以下のように、依存するルール名を srcs に含めます。

.srcjar タイプの srcs ファイルは解凍され、コンパイルされます。(これは、genrule または build 拡張機能を使用して一連の .java ファイルを生成する必要がある場合に便利です)。

assets

List of labels; optional

パッケージ化するアセットのリスト。通常、これは assets ディレクトリ以下のすべてのファイルの glob です。また、他のルール(ファイルを生成するルール)や他のパッケージ内のエクスポートされたファイルも参照できます(それらのファイルがすべて、対応するパッケージの assets_dir ディレクトリに配置されている場合)。
assets_dir

String; optional

assets 内のファイルのパスを示す文字列。 assetsassets_dir のペアはパッケージ化されたアセットを表します。両方の属性を指定するか、まったく指定しないでください。
crunch_png

Boolean; optional; default is True

PNG 自動最適化を行う(または使用しない)。これは、常に行われる 9-patch 処理とは独立しています。これは aapt のバグ(aapt2 で修正済み)に対する非推奨の回避策です。
custom_package

String; optional

Java ソースが生成される Java パッケージ。 デフォルトでは、ルールを含む BUILD ファイルがあるディレクトリからパッケージが推定されます。別のパッケージを指定することもできますが、実行時にのみ検出される他のライブラリとのクラスパス競合が発生する可能性があるため、おすすめしません。
debug_key

Label; optional; default is @bazel_tools//tools/android:debug_keystore

デバッグ apk の署名に使用するデバッグ キーストアを含むファイル。通常、デフォルトの鍵以外の鍵は使用しないため、この属性は省略する必要があります。

警告: 本番環境の鍵は使用しないでください。厳重に保護して、ソースツリーに保存しないでください

debug_signing_keys

List of labels; optional

デバッグ APK の署名に使用するファイル、デバッグ キーストアのリスト。通常、デフォルトの鍵以外の鍵は使用しないため、この属性は省略する必要があります。

警告: 本番環境の鍵は使用しないでください。厳重に保護して、ソースツリーに保存しないでください

debug_signing_lineage_file

Label; optional

debug_signing_keys の署名リネージを含むファイル。通常、デフォルトの鍵以外の鍵は使用しないため、この属性は省略する必要があります。

警告: 本番環境の鍵は使用しないでください。厳重に保護して、ソースツリーに保存しないでください

densities

List of strings; optional

APK のビルド時にフィルタする密度。これにより、指定された画面密度のデバイスでは読み込まれないラスター ドローアブル リソースが削除され、APK サイズを縮小できます。スーパーセットのリストがまだ含まれていない場合は、対応する互換画面のセクションもマニフェストに追加されます。
dex_shards

Integer; optional; default is 1

dex 変換するシャードの数。これにより dex 変換がはるかに高速になりますが、アプリのインストールと起動時間が長くなります。バイナリが大きいほど、より多くのシャードを使用する必要があります。テストを始めるには、25 が妥当な値です。

各シャードは、最終的なアプリで少なくとも 1 つの dex を生成します。そのため、リリース バイナリでは、1 より大きい値に設定することはおすすめしません。

dexopts

List of strings; optional

class.dex を生成する際の dx ツール用の追加のコマンドライン フラグ。 "Make variable" 置換と Bourne シェルトークン化が適用されます。
enable_data_binding

Boolean; optional; default is False

true の場合、このルールは resource_files 属性を通じて含まれるレイアウト リソースのデータ バインディング式を処理します。この設定を行わないと、データ バインディング式によってビルドが失敗します。

データ バインディングを使用して Android アプリをビルドするには、次の操作も行う必要があります。

  1. この属性に推移的に依存するすべての Android ルールに対して、この属性を設定します。これは、依存先がリソースのマージを通じてルールのデータ バインディング式を継承するためです。そのため、これらの式を解析するためにデータ バインディングを使用する必要もあります。
  2. この属性を設定するすべてのターゲットに、データ バインディング ランタイム ライブラリの deps = エントリを追加します。このライブラリの場所は、デポの設定によって異なります。
incremental_dexing

Integer; optional; nonconfigurable; default is -1

デフォルトと --incremental_dexing フラグをオーバーライドして、増分 dex 変換の有無にかかわらずターゲットを強制的にビルドします。
instruments

Label; optional

計測対象の android_binary ターゲット。

この属性が設定されている場合、android_binary はインストルメンテーション テスト用のテスト アプリケーションとして扱われます。android_instrumentation_test ターゲットでは、test_app 属性でこのターゲットを指定できます。

javacopts

List of strings; optional

このターゲット用の追加のコンパイラ オプション。 "Make variable" 置換と Bourne シェルトークン化が適用されます。

これらのコンパイラ オプションは、グローバル コンパイラ オプションの後で javac に渡されます。

key_rotation_min_sdk

String; optional

APK の署名を生成するために APK のローテーションされた署名鍵を使用する最小 Android プラットフォーム バージョン(API レベル)を設定します。APK の元の署名鍵は、以前のすべてのプラットフォーム バージョンで使用されます。
main_dex_list

Label; optional

テキスト ファイルには、クラスファイル名のリストが含まれます。このようなクラスファイルで定義されたクラスは、primaryclasss.dex に配置されます。次に例を示します。
          android/support/multidex/MultiDex$V19.class
          android/support/multidex/MultiDex.class
          android/support/multidex/MultiDexApplication.class
          com/google/common/base/Objects.class
                    
multidex="manual_main_dex" と併用する必要があります。
main_dex_list_opts

List of strings; optional

メインの dex リストビルダーに渡すコマンドライン オプション。 メインの dex リストに含まれるクラスに影響を与えるには、このオプションを使用します。
main_dex_proguard_specs

List of labels; optional

メイン dex に保存する必要があるクラスを決定するために ProGuard 仕様として使用されるファイル。 multidex 属性が legacy に設定されている場合のみ許可されます。
manifest

Label; required

Android マニフェスト ファイルの名前(通常は AndroidManifest.xml)。resource_files またはアセットが定義されている場合は定義する必要があります。
manifest_values

Dictionary: String -> String; optional

マニフェストでオーバーライドする値の辞書。マニフェスト内の ${name} のインスタンスはすべて、この辞書内の名前に対応する値に置き換えられます。applicationId、versionCode、versionName、minSdkVersion、targetSdkVersion、maxSdkVersion も、マニフェスト タグと uses-sdk タグの対応する属性をオーバーライドします。packageName は無視され、指定された applicationId またはマニフェスト内のパッケージから設定されます。manifest_merger が legacy に設定されている場合、applicationId、versionCode、versionName のみが有効になります。
multidex

String; optional; default is "native"

コードを複数の dex ファイルに分割するかどうか。
有効な値:
  • native: dex 64K インデックスの上限を超えた場合に、コードを複数の dex ファイルに分割します。実行時に multidex クラスを読み込むためのネイティブ プラットフォーム サポートを想定しています。この機能は Android L 以降でのみ動作します
  • legacy: dex 64K インデックスの上限を超えた場合に、コードを複数の dex ファイルに分割します。Multidex クラスがアプリコードを介して読み込まれる(ネイティブ プラットフォーム サポートがない)ことが前提となります。
  • manual_main_dex: dex 64K インデックスの上限を超えると、コードを複数の dex ファイルに分割します。メイン dex ファイルの内容は、main_dex_list 属性を使用してテキスト ファイルにクラスのリストを指定し、指定する必要があります。
  • off: インデックスの上限を超えている場合でも、すべてのコードを単一の dex ファイルにコンパイルします。
nocompress_extensions

List of strings; optional

apk で非圧縮のままにするファイル拡張子のリスト。
package_id

Integer; optional; default is 0

このバイナリ内のリソースに割り当てられるパッケージ ID。

詳細については、AAPT2 の --package-id 引数をご覧ください。通常は未設定のままにする必要があります。設定すると、デフォルト値は 127(0x7F)になります。

plugins

List of labels; optional

コンパイル時に実行する Java コンパイラ プラグイン。 plugins 属性で指定されたすべての java_plugin は、このターゲットがビルドされるたびに実行されます。プラグインによって生成されたリソースは、ターゲットの結果 JAR に含まれます。
proguard_apply_dictionary

Label; optional

ProGuard のマッピングとして使用するファイル。 難読化時にクラスやメンバーの名前を変更する際に取得する「単語」を 1 行に 1 つずつ指定したファイル。
proguard_apply_mapping

Label; optional

ProGuard のマッピングとして使用するファイル。 proguard_generate_mapping によって生成されたマッピング ファイル。同じマッピングを新しいビルドに適用するために再利用します。
proguard_generate_mapping

Boolean; optional; nonconfigurable; default is False

Proguard マッピング ファイルを生成するかどうかを指定します。マッピング ファイルは、proguard_specs が指定されている場合にのみ生成されます。このファイルには、元のクラス名と難読化されたクラス名、メソッド名、フィールド名のマッピングがリストされます。

警告: この属性を使用する場合、Proguard 仕様に -dontobfuscate-printmapping のどちらも含めないでください。

proguard_specs

List of labels; optional

Proguard 仕様として使用するファイル。このファイルに、Proguard で使用される仕様のセットを記述します。
resource_configuration_filters

List of strings; optional

apk 内のリソースを「en」設定内のリソースのみに限定する「en」などのリソース設定フィルタのリスト。架空言語を有効にするには、en_XA 架空言語または ar_XB 架空言語(あるいはその両方)を追加します。
resource_files

List of labels; optional

パッケージ化するリソースのリスト。通常、これは res ディレクトリ以下のすべてのファイルの glob です。
生成されたファイル(genrules から)は、ここでもラベルによって参照できます。唯一の制限は、生成される出力が、含まれる他のリソース ファイルと同じ「res」ディレクトリに配置されることです。
shrink_resources

Integer; optional; default is -1

リソース圧縮を実行するかどうか。バイナリで使用されないリソースは、APK から削除されます。これは、ローカル リソース(manifest 属性と resource_files 属性)を使用するルールでのみサポートされ、ProGuard が必要です。 これは、Gradle リソース圧縮ツール(https://developer.android.com/studio/build/soutline-code.html#soutline-resources)とほぼ同じ方法で動作します。

主な違い:

  • values/ のリソースとファイルベースのリソースが削除されます
  • デフォルトで strict mode を使用
  • 未使用の ID リソースの削除は、aapt2 でのみサポートされます。
リソース圧縮が有効になっている場合、実行された分析と削除の詳細を示す name_files/resource_shrinker.log も生成されます。

有効な値は次のとおりです。

  • shrink_resources = 1: Android リソースの圧縮を有効にします。
  • shrink_resources = 0: Android リソースの圧縮をオフにします。
  • shrink_resources = -1: 圧縮は --android_resource_s 動画広告 フラグで制御されます。

aar_import

aar_import(name, deps, data, aar, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, exports, features, licenses, restricted_to, srcjar, tags, target_compatible_with, testonly, visibility)

このルールでは、android_library ルールと android_binary ルールのライブラリとして .aar ファイルを使用できます。

    aar_import(
        name = "google-vr-sdk",
        aar = "gvr-android-sdk/libraries/sdk-common-1.10.0.aar",
    )

    android_binary(
        name = "app",
        manifest = "AndroidManifest.xml",
        srcs = glob(["**.java"]),
        deps = [":google-vr-sdk"],
    )

引数

属性
name

Name; required

このターゲットの一意の名前。

aar

Label; required

このターゲットに依存する Android ターゲットに提供する .aar ファイル。
exports

List of labels; optional

このルールに依存するルールにエクスポートするターゲット。 java_library.exports をご覧ください。
srcjar

Label; optional

AAR 内にコンパイルされた JAR ファイルのソースコードを含む JAR ファイル。

android_library

android_library(name, deps, srcs, data, assets, assets_dir, compatible_with, custom_package, deprecation, distribs, enable_data_binding, exec_compatible_with, exec_properties, exported_plugins, exports, exports_manifest, features, idl_import_root, idl_parcelables, idl_preprocessed, idl_srcs, javacopts, licenses, manifest, neverlink, plugins, proguard_specs, resource_files, restricted_to, tags, target_compatible_with, testonly, visibility)

このルールは、ソースをコンパイルして .jar ファイルにアーカイブします。 Android ランタイム ライブラリ android.jar は、コンパイル クラスパスに暗黙的に配置されます。

暗黙的な出力ターゲット

  • libname.jar: Java アーカイブ。
  • libname-src.jar: ソースを含むアーカイブ(「source jar」)。
  • name.aar: このターゲットの Java アーカイブとリソースを含む Android の「aar」バンドル。推移的閉鎖が含まれていません。

Android ルールの例は、Bazel ソースツリーの examples/android ディレクトリにあります。

次の例は、idl_import_root の設定方法を示しています。//java/bazel/helloandroid/BUILD に以下を含めます。

android_library(
    name = "parcelable",
    srcs = ["MyParcelable.java"], # bazel.helloandroid.MyParcelable

    # MyParcelable.aidl will be used as import for other .aidl
    # files that depend on it, but will not be compiled.
    idl_parcelables = ["MyParcelable.aidl"] # bazel.helloandroid.MyParcelable

    # We don't need to specify idl_import_root since the aidl file
    # which declares bazel.helloandroid.MyParcelable
    # is present at java/bazel/helloandroid/MyParcelable.aidl
    # underneath a java root (java/).
)

android_library(
    name = "foreign_parcelable",
    srcs = ["src/android/helloandroid/OtherParcelable.java"], # android.helloandroid.OtherParcelable
    idl_parcelables = [
        "src/android/helloandroid/OtherParcelable.aidl" # android.helloandroid.OtherParcelable
    ],

    # We need to specify idl_import_root because the aidl file which
    # declares android.helloandroid.OtherParcelable is not positioned
    # at android/helloandroid/OtherParcelable.aidl under a normal java root.
    # Setting idl_import_root to "src" in //java/bazel/helloandroid
    # adds java/bazel/helloandroid/src to the list of roots
    # the aidl compiler will search for imported types.
    idl_import_root = "src",
)

# Here, OtherInterface.aidl has an "import android.helloandroid.CallbackInterface;" statement.
android_library(
    name = "foreign_interface",
    idl_srcs = [
        "src/android/helloandroid/OtherInterface.aidl" # android.helloandroid.OtherInterface
        "src/android/helloandroid/CallbackInterface.aidl" # android.helloandroid.CallbackInterface
    ],

    # As above, idl_srcs which are not correctly positioned under a java root
    # must have idl_import_root set. Otherwise, OtherInterface (or any other
    # interface in a library which depends on this one) will not be able
    # to find CallbackInterface when it is imported.
    idl_import_root = "src",
)

# MyParcelable.aidl is imported by MyInterface.aidl, so the generated
# MyInterface.java requires MyParcelable.class at compile time.
# Depending on :parcelable ensures that aidl compilation of MyInterface.aidl
# specifies the correct import roots and can access MyParcelable.aidl, and
# makes MyParcelable.class available to Java compilation of MyInterface.java
# as usual.
android_library(
    name = "idl",
    idl_srcs = ["MyInterface.aidl"],
    deps = [":parcelable"],
)

# Here, ServiceParcelable uses and thus depends on ParcelableService,
# when it's compiled, but ParcelableService also uses ServiceParcelable,
# which creates a circular dependency.
# As a result, these files must be compiled together, in the same android_library.
android_library(
    name = "circular_dependencies",
    srcs = ["ServiceParcelable.java"],
    idl_srcs = ["ParcelableService.aidl"],
    idl_parcelables = ["ServiceParcelable.aidl"],
)

引数

属性
name

Name; required

このターゲットの一意の名前。

deps

List of labels; optional

リンクする他のライブラリのリスト。許可されるライブラリ タイプは、android_libraryjava_libraryandroid 制約あり)、cc_library ラッピング、または Android ターゲット プラットフォーム用の .so ネイティブ ライブラリの生成です。
srcs

List of labels; optional

ターゲットを作成するために処理された .java ファイルまたは .srcjar ファイルのリスト。

.java タイプの srcs ファイルはコンパイルされます。読みやすくするため、生成された .java ソースファイルの名前を srcs に含めることはおすすめしません。代わりに、以下のように、依存するルール名を srcs に含めます。

.srcjar タイプの srcs ファイルは解凍され、コンパイルされます。(これは、genrule または build 拡張機能を使用して一連の .java ファイルを生成する必要がある場合に便利です)。

srcs を省略すると、deps で指定された依存関係がこのルールからエクスポートされます(依存関係のエクスポートの詳細については、java_library のエクスポートをご覧ください)。ただし、この動作はまもなく非推奨になるため、使用しないでください。

assets

List of labels; optional

パッケージ化するアセットのリスト。通常、これは assets ディレクトリ以下のすべてのファイルの glob です。また、他のルール(ファイルを生成するルール)や他のパッケージ内のエクスポートされたファイルも参照できます(それらのファイルがすべて、対応するパッケージの assets_dir ディレクトリに配置されている場合)。
assets_dir

String; optional

assets 内のファイルのパスを示す文字列。 assetsassets_dir のペアはパッケージ化されたアセットを表します。両方の属性を指定するか、まったく指定しないでください。
custom_package

String; optional

Java ソースが生成される Java パッケージ。 デフォルトでは、ルールを含む BUILD ファイルがあるディレクトリからパッケージが推定されます。別のパッケージを指定することもできますが、実行時にのみ検出される他のライブラリとのクラスパス競合が発生する可能性があるため、おすすめしません。
enable_data_binding

Boolean; optional; default is False

true の場合、このルールは resource_files 属性を通じて含まれるレイアウト リソースのデータ バインディング式を処理します。この設定を行わないと、データ バインディング式によってビルドが失敗します。

データ バインディングを使用して Android アプリをビルドするには、次の操作も行う必要があります。

  1. この属性に推移的に依存するすべての Android ルールに対して、この属性を設定します。これは、依存先がリソースのマージを通じてルールのデータ バインディング式を継承するためです。そのため、これらの式を解析するためにデータ バインディングを使用する必要もあります。
  2. この属性を設定するすべてのターゲットに、データ バインディング ランタイム ライブラリの deps = エントリを追加します。このライブラリの場所は、デポの設定によって異なります。
exported_plugins

List of labels; optional

このライブラリに直接依存するライブラリにエクスポートする java_plugin(アノテーション プロセッサなど)のリスト。

指定された java_plugin のリストは、ライブラリが plugins でこれらのラベルを明示的に宣言した場合と同様に、このライブラリに直接依存するすべてのライブラリに適用されます。

exports

List of labels; optional

exports 属性を介して到達したすべてのルールの終了は、exports を持つターゲットに直接依存するすべてのルールの直接的な依存関係とみなされます。

exports は、それが属するルールの直接的な依存関係ではありません。

exports_manifest

Integer; optional; default is 1

このターゲットに依存する android_binary ターゲットにマニフェスト エントリをエクスポートするかどうか。uses-permissions 属性はエクスポートされません。
idl_import_root

String; optional

このライブラリに含まれる idl ソースを含む Java パッケージ ツリーのルートへのパッケージ相対パス。

このパスは、このライブラリに依存する idl ソースを処理するときに、インポート ルートとして使用されます。

idl_import_root を指定する場合、idl_parcelablesidl_srcs はどちらも、idl_import_root で表すオブジェクトの Java パッケージで指定されたパスに配置する必要があります。idl_import_root が指定されていない場合、idl_parcelablesidl_srcs は両方とも、Java のルート下にあるパッケージで指定されたパスに存在する必要があります。

をご覧ください。

idl_parcelables

List of labels; optional

インポートとして提供する Android IDL 定義のリスト。 これらのファイルは、このライブラリに依存するすべての android_library ターゲットのインポートとして、直接または推移的クロージャを介して利用できるようになりますが、Java への変換またはコンパイルは行いません。

このライブラリの .java ソースに直接対応する .aidl ファイルのみを含めます(例: Parcelable のカスタム実装)。それ以外の場合は、idl_srcs を使用する必要があります。

これらのファイルは、aidl コンパイラが検出できるように適切に配置する必要があります。詳細については、idl_import_root の説明をご覧ください。

idl_preprocessed

List of labels; optional

インポートとして提供する前処理された Android IDL 定義のリスト。 これらのファイルは、このライブラリに依存するすべての android_library ターゲットのインポートとして、直接または推移的クロージャを介して利用できるようになりますが、Java への変換またはコンパイルは行いません。

このライブラリの .java ソースに直接対応する前処理済みの .aidl ファイルのみを含めるようにします(例: Parcelable のカスタム実装)。それ以外の場合、Java インターフェースに変換する必要がある Android IDL 定義には idl_srcs を使用し、前処理されていない AIDL ファイルには idl_parcelable を使用します。

idl_srcs

List of labels; optional

Java インターフェースに変換する Android IDL 定義のリスト。 Java インターフェースが生成されると、srcs の内容とともにコンパイルされます。

これらのファイルは、このライブラリに依存する android_library ターゲットのインポートとして、直接または推移的クロージャを介して使用できます。

これらのファイルは、aidl コンパイラが検出できるように適切に配置する必要があります。詳細については、idl_import_root の説明をご覧ください。

javacopts

List of strings; optional

このターゲット用の追加のコンパイラ オプション。 "Make variable" 置換と Bourne シェルトークン化が適用されます。

これらのコンパイラ オプションは、グローバル コンパイラ オプションの後で javac に渡されます。

manifest

Label; optional

Android マニフェスト ファイルの名前(通常は AndroidManifest.xml)。resource_files またはアセットが定義されている場合は定義する必要があります。

Boolean; optional; default is False

このライブラリはコンパイルにのみ使用し、実行時は使用しません。 neverlink とマークされたルールの出力は、.apk の作成には使用されません。実行中にランタイム環境からライブラリが提供される場合に便利です。
plugins

List of labels; optional

コンパイル時に実行する Java コンパイラ プラグイン。 plugins 属性で指定されたすべての java_plugin は、このターゲットがビルドされるたびに実行されます。プラグインによって生成されたリソースは、ターゲットの結果 JAR に含まれます。
proguard_specs

List of labels; optional

Proguard 仕様として使用するファイル。ここには、ProGuard が使用する仕様のセットを記述します。指定すると、このライブラリに応じて、任意の android_binary ターゲットに追加されます。 ここに記述するファイルには、べき等のルール(-dontnote、-dontwarn、前提条件なし、-keep で始まるルール)のみが含まれている必要があります。他のオプションは、非相互論理的結合を確実にするために、android_binary の proguard_specs にのみ指定できます。
resource_files

List of labels; optional

パッケージ化するリソースのリスト。通常、これは res ディレクトリ以下のすべてのファイルの glob です。
生成されたファイル(genrules から)は、ここでもラベルによって参照できます。唯一の制限は、生成される出力が、含まれる他のリソース ファイルと同じ「res」ディレクトリに配置されることです。

android_instrumentation_test

android_instrumentation_test(name, data, args, compatible_with, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, licenses, local, restricted_to, shard_count, size, support_apks, tags, target_compatible_with, target_device, test_app, testonly, timeout, toolchains, visibility)

android_instrumentation_test ルールは Android インストルメンテーション テストを実行します。これにより、エミュレータが起動し、テスト対象アプリ、テストアプリ、その他の必要なアプリケーションがインストールされ、テスト パッケージで定義されたテストが実行されます。

test_app 属性では、テストを含む android_binary を指定します。この android_binary は、instruments 属性を通じてテスト対象の android_binary アプリを指定します。

# java/com/samples/hello_world/BUILD

android_library(
    name = "hello_world_lib",
    srcs = ["Lib.java"],
    manifest = "LibraryManifest.xml",
    resource_files = glob(["res/**"]),
)

# The app under test
android_binary(
    name = "hello_world_app",
    manifest = "AndroidManifest.xml",
    deps = [":hello_world_lib"],
)
# javatests/com/samples/hello_world/BUILD

android_library(
    name = "hello_world_test_lib",
    srcs = ["Tests.java"],
    deps = [
      "//java/com/samples/hello_world:hello_world_lib",
      ...  # test dependencies such as Espresso and Mockito
    ],
)

# The test app
android_binary(
    name = "hello_world_test_app",
    instruments = "//java/com/samples/hello_world:hello_world_app",
    manifest = "AndroidManifest.xml",
    deps = [":hello_world_test_lib"],
)

android_instrumentation_test(
    name = "hello_world_uiinstrumentation_tests",
    target_device = ":some_target_device",
    test_app = ":hello_world_test_app",
)

引数

属性
name

Name; required

このターゲットの一意の名前。

support_apks

List of labels; optional

インストルメンテーション テストの開始前にデバイスにインストールする他の APK。
target_device

Label; required

テストを実行する android_device

すでに実行中のエミュレータまたは実機でテストを実行するには、次の引数を使用します。--test_output=streamed --test_arg=--device_broker_type=LOCAL_ADB_SERVER --test_arg=--device_serial_number=$device_identifier

test_app

Label; required

テストクラスを含む android_binary ターゲット。 android_binary ターゲットでは、instruments 属性を使用して、テストするターゲットを指定する必要があります。

android_local_test

android_local_test(name, deps, srcs, data, args, compatible_with, custom_package, densities, deprecation, enable_data_binding, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, javacopts, jvm_flags, licenses, local, manifest, manifest_values, nocompress_extensions, plugins, resource_configuration_filters, resource_jars, resource_strip_prefix, restricted_to, runtime_deps, shard_count, size, stamp, tags, target_compatible_with, test_class, testonly, timeout, toolchains, use_launcher, visibility)

このルールは、android_library ルールを(デバイスではなく)ローカルで単体テストするためのものです。Android Robolectric テスト フレームワークと連携して機能します。Robolectric テストの作成について詳しくは、Android Robolectric のサイトをご覧ください。

暗黙的な出力ターゲット

  • name.jar: テストの Java アーカイブ。
  • name-src.jar: ソースを含むアーカイブ(「source jar」)。
  • name_deploy.jar: デプロイに適した Java デプロイ アーカイブ(明示的にリクエストされた場合にのみビルドされます)。

Robolectric を android_local_test で使用するには、Robolectric のリポジトリWORKSPACE ファイルに追加します。

http_archive(
    name = "robolectric",
    urls = ["https://github.com/robolectric/robolectric/archive/<COMMIT>.tar.gz"],
    strip_prefix = "robolectric-<COMMIT>",
    sha256 = "<HASH>",
)
load("@robolectric//bazel:robolectric.bzl", "robolectric_repositories")
robolectric_repositories()
これにより、Robolectric に必要な maven_jar ルールが取得されます。 この場合、各 android_local_test ルールは @robolectric//bazel:robolectric に依存します。下記の例をご覧ください。

android_local_test(
    name = "SampleTest",
    srcs = [
        "SampleTest.java",
    ],
    manifest = "LibManifest.xml",
    deps = [
        ":sample_test_lib",
        "@robolectric//bazel:robolectric",
    ],
)

android_library(
    name = "sample_test_lib",
    srcs = [
         "Lib.java",
    ],
    resource_files = glob(["res/**"]),
    manifest = "AndroidManifest.xml",
)

引数

属性
name

Name; required

このターゲットの一意の名前。

deps

List of labels; optional

テスト対象のライブラリと、ターゲットにリンクする追加のライブラリのリスト。 この属性の推移的クロージャで Android ルールで宣言されたすべてのリソース、アセット、マニフェスト ファイルがテストで使用可能になります。

deps で許可されるルールのリストは、android_libraryaar_importjava_importjava_libraryjava_lite_proto_library です。

srcs

List of labels; optional

ターゲットを作成するために処理されたソースファイルのリスト。以下で説明する特殊なケースを除き、必須です。

.java タイプの srcs ファイルはコンパイルされます。読みやすくするため、生成された .java ソースファイルの名前を srcs に含めることはおすすめしません。代わりに、以下のように、依存するルール名を srcs に含めます。

.srcjar タイプの srcs ファイルは解凍され、コンパイルされます。(これは、genrule または build 拡張機能を使用して一連の .java ファイルを生成する必要がある場合に便利です)。

上記のファイル形式のファイルが 1 つ以上ある限り、他のファイルはすべて無視されます。それ以外の場合は、エラーが発生します。

srcs 属性は必須で、runtime_deps が指定されていない限り、空にできません。

custom_package

String; optional

R クラスが生成される Java パッケージ。デフォルトでは、パッケージはルールを含む BUILD ファイルがあるディレクトリから推定されます。この属性を使用する場合は、test_class も使用する必要があります。
densities

List of strings; optional

APK のビルド時にフィルタする密度。スーパーセット StarlarkListing がまだ含まれていない場合は、対応する compatible-screens セクションもマニフェストに追加されます。
enable_data_binding

Boolean; optional; default is False

true の場合、このルールは、このテストで使用されるデータ バインディングが有効になっている依存関係で使用されるデータ バインディング参照を処理します。この設定を行わないと、データ バインディングの依存関係で必要なバイナリレベルのコードが生成されず、ビルドエラーが発生する可能性があります。
javacopts

List of strings; optional

このライブラリの追加のコンパイラ オプション。 "Make variable" 置換と Bourne シェルトークン化が適用されます。

これらのコンパイラ オプションは、グローバル コンパイラ オプションの後で javac に渡されます。

jvm_flags

List of strings; optional

このバイナリを実行するために生成されたラッパー スクリプトに埋め込むフラグのリスト。 $(location)"Make variable" の置換、Bourne シェルのトークン化が適用されます。

Java バイナリのラッパー スクリプトには、CLASSPATH 定義が含まれており(依存する jar をすべて検索するため)、適切な Java インタープリタを呼び出します。ラッパー スクリプトによって生成されたコマンドラインでは、メインクラスの名前の後に "$@" が続くため、クラス名の後に他の引数を渡すことができます。ただし、JVM で解析する引数は、コマンドラインでクラス名のに指定する必要があります。jvm_flags の内容は、クラス名がリストされる前にラッパー スクリプトに追加されます。

この属性は *_deploy.jar の出力には影響しません

manifest

Label; optional

Android マニフェスト ファイルの名前(通常は AndroidManifest.xml)。resource_files またはアセットが定義されている場合、またはテスト対象のライブラリのいずれかのマニフェストに minSdkVersion タグが含まれている場合に定義する必要があります。
manifest_values

Dictionary: String -> String; optional

マニフェストでオーバーライドする値の辞書。マニフェスト内の ${name} のインスタンスはすべて、この辞書内の名前に対応する値に置き換えられます。applicationIdversionCodeversionNameminSdkVersiontargetSdkVersionmaxSdkVersion も、マニフェスト タグと uses-sdk タグの対応する属性をオーバーライドします。packageName は無視され、applicationId(指定されている場合)またはマニフェスト内のパッケージから設定されます。 manifest_values を使用する場合は、ルールにマニフェストを含める必要はありません。
nocompress_extensions

List of strings; optional

リソース apk に圧縮しないファイル拡張子のリスト。
plugins

List of labels; optional

コンパイル時に実行する Java コンパイラ プラグイン。 このルールがビルドされるたびに、この属性で指定されたすべての java_plugin が実行されます。ライブラリは、exported_plugins を使用する依存関係からプラグインを継承することもできます。プラグインによって生成されたリソースは、このルールで生成される JAR に含まれます。
resource_configuration_filters

List of strings; optional

apk 内のリソースを「en」設定内のリソースのみに限定する「en」などのリソース設定フィルタのリスト。
resource_jars

List of labels; optional

非推奨: 代わりに java_import と deps または runtime_deps を使用してください。
resource_strip_prefix

String; optional

Java リソースから削除するパス プレフィックス。

指定すると、このパス接頭辞は resources 属性内のすべてのファイルから削除されます。リソース ファイルがこのディレクトリにないとエラーになります。指定しない場合(デフォルト)、リソース ファイルのパスは、ソースファイルの Java パッケージと同じロジックに従って決定されます。たとえば、stuff/java/foo/bar/a.txt のソースファイルは foo/bar/a.txt に配置されます。

runtime_deps

List of labels; optional

最終バイナリまたは実行時にのみテストで使用できるようにするライブラリ。 通常の deps と同様に、実行時クラスパスに現れますが、コンパイル時クラスパスには含まれません。実行時にのみ必要な依存関係をここにリストしてください。依存関係分析ツールは、runtime_depsdeps の両方に存在するターゲットを無視する必要があります。
stamp

Integer; optional; default is 0

ビルド情報をバイナリにエンコードするかどうか。取得される値は次のとおりです。
  • stamp = 1: --nostamp ビルドの場合でも、常にビルド情報をバイナリにスタンプします。この設定は、バイナリとそれに依存するダウンストリーム アクションのリモート キャッシュを強制終了する可能性があるため、使用しないでください
  • stamp = 0: ビルド情報を常に定数値に置き換えます。これにより、良好なビルド結果のキャッシュ保存ができます。
  • stamp = -1: ビルド情報の埋め込みは --[no]stamp フラグで制御されます。

依存関係が変更されない限り、スタンプされたバイナリは再ビルドされません

test_class

String; optional

テストランナーによって読み込まれる Java クラス。

この属性では、このテストで実行する Java クラスの名前を指定します。これを設定する必要はめったにありません。この引数を省略すると、android_local_test ルールの name に対応する名前の Java クラスが使用されます。テストクラスには org.junit.runner.RunWith アノテーションを付ける必要があります。

use_launcher

Boolean; optional; default is True

バイナリがカスタム ランチャーを使用するかどうかを指定します。

この属性を false に設定した場合、launcher 属性と関連する --java_launcher フラグがこのターゲットで無視されます。

android_device

android_device(name, cache, compatible_with, default_properties, deprecation, distribs, exec_compatible_with, exec_properties, features, horizontal_resolution, licenses, platform_apks, ram, restricted_to, screen_density, system_image, tags, target_compatible_with, testonly, vertical_resolution, visibility, vm_heap)

このルールは、所定の仕様で構成された Android Emulator を作成します。このエミュレータは、bazel run コマンドを使用するか、生成されたスクリプトを直接実行することで起動できます。独自の android_device ルールを定義するのではなく、既存の android_device ルールに依存することが推奨される。

このルールは、bazel のテストと Blaze 実行の --run_under フラグに適したターゲットです。エミュレータを起動し、テスト/実行対象のターゲットをエミュレータにコピーして、必要に応じてテストまたは実行します。

android_device は、基盤となる system_image が X86 ベースで、最大で I686 CPU アーキテクチャ向けに最適化されている場合、KVM イメージの作成をサポートします。KVM を使用するには、 tags = ['requires-kvm'] android_device ルールに追加します。

暗黙的な出力ターゲット

  • name_images/userdata.dat: エミュレータを起動するためのイメージ ファイルとスナップショットが含まれています
  • name_images/emulator-meta-data.pb: エミュレータを再起動するために必要とするシリアル化された情報が含まれます。

次の例は、android_device の使用方法を示しています。//java/android/helloandroid/BUILDに含まれる:

android_device(
    name = "nexus_s",
    cache = 32,
    default_properties = "nexus_s.properties",
    horizontal_resolution = 480,
    ram = 512,
    screen_density = 233,
    system_image = ":emulator_images_android_16_x86",
    vertical_resolution = 800,
    vm_heap = 32,
)

filegroup(
    name = "emulator_images_android_16_x86",
    srcs = glob(["androidsdk/system-images/android-16/**"]),
)

//java/android/helloandroid/nexus_s.properties の内容:

ro.product.brand=google
ro.product.device=crespo
ro.product.manufacturer=samsung
ro.product.model=Nexus S
ro.product.name=soju

このルールにより、画像と起動スクリプトが生成されます。bazel run :nexus_s -- --action=start を実行すると、エミュレータをローカルで起動できます。このスクリプトは、次のフラグを公開します。

  • --adb_port: adb を公開するポート。エミュレータに adb コマンドを発行する場合は、このポートに adb connect を発行します。
  • --emulator_port: エミュレータの Telnet 管理コンソールを公開するポート。
  • --enable_display: true の場合、ディスプレイでエミュレータを起動します(デフォルトは false)。
  • --action: 開始または強制終了します。
  • --apks_to_install: エミュレータにインストールする APK のリスト

引数

属性
name

Name; required

このターゲットの一意の名前。

cache

Integer; required

エミュレータのキャッシュ パーティションのサイズ(メガバイト単位)。 最小値は 16 MB です。
default_properties

Label; optional

エミュレータの /default.prop に配置される単一のプロパティ ファイル。 これによりルール作成者は、エミュレータを実際のデバイスのように見えるようにさらに構成できます(特に UserAgent 文字列など、アプリやサーバーの動作が特定のデバイスに対して異なる場合があります)。このファイル内のプロパティは、エミュレータで通常設定される読み取り専用プロパティ(ro.product.model など)をオーバーライドします。
horizontal_resolution

Integer; required

エミュレートする水平画面解像度(ピクセル単位)。 最小値は 240 です。
platform_apks

List of labels; optional

起動時にデバイスにインストールされる APK のリスト。
ram

Integer; required

デバイスでエミュレートする RAM の量(メガバイト単位)。 これは、デバイスにインストールされている特定のアプリだけでなく、デバイス全体を対象としています。最小値は 64 MB です。
screen_density

Integer; required

エミュレートする画面の密度(1 インチあたりのピクセル数)。この最小値は 30 ppi です。
system_image

Label; required

次のファイルを含むファイル グループ:
  • system.img: システム パーティション
  • kernel-qemu: エミュレータが読み込む Linux カーネル
  • ramdisk.img: 起動時に使用する initrd イメージ
  • userdata.img: 最初の userdata パーティション
  • source.properties: 画像に関する情報を含むプロパティ ファイル。
これらのファイルは、Android SDK の一部であるか、サードパーティによって提供されます(Intel が x86 イメージを提供するなど)。
vertical_resolution

Integer; required

エミュレートする垂直画面解像度(ピクセル単位)。 最小値は 240 です。
vm_heap

Integer; required

Android が各プロセスに使用する仮想マシンヒープのサイズ(メガバイト単位)。 最小値は 16 MB です。

android_ndk_repository

android_ndk_repository(name, api_level, path, repo_mapping)

Android NDK を使用して、ネイティブ コードでの Android ターゲットのビルドをサポートするように Bazel を構成します。

なお、Android 用のビルドには、WORKSPACE ファイルに android_sdk_repository ルールも必要です。

詳細については、 Bazel での Android NDK の使用に関するドキュメントをご覧ください。

android_ndk_repository(
    name = "androidndk",
)

上記の例では、$ANDROID_NDK_HOME から Android NDK を見つけ、サポートしている最も高い API レベルを検出します。

android_ndk_repository(
    name = "androidndk",
    path = "./android-ndk-r20",
    api_level = 24,
)

上記の例では、./android-ndk-r20 のワークスペース内にある Android NDK を使用しています。JNI コードのコンパイル時には、API レベル 24 ライブラリが使用されます。

cpufeatures

Android NDK には、実行時にデバイスの CPU を検出するために使用できる cpufeatures ライブラリが含まれています。次の例は、Bazel で cpufeatures を使用する方法を示しています。

# jni.cc
#include "ndk/sources/android/cpufeatures/cpu-features.h"
...
# BUILD
cc_library(
    name = "jni",
    srcs = ["jni.cc"],
    deps = ["@androidndk//:cpufeatures"],
)

引数

属性
name

Name; required

このターゲットの一意の名前。

api_level

Integer; optional; nonconfigurable; default is 0

ビルドの対象の Android API レベル。指定しない場合は、インストールされている最も高い API レベルが使用されます。
path

String; optional; nonconfigurable

Android NDK への絶対パスまたは相対パス。この属性または $ANDROID_NDK_HOME 環境変数を設定する必要があります。

Android NDK は Android デベロッパー サイト からダウンロードできます。

repo_mapping

Dictionary: String -> String; optional

ローカル リポジトリ名からグローバル リポジトリ名への辞書。これにより、このリポジトリの依存関係に対するワークスペースの依存関係の解決を制御できます。

たとえば、エントリ "@foo": "@bar" は、このリポジトリが "@foo" に依存しているときは常に("@foo//some:target" への依存関係など)、グローバルに宣言された "@bar""@bar//some:target")内でその依存関係を実際に解決する必要があることを宣言します。

android_sdk_repository

android_sdk_repository(name, api_level, build_tools_version, path, repo_mapping)

ローカルの Android SDK を使用して Android ターゲットのビルドをサポートするように Bazel を構成します。

Bazel 用の Android SDK をセットアップするには、少なくとも WORKSPACE ファイルに「androidsdk」という名前の android_sdk_repository ルールを追加し、$ANDROID_HOME 環境変数に Android SDK のパスを設定します。デフォルトでは、Bazel は Android SDK にインストールされている最新の Android API レベルとビルドツール バージョンを使用します。
android_sdk_repository(
    name = "androidsdk",
)

ビルドを再現可能にするために、path 属性、api_level 属性、build_tools_version 属性を特定の値に設定できます。指定された API レベルまたはビルドツール バージョンが Android SDK にインストールされていない場合、ビルドは失敗します。

android_sdk_repository(
    name = "androidsdk",
    path = "./sdk",
    api_level = 19,
    build_tools_version = "25.0.0",
)

上記の例でも、Android SDK へのワークスペース相対パスを使用しています。これは、Android SDK が Bazel ワークスペースの一部である場合(バージョン管理にチェックインされている場合など)に役立ちます。

サポート ライブラリ

サポート ライブラリは、Android SDK Manager で「Android Support Repository」として入手できます。 これは、Support や AppCompat ライブラリなど、バージョニングされた共通 Android ライブラリのセットで、ローカル Maven リポジトリとしてパッケージ化されています。android_sdk_repository は、これらの各ライブラリに対して、android_binary ターゲットと android_library ターゲットの依存関係で使用できる Bazel ターゲットを生成します。

生成されるターゲットの名前は、Android サポート リポジトリ内のライブラリの Maven 座標から @androidsdk//${group}:${artifact}-${version} の形式で取得されます。次の例は、android_library が v7 appcompat ライブラリのバージョン 25.0.0 に依存する方法を示しています。

android_library(
    name = "lib",
    srcs = glob(["*.java"]),
    manifest = "AndroidManifest.xml",
    resource_files = glob(["res/**"]),
    deps = ["@androidsdk//com.android.support:appcompat-v7-25.0.0"],
)

引数

属性
name

Name; required

このターゲットの一意の名前。

api_level

Integer; optional; nonconfigurable; default is 0

デフォルトでビルドする Android API レベル。指定しない場合は、インストールされている最も高い API レベルが使用されます。

特定のビルドで使用される API レベルは、android_sdk フラグでオーバーライドできます。android_sdk_repository は、この属性が指定されているかどうかにかかわらず、SDK にインストールされている各 API レベルに対して @androidsdk//:sdk-${level} という名前の android_sdk ターゲットを作成します。たとえば、デフォルト以外の API レベルに対してビルドする場合は、bazel build --android_sdk=@androidsdk//:sdk-19 //java/com/example:app のようにします。

android_sdk_repository によって生成されたすべての android_sdk ターゲットを表示するには、bazel query "kind(android_sdk, @androidsdk//...)" を実行します。

build_tools_version

String; optional; nonconfigurable

Android SDK 内から使用する Android ビルドツールのバージョン。指定しなかった場合、インストールされている最新のビルドツール バージョンが使用されます。

Bazel には、ビルドツール バージョン 30.0.0 以降が必要です。

path

String; optional; nonconfigurable

Android SDK への絶対パスまたは相対パス。この属性または $ANDROID_HOME 環境変数を設定する必要があります。

Android SDK は Android デベロッパー サイトからダウンロードできます。

repo_mapping

Dictionary: String -> String; optional

ローカル リポジトリ名からグローバル リポジトリ名への辞書。これにより、このリポジトリの依存関係に対するワークスペースの依存関係の解決を制御できます。

たとえば、エントリ "@foo": "@bar" は、このリポジトリが "@foo" に依存しているときは常に("@foo//some:target" への依存関係など)、グローバルに宣言された "@bar""@bar//some:target")内でその依存関係を実際に解決する必要があることを宣言します。