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: デバッグキーで署名され、zipaligned された Android アプリ パッケージ ファイル。アプリの開発とデバッグに使用できます。デバッグキーで署名されたアプリをリリースすることはできません。
  • name_unsigned.apk: 上記のファイルの未署名バージョン。一般公開前にリリースキーで署名できます。
  • name_deploy.jar: このターゲットの推移閉包を含む Java アーカイブ。

    デプロイ 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

名前(必須)

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

deps

ラベルのリスト。デフォルトは [] です。

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

ラベルのリスト。デフォルトは [] です。

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

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

.srcjar タイプの srcs ファイルが解凍され、コンパイルされます。(これは、genrule またはビルドの拡張子を持つ .java ファイルのセットを生成する必要がある場合に便利です)。

assets

ラベルのリスト。デフォルトは [] です。

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

文字列。デフォルトは "" です。

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

ブール値。デフォルトは True です。

PNG 自動最適化を行う(または行わない)。これは、常に行われる 9-patch 処理とは無関係です。これは、aapt2 で修正された aapt のバグの回避策です。この回避策は非推奨です。
custom_package

文字列。デフォルトは "" です。

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

ラベル(デフォルトは "@bazel_tools//tools/android:debug_keystore"

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

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

debug_signing_keys

ラベルのリスト。デフォルトは [] です。

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

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

debug_signing_lineage_file

ラベル(デフォルトは None

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

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

densities

文字列のリスト。デフォルトは [] です。

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

整数。デフォルトは 1 です。

シャーディング インデックスに分解するシャードの数。これにより、アプリのインストール時間と起動時間が犠牲になるものの、デックス処理が大幅に高速化されます。バイナリが大きくなるほど、使用するシャードの数を増やす必要があります。テストを開始する際は 25 が適切な値です。

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

dexopts

文字列のリスト。デフォルトは [] です。

classes.dex を生成するときに dx ツールに追加するコマンドライン フラグ。「変数を作成」の置換と Bourne シェルのトークン化の対象となります。
enable_data_binding

ブール値。デフォルトは False です。

true の場合、このルールは、resource_files 属性で指定されたレイアウト リソース内のデータ バインディング式を処理します。この設定がないと、データ バインディング式でビルドエラーが発生します。

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

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

整数。構成不可。デフォルトは -1 です。

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

ラベル(デフォルトは None

計測する android_binary ターゲット。

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

javacopts

文字列のリスト。デフォルトは [] です。

このターゲット用の追加のコンパイラ オプション。「変数を作成」の置換と Bourne シェルのトークン化の対象となります。

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

key_rotation_min_sdk

文字列。デフォルトは ""

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

ラベル(デフォルトは None

テキスト ファイルには、クラスファイル名のリストが含まれています。これらのクラスファイルで定義されたクラスは、プライマリ classes.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

文字列のリスト。デフォルトは [] です。

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

ラベルのリスト。デフォルトは [] です。

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

ラベル: 必須

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

辞書: 文字列 -> 文字列。デフォルトは {} です。

マニフェストでオーバーライドされる値のディクショナリ。

マニフェスト内の ${name} のインスタンスは、この辞書内の name に対応する値に置き換えられます。

applicationIdversionCodeversionNameminSdkVersiontargetSdkVersionmaxSdkVersion は、マニフェスト タグと uses-sdk タグ内の対応する属性もオーバーライドします。

packageName は無視され、指定されている場合は applicationId から、指定されていない場合はマニフェストのパッケージから設定されます。

manifest_mergerlegacy に設定されている場合、applicationIdversionCodeversionName のみが有効になります。

multidex

文字列。デフォルトは "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: インデックスの上限を超える場合でも、すべてのコードを 1 つの DEX ファイルにコンパイルします。
nocompress_extensions

文字列のリスト。デフォルトは [] です。

APK で圧縮しないファイル拡張子のリスト。
package_id

整数。デフォルトは 0 です。

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

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

plugins

ラベルのリスト。デフォルトは [] です。

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

ラベル(デフォルトは None

ProGuard のマッピングとして使用されるファイル。難読化の際にクラスやメンバーの名前を変更する際に取得される「単語」の行区切りファイル。
proguard_apply_mapping

ラベル(デフォルトは None

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

ブール値。構成不可。デフォルトは False です。

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

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

proguard_specs

ラベルのリスト。デフォルトは [] です。

Proguard 仕様として使用するファイル。このファイルには、Proguard で使用する一連の仕様が記述されます。
resource_configuration_filters

文字列のリスト。デフォルトは [] です。

リソース構成フィルタのリスト(「en」など)。これにより、apk 内のリソースが「en」構成のリソースのみに制限されます。疑似ローカライズを有効にするには、en_XA または ar_XB の疑似言語/地域を含めます。
resource_files

ラベルのリスト。デフォルトは [] です。

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

整数。デフォルトは -1 です。

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

主な違い:

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

値は次のとおりです。

  • shrink_resources = 1: Android リソースの圧縮を有効にします。
  • shrink_resources = 0: Android リソースの圧縮を無効にします。
  • shrink_resources = -1: 圧縮は --android_resource_shrinking フラグによって制御されます。

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

名前(必須)

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

aar

ラベル: 必須

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

ラベルのリスト。デフォルトは [] です。

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

ラベル(デフォルトは None

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: ソース(「ソース 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

名前: 必須

このターゲットの名前。

deps

ラベルのリスト。デフォルトは [] です。

リンクする他のライブラリのリスト。許可されるライブラリの種類は、android_libraryandroid 制約付きの java_library、Android ターゲット プラットフォーム用の .so ネイティブ ライブラリをラップまたは生成する cc_library です。
srcs

ラベルのリスト。デフォルトは [] です。

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

.java タイプの srcs ファイルがコンパイルされます。読みやすくするため、生成された .java ソースファイルの名前を srcs に含めないでください。代わりに、以下で説明するように、依存するルール名を srcs に配置します。

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

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

assets

ラベルのリスト。デフォルトは [] です。

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

文字列。デフォルトは "" です。

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

文字列。デフォルトは "" です。

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

ブール値。デフォルトは False です。

true の場合、このルールは resource_files 属性で指定されたレイアウト リソースのデータ バインディング式を処理します。この設定がないと、データ バインディング式でビルドエラーが発生します。

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

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

ラベルのリスト。デフォルトは [] です。

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

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

exports

ラベルのリスト。デフォルトは [] です。

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

exports は、所属するルールの直接依存関係ではありません。

exports_manifest

整数。デフォルトは 1 です。

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

文字列。デフォルトは "" です。

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

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

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

をご覧ください。

idl_parcelables

ラベルのリスト。デフォルトは [] です。

インポートとして提供する Android IDL 定義のリスト。これらのファイルは、このライブラリに直接または推移閉包を介して依存するすべての android_library ターゲットのインポートとして使用できますが、Java に変換されたりコンパイルされたりすることはありません。

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

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

idl_preprocessed

ラベルのリスト。デフォルトは [] です。

インポートとして提供する、前処理済みの Android IDL 定義のリスト。 これらのファイルは、このライブラリに直接または推移閉包を介して依存するすべての android_library ターゲットのインポートとして使用できますが、Java に変換されたりコンパイルされたりすることはありません。

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

idl_srcs

ラベルのリスト。デフォルトは [] です。

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

これらのファイルは、このライブラリに直接依存している android_library ターゲットまたはその推移閉包経由でインポートとして使用できるようになります。

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

javacopts

文字列のリスト。デフォルトは [] です。

このターゲット用の追加のコンパイラ オプション。「変数を作成」の置換と Bourne シェルのトークン化の対象となります。

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

manifest

ラベル(デフォルトは None

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

ブール値。デフォルトは False です。

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

ラベルのリスト。デフォルトは [] です。

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

ラベルのリスト。デフォルトは [] です。

Proguard 仕様として使用するファイル。これらは、Proguard で使用される一連の仕様を記述します。指定すると、このライブラリに応じて任意の android_binary ターゲットに追加されます。 ここに含めるファイルには、べき等ルール(-dontnote、-dontwarn、confirmnosideeffects、-keep で始まるルール)のみを含める必要があります。他のオプションは、重複しないマージを確実に行うために、android_binary の proguard_specs にのみ表示できます。
resource_files

ラベルのリスト。デフォルトは [] です。

パッケージ化するリソースのリスト。これは通常、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

名前: 必須

このターゲットの名前。

support_apks

ラベルのリスト。デフォルトは [] です。

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

ラベル(必須)

テストを実行する android_device

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

test_app

ラベル(必須)

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

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

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

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

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

引数

属性
name

名前: 必須

このターゲットの名前。

deps

ラベルのリスト。デフォルトは [] です。

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

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

srcs

ラベルのリスト。デフォルトは [] です。

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

.java タイプの srcs ファイルがコンパイルされます。読みやすくするため、生成された .java ソースファイルの名前を srcs に含めないでください。代わりに、以下で説明するように、依存するルール名を srcs に配置します。

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

上記のファイル形式のファイルが 1 つ以上存在する場合、他のファイルは無視されます。そうでない場合は、エラーが発生します。

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

custom_package

文字列。デフォルトは "" です。

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

文字列のリスト。デフォルトは [] です。

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

ブール値。デフォルトは False です。

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

文字列のリスト。デフォルトは [] です。

このライブラリの追加のコンパイラ オプション。「変数を作成」の置換と Bourne シェルのトークン化の対象となります。

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

jvm_flags

文字列のリスト。デフォルトは [] です。

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

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

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

manifest

ラベル: デフォルトは None

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

辞書: 文字列 -> 文字列。デフォルトは {} です。

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

文字列のリスト。デフォルトは [] です。

リソース APK に圧縮せずに残すファイル拡張子のリスト。
plugins

ラベルのリスト。デフォルトは [] です。

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

文字列のリスト。デフォルトは [] です。

リソース構成フィルタのリスト(「en」など)。これにより、apk 内のリソースが「en」構成のリソースのみに制限されます。
resource_jars

ラベルのリスト。デフォルトは [] です。

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

文字列。デフォルトは "" です。

Java リソースから削除するパスの接頭辞。

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

runtime_deps

ラベルのリスト。デフォルトは [] です。

最終的なバイナリまたは実行時にのみ利用可能なライブラリ。通常の deps と同様に、これらはランタイム クラスパスに表示されますが、コンパイル時クラスパスには表示されません。実行時にのみ必要な依存関係をここにリストします。依存関係分析ツールは、runtime_depsdeps の両方に表示されるターゲットを無視する必要があります。
stamp

整数。デフォルトは 0 です。

ビルド情報をバイナリにエンコードするかどうか。可能な値:
  • stamp = 1: --nostamp ビルドでも、常にビルド情報をバイナリにスタンプします。バイナリとそれに依存するダウンストリーム アクションのリモート キャッシュが破棄される可能性があるため、この設定は避けるべきです
  • stamp = 0: ビルド情報を常に定数値に置き換えます。これにより、ビルド結果のキャッシュが適切に保存されます。
  • stamp = -1: ビルド情報のエンベディングは、--[no]stamp フラグによって制御されます。

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

test_class

文字列。デフォルトは "" です。

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

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

use_launcher

ブール値。デフォルトは 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 エミュレータを作成します。このエミュレータは、bazel run コマンドを使用して起動することも、生成されたスクリプトを直接実行して起動することもできます。独自のルールを定義するのではなく、既存の android_device ルールに依存することをおすすめします。

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

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

暗黙的な出力ターゲット

  • 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: start または kill。
  • --apks_to_install: エミュレータにインストールする APK のリスト。

引数

属性
name

名前(必須)

このターゲットの名前。

cache

整数、必須

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

ラベル(デフォルトは None

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

整数型(必須)

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

ラベルのリスト。デフォルトは [] です。

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

整数型(必須)

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

整数型(必須)

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

ラベル: 必須

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

整数型(必須)

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

整数型(必須)

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

android_ndk_repository

ルールのソースを表示
android_ndk_repository(name, api_level, path, repo_mapping)

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

この android_ndk_repository の実装は、Starlark の実装に置き換えられています。バージョン 25 以降を含む NDK の今後のバージョンのサポートは、android_ndk_repository の Starlark バージョンで実装されます。Starlark のバージョンについては、rules_android_ndk をご覧ください。

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

名前: 必須

このターゲットの名前。

api_level

整数。構成不可。デフォルトは 0 です。

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

文字列、設定不可、デフォルトは ""

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

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

repo_mapping

辞書: 文字列 -> 文字列。デフォルトは {} です。

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

たとえば、エントリ "@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 ターゲットのビルドをサポートするローカル Android SDK を使用するように Bazel を構成します。

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

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

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」として入手できます。これは、ローカル Maven リポジトリとしてパッケージ化された、Support ライブラリや AppCompat ライブラリなどの一般的な Android ライブラリのバージョン設定されたセットです。android_sdk_repository は、android_binary ターゲットと android_library ターゲットの依存関係で使用できる、これらのライブラリごとに Bazel ターゲットを生成します。

生成されるターゲットの名前は、Android Support Repository 内にあるライブラリの 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

名前: 必須

このターゲットの名前。

api_level

整数。構成不可。デフォルトは 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

文字列。構成不可。デフォルトは "" です。

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

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

path

文字列、設定不可、デフォルトは ""

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

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

repo_mapping

辞書: 文字列 -> 文字列。デフォルトは {} です。

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

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