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_libraryandroid 制約付きの java_library、Android ターゲット プラットフォーム用の .so ネイティブ ライブラリをラップまたは生成する cc_library です。
srcs

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

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

.java タイプの srcs ファイルがコンパイルされます。可読性の観点から、生成された .java ソースファイルの名前を srcs に入れるのは望ましくありません。代わりに、以下のように、依存するルールの名前を srcs に入れます。

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

assets

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

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

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

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

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

PNG 自動最適化を行う(または行わない)。これは、常に実行される 9 パッチ処理とは独立しています。これは、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 です。

dexing を分解するシャードの数。これにより、アプリのインストールと起動時間が長くなる代わりに、dexing が大幅に高速化されます。バイナリが大きいほど、使用するシャードの数を増やす必要があります。25 はテストを開始するのに適した値です。

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

dexopts

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

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

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

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

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

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

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

増分 dexing の有無にかかわらずターゲットをビルドするように強制し、デフォルトと --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 からの)生成ファイルも、ここで Label で参照できます。唯一の制限は、生成された出力が、含まれる他のリソース ファイルと同じ「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)

このルールにより、.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

名前(必須)

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

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 に入れます。

タイプ .srcjarsrcs ファイルが解凍され、コンパイルされます。(これは、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、assumenosideeffects、-keep で始まるルール)のみを含める必要があります。他のオプションは、android_binary の proguard_specs にのみ表示できます。これは、トートロジーでないマージを保証するためです。
resource_files

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

パッケージ化するリソースのリスト。通常、これは res ディレクトリにあるすべてのファイルの glob です。
(genrules からの)生成ファイルも、ここで Label で参照できます。唯一の制限は、生成された出力が、含まれる他のリソース ファイルと同じ「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 を使用するには、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 ルールが取り込まれます。各 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 に入れます。

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

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

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

custom_package

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

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

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

APK をビルドする際にフィルタする密度。対応する compatible-screens セクションも、マニフェストにまだ上位集合 StarlarkListing が含まれていない場合は追加されます。
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 または assets が定義されている場合、またはテスト対象のライブラリのいずれかのマニフェストに 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 test と blaze run の --run_under フラグの適切なターゲットです。エミュレータを起動し、テストまたは実行するターゲットをエミュレータにコピーして、必要に応じてテストまたは実行します。

基盤となる system_image が X86 ベースで、I686 CPU アーキテクチャ向けに最適化されている場合、android_device は 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: 開始または強制終了。
  • --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: 初期ユーザーデータ パーティション
  • 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 ターゲットのビルドをサポートするために、Android NDK を使用するように 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 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",
)

再現可能なビルドを保証するため、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」として提供されています。これは、サポート ライブラリや AppCompat ライブラリなどの一般的な Android ライブラリのバージョン付きセットで、ローカル Maven リポジトリとしてパッケージ化されています。android_sdk_repository は、これらのライブラリごとに Bazel ターゲットを生成します。このターゲットは、android_binary ターゲットと android_library ターゲットの依存関係で使用できます。

生成されたターゲットの名前は、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

名前(必須)

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

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")内でその依存関係を実際に解決する必要があることを宣言します。