Android のルール

問題を報告 ソースを表示

ルール

android_binary

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

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

暗黙的な出力ターゲット

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

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

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

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

引数

属性
name

名前(必須)

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

deps

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

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

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

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

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

.srcjar タイプの srcs ファイルは、展開されてコンパイルされます。(これは、genrule または build 拡張子を持つ .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

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

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

dexopts

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

class.dex の生成時の dx ツールの追加コマンドライン フラグ。 「変数を作成」の置換と Bourne シェルのトークン化が適用されます。
enable_data_binding

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

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

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

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

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

デフォルトと --incremental_dexing フラグをオーバーライドして、増分 dex 変換の有無にかかわらずターゲットを強制的にビルドします。
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} のインスタンスはすべて、この辞書内の名前に対応する値に置き換えられます。

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

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

apk 内のリソースを「en」構成内のリソースのみに制限する「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 制約と cc_library ラップのある android_libraryjava_library です。または、Android ターゲット プラットフォーム用に .so ネイティブ ライブラリを生成します。
srcs

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

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

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

.srcjar タイプの srcs ファイルは、展開されてコンパイルされます。(これは、genrule または build 拡張子を持つ .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 または build 拡張子を持つ .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 または assets が定義されている場合、またはテスト対象のライブラリのマニフェストに minSdkVersion タグが含まれている場合は、定義する必要があります。
manifest_values

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

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

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

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

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

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

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

リソース構成フィルタのリスト。apk 内のリソースを「en」構成内のリソースのみに制限する「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 Emulator が作成されます。このエミュレータは、bazel run コマンドを使用するか、生成されたスクリプトを直接実行することによって起動できます。独自のルールを定義するのではなく、既存の android_device ルールに依存することをおすすめします。

このルールは、Bazel テストと Blaze 実行を行うための --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: start または kill のいずれか。
  • --apks_to_install: エミュレータにインストールする APK のリスト。

引数

属性
name

名前(必須)

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

cache

整数、必須

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

ラベル: デフォルトは None

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

整数、必須

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

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

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

整数、必須

デバイスに対してエミュレートする RAM の量(MB)。デバイスにインストールされている特定のアプリだけでなく、デバイス全体が対象です。最小値は 64 MB です。
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 が各プロセスで使用する仮想マシンヒープのサイズ(MB 単位)。 最小値は 16 MB です。

android_ndk_repository

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

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

この android_ndk_repository の実装は、Starlark の実装に置き換えられています。バージョン 25 以降の NDK の今後のバージョンのサポートは、Starlark バージョンの android_ndk_repository に実装されます。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 の各属性を特定の値に設定できます。指定された API レベルまたはビルドツールのバージョンが Android SDK にインストールされていない場合、ビルドは失敗します。

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

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

サポート ライブラリ

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

生成されるターゲットの名前は、Android 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")内でその依存関係を実際に解決する必要があることを宣言します。