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 アーカイブ。

    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_library java_library android 制約、cc_libraryAndroid ターゲット プラットフォームの.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 処理とは関係ありません。これは、aapt2 で修正された aapt バグの回避策です。
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 を分割するシャードの数。これにより、アプリのインストールと起動に時間がかかり、1 日の dex 処理がはるかに速くなります。バイナリが大きいほど、より多くのシャードが使用されます。テストを開始する場合は 25 をおすすめします。

最終アプリでは、各シャードで少なくとも 1 つの dex が生成されます。したがって、リリース バイナリでこの値を 1 以上に設定することはおすすめしません。

dexopts

List of strings; optional

class.dex を生成する際の dx ツール用の追加のコマンドライン フラグ。 Make 変数の置換と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

増分 dex を使用するかどうかにかかわらず、ターゲットを強制的にビルドし、デフォルトと --incremental_dexing フラグをオーバーライドします。
instruments

Label; optional

支払い方法の android_binary ターゲット。

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

javacopts

List of strings; optional

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

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

key_rotation_min_sdk

String; optional

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

Label; optional

テキスト ファイルには、クラスファイル名のリストが含まれます。これらのクラスファイルで定義されたクラスは、プライマリ class.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 または asset が定義されている場合は、定義する必要があります。
manifest_values

Dictionary: String -> String; optional

マニフェストでオーバーライドする値の辞書。マニフェストの ${name} はすべて、この辞書の名前に対応する値に置き換えられます。applicationId、versionCode、versionName、minSdkVersion、targetSdkVersion、maxSdkVersion も、マニフェストの対応する属性と uses-sdk タグをオーバーライドします。packageName は無視され、指定された場合は applicationId、またはマニフェスト内のパッケージから設定されます。manifest_merger をレガシーに設定すると、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: インデックスの上限を超えた場合でも、すべてのコードを 1 つの 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 のマッピングとして使用するファイル。難読化中にクラスとメンバーの名前を変更するときに pull する「単語」の行区切りファイル。
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_XAar_XB 架空言語のいずれかまたは両方を含めます。
resource_files

List of labels; optional

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

Integer; optional; default is -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)

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

    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: ソース(「ソース 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 変数の置換とBourne シェルのトークン化が適用されます。

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

manifest

Label; optional

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

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 です。
(生成されたルール)は、ここでもラベルで参照できます。生成される出力は、そこに含まれている他のリソース ファイルと同じ「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: ソース(「ソース jar」)を含むアーカイブ。
  • name_deploy.jar: デプロイに適した Java デプロイ アーカイブ(明示的にリクエストされた場合のみビルドされます)。

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

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

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 の作成時にフィルタする密度。対応する sscreens セクションも、スーパーセットの StarlarkListing をまだ含んでいない場合、マニフェストに追加されます。
enable_data_binding

Boolean; optional; default is False

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

List of strings; optional

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

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

jvm_flags

List of strings; optional

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

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

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

manifest

Label; optional

Android マニフェスト ファイルの名前(通常は AndroidManifest.xml)。 resource_files または asset が定義されている場合、またはテスト対象のライブラリのマニフェストのいずれかに 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 実行コマンドを使用するか、生成されたスクリプトを直接実行します。独自のルールを定義するのではなく、既存の android_device ルールを使用することをおすすめします。

このルールは、bazel test と 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 接続を発行するポートになります。
  • - Emulator_port: エミュレータの Telnet 管理コンソールを公開するポート。
  • --enable_display: true の場合、ディスプレイとともにエミュレータを起動します(デフォルトは false)。
  • --action: 開始または強制終了。
  • --apks_to_install: エミュレータにインストールする apk のリスト。

引数

属性
name

Name; required

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

cache

Integer; required

エミュレータのキャッシュ パーティションのサイズ(MB)。 最小値は 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 の量(MB)。これは、デバイスにインストールされている特定のアプリだけでなく、デバイス全体を対象としています。最小値は 64 メガバイトです。
screen_density

Integer; required

エミュレートした画面の密度(ピクセル単位) 最小値は 30 ppi です。
system_image

Label; required

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

Integer; required

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

Integer; required

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

android_ndk_repository

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

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

android_ndk_repository の実装は Starlark の実装に置き換えられます。NDK バージョン 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 のライブラリが使用されます。

CPU 機能

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

Bazel 用の Android SDK を設定するには、少なくとも「androidsdk」という名前の android_sdk_repository ルールを WORKSPACE ファイルに配置し、$ANDROID_HOME 環境変数を Android SDK のパスに設定する必要があります。Bazel は、最も高い Android API レベルを使用し、デフォルトで Android SDK にインストールされているビルドツール バージョンを使用します。
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 リポジトリとしてパッケージ化された、サポート ライブラリや AppCompat ライブラリなど、バージョニングされた一般的な Android ライブラリのセットです。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")内でその依存関係を解決する必要があると宣言します。