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:Android 應用程式 使用偵錯金鑰簽署的套件檔案 zipaligned 摘要,就能用來開發應用程式及偵錯。 如果您使用偵錯金鑰簽署,就無法發布應用程式。
  • name_unsigned.apk:該版本的未簽署版本 可以使用發布金鑰簽署,再發布至 我們會如何評估、確定範圍、建構及控管 Google Cloud 運用進階技術建立的產品
  • name_deploy.jar:包含 此目標的遞移性封閉。

    Deployment jar 中都包含所有可由 搜尋此目標執行階段類別路徑的類別載入器

  • name_proguard.jar:一個 Java 封存檔,其中包含 在 name_deploy.jar。 這個輸出內容只會在 proguard_specs 屬性為 。
  • name_proguard.map:對應檔案結果: 在 name_deploy.jar 上執行 ProGuard。 這個輸出內容只會在 proguard_specs 屬性為 已指定和 proguard_generate_mappingshrink_resources 中設定。

範例

Android 規則範例位於examples/android Bazel 來源樹狀結構。

引數

屬性
name

Name; required

此目標的專屬名稱。

deps

List of labels; optional

要連結至二進位檔目標的其他程式庫清單。 允許的程式庫類型包括:android_library、 有 android 限制條件的 java_library,以及 cc_library包裝或產生.so原生程式庫 Android 目標平台。
srcs

List of labels; optional

為建立目標而處理的來源檔案清單。

.java 類型的 srcs 檔案已編譯完畢。 為了方便閱讀,最好不要 產生 .java 來源檔案至 srcs。 請改為在 srcs 中加入相依規則名稱,如 。

.srcjar 類型的 srcs 檔案已解壓縮, 加以訓練(如需使用 .java 檔案產生一組 .java 檔案, genrule 或建構擴充功能)

assets

List of labels; optional

要封裝的資產清單。 這通常是下述的 glob 所有檔案 assets 目錄內。您也可以參照其他規則 ( 檔案),或在其他套件中匯出檔案 (前提是這些檔案在 assets_dir 目錄。
assets_dir

String; optional

字串,提供 assets 中檔案的路徑。 assetsassets_dir 配對描述已封裝 資產及兩個屬性都應擇一提供,或完全不提供。
crunch_png

Boolean; optional; default is True

請 (或不要) 使用 PNG 壓縮功能。這與 nine-patch 處理無關 完成。這個解決方法已不適用 aapt 錯誤 已在 aapt2 中修正。
custom_package

String; optional

要產生 Java 來源的 Java 套件。 根據預設,系統會從 BUILD 檔案的目錄推論出套件 包含此規則您可以指定不同的套件 我們非常不建議這麼做,因為這可能導致課程路徑和其他 只會在執行階段偵測到的程式庫
debug_key

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

包含要用來簽署偵錯 APK 的偵錯 KeyStore 檔案。通常您不會 您想使用預設鍵以外的金鑰,應省略此屬性。

警告:請勿使用正式版金鑰, 受到嚴格保障,不會保存在原始碼樹狀結構中

debug_signing_keys

List of labels; optional

檔案清單,用於簽署偵錯 APK 的偵錯 KeyStore。通常您不會 要使用預設鍵以外的索引鍵,因此應省略這個屬性。

警告:請勿使用正式版金鑰, 受到嚴格保障,不會保存在原始碼樹狀結構中

debug_signing_lineage_file

Label; optional

含有 debug_signing_keys 簽署歷程的檔案。通常您不會 要使用預設鍵以外的索引鍵,因此應省略這個屬性。

警告:請勿使用正式版金鑰, 受到嚴格保障,不會保存在原始碼樹狀結構中

densities

List of strings; optional

建立 APK 時要篩選的密度。 這將會去除裝置未載入的光柵可繪製資源 以縮減 APK 大小。對應的相容螢幕 如果未包含超集,系統也會將這個部分新增至資訊清單 。
dex_shards

Integer; optional; default is 1

應分解 dex 的資料分割數量。 這會大幅加快 DEX 處理速度,減少應用程式安裝和啟動所需的時間。 二進位檔案越大,可使用的資料分割越多。建議從 25 開始 不斷成長

請注意,每個資料分割在最終應用程式中會產生至少一個 dex。因此 不建議為發布二進位檔將此值設為超過 1。

dexopts

List of strings; optional

產生 class.dex 時,dx 工具的其他指令列旗標。 取決於「化變數」替代和 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

這個目標的額外編譯器選項。 取決於「化變數」替代和 Bourne 殼層權杖化

在全域編譯器選項之後,這些編譯器選項會傳遞至 javac。

key_rotation_min_sdk

String; optional

設定 APK 輪替簽署的最低 Android 平台版本 (API 級別) 金鑰必須用於產生 APK 簽章。APK 的原始簽署金鑰 用於所有舊版平台版本
main_dex_list

Label; optional

文字檔包含類別檔案名稱清單。這些類別檔案所定義的類別為 放在主要 class.dex 中e.g.:
          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

要做為 Proguard 規格的檔案,用來判斷必須保存在 因此主要的 DEX 值 只有在 multidex 屬性設為 legacy 時才能使用。
manifest

Label; required

Android 資訊清單檔案的名稱,通常為 AndroidManifest.xml。 如果已定義 resource_files 或資產,就必須定義。
manifest_values

Dictionary: String -> String; optional

要在資訊清單中覆寫的值字典。在 系統會將資訊清單替換為這個字典中名稱對應的值。 applicationId、versionCode、versionName、minSdkVersion、 targetSdkVersion 和 maxSdkVersion 也會覆寫資訊清單的對應屬性,並 use-sdk 標記。系統會忽略 packageName,且會在應用程式 ID 中進行設定。 或是在資訊清單中指定套件將 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:將所有程式碼編譯成單一 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 編譯器外掛程式。 下列位置中指定的每個 java_plugin: plugins 屬性 建立這個目標資源產生來源: 外掛程式會納入
proguard_apply_dictionary

Label; optional

要用於 Proguard 對應的檔案。 以行分隔的「words」檔案來提取課程名稱 。
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

資源設定篩選器清單,例如「en」會限制 Google Cloud 資源 僅限「en」中的 APK此外還會從 0 自動調整資源配置 您完全不必調整資源調度設定如要啟用虛擬本地化功能,請加入 en_XA 和/或 ar_XB 虛擬語言代碼。
resource_files

List of labels; optional

要封裝的資源清單。 這通常是下述的 glob 所有檔案 res 目錄內。
可以參照由 Genrules 產生的檔案 請一併在這裡加上標籤唯一的限制是 產生的輸出內容必須位於相同的「res」與任何其他網站一樣 附加的資源檔案
shrink_resources

Integer; optional; default is -1

是否執行資源縮減。二進位檔不使用的資源會是 並從 APK 中移除。這個方法僅適用於使用本機資源 (即 manifestresource_files 屬性),並且需要 ProGuard。 其運作方式與 Gradle 資源縮減器大致相同 (https://developer.android.com/studio/build/shrink-code.html#shrink-resources).

重要差異:

  • 系統將移除「values/」中的資源以及依據檔案建立的資源 資源
  • 根據預設,系統會使用 strict mode
  • 只有 aapt2 支援移除未使用的 ID 資源
,瞭解如何調查及移除這項存取權。 如果已啟用資源縮減功能,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

一個 JAR 檔案,內含 AAR 中已編譯 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:Android「aar」包含 Java 封存檔的套件 和資源不包含遞移封閉。

範例

Android 規則範例位於examples/android Bazel 來源樹狀結構。

以下範例顯示 如何設定 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_library、 有 android 限制條件的 java_library,以及 cc_library 包裝或產生 .so 原生資料庫 Android 目標平台
srcs

List of labels; optional

指定符合下列條件的 .java.srcjar 檔案清單: 來建立目標

.java 類型的 srcs 檔案已編譯完畢。 為了方便閱讀,最好不要 產生 .java 來源檔案至 srcs。 請改為在 srcs 中加入相依規則名稱,如 。

.srcjar 類型的 srcs 檔案已解壓縮, 加以訓練(如需使用 .java 檔案產生一組 .java 檔案, genrule 或建構擴充功能)

如果省略 srcs,則會在 「deps」是從這項規則匯出 (請參閱 「java_library 的匯出項目」一文 匯出依附元件的相關資訊)。不過,這個行為 即將淘汰;請不要仰賴它

assets

List of labels; optional

要封裝的資產清單。 這通常是下述的 glob 所有檔案 assets 目錄內。您也可以參照其他規則 ( 檔案),或在其他套件中匯出檔案 (前提是這些檔案在 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_import_root,則兩個會同時指定 idl_parcelablesidl_srcs 必須位於物件的 Java 套件指定的路徑 代表隸屬於 idl_import_rootidl_import_root為 未指定,idl_parcelablesidl_srcs 都必須位於 由套件在 Java 根目錄下的套件指定路徑。

詳情請參閱 範例

idl_parcelables

List of labels; optional

要做為匯入作業提供的 Android IDL 定義清單。 這些檔案將成為 android_library 目標直接依附這個程式庫 或經由遞移性關閉,但不會轉譯為 Java 語言 執行特定工作

只有 .aidl 個直接對應的檔案 必須加入這個程式庫中的 .java 個來源 (例如自訂 Parcelable 的實作),否則應設為 idl_srcs

請務必妥善放置這些檔案,輔助編譯器才能找到。 請參閱 idl_import_root 的說明 深入瞭解這代表什麼。

idl_preprocessed

List of labels; optional

要做為匯入作業的預先處理 Android IDL 定義清單。 這些檔案將成為 android_library 目標直接依附這個程式庫 或經由遞移性關閉,但不會轉譯為 Java 語言 執行特定工作

只預先處理對應至直接對應的 .aidl 檔案 必須加入這個程式庫中的 .java 個來源 (例如自訂 Parcelable 的實作),否則請使用 idl_srcs 需要轉譯為 Java 介面和 使用「idl_parcelable」 非預先處理的 AIDL 檔案。

idl_srcs

List of labels; optional

要轉譯為 Java 介面的 Android IDL 定義清單。 Java 介面產生後,會一起編譯 ,其內容為 srcs

這些檔案將成為 android_library 目標直接依附這個程式庫 或透過遞移方式關閉

請務必妥善放置這些檔案,輔助編譯器才能找到。 請參閱 idl_import_root 的說明 深入瞭解這代表什麼。

javacopts

List of strings; optional

這個目標的額外編譯器選項。 取決於「化變數」替代和 Bourne 殼層權杖化

在全域編譯器選項之後,這些編譯器選項會傳遞至 javac。

manifest

Label; optional

Android 資訊清單檔案的名稱,通常為 AndroidManifest.xml。 如果已定義 resource_files 或資產,就必須定義。

Boolean; optional; default is False

這個程式庫只用於編譯,不會在執行階段使用。 標記為「neverlink」的規則輸出內容不會用於 建立「.apk」。如果 SDK 提供程式庫,就相當實用 執行階段環境。
plugins

List of labels; optional

在編譯期間執行的 Java 編譯器外掛程式。 下列位置中指定的每個 java_plugin: plugins 屬性 建立這個目標資源產生來源: 外掛程式會納入
proguard_specs

List of labels; optional

要做為 Proguard 規格的檔案。 這些設定會說明 Proguard 使用的規格。如果有指定的話 系統會根據這個程式庫,將這些群組加進任何 android_binary 目標。 這裡包含的檔案只能包含冪等規則,例如 -dontnote、-dontwarn、 以及以 -keep 開頭的規則。其他選項只能在 android_binary 的 proguard_specs 確保非自動合併。
resource_files

List of labels; optional

要封裝的資源清單。 這通常是下述的 glob 所有檔案 res 目錄內。
可以參照由 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 會指定要測試的 android_binary 應用程式 instruments 屬性

範例

# 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 測試架構搭配使用。 詳情請參閱 Android Robolectric 網站: 以及編寫 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/archive/<COMMIT>.tar.gz"],
    strip_prefix = "robolectric-<COMMIT>",
    sha256 = "<HASH>",
)
load("@robolectric//bazel:robolectric.bzl", "robolectric_repositories")
robolectric_repositories()
這項操作會擷取 Robolectric 所需的 maven_jar 規則。 因此每項 android_local_test 規則都應該依附 @robolectric//bazel:robolectric。請參閱以下範例。

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

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

引數

屬性
name

Name; required

此目標的專屬名稱。

deps

List of labels; optional

待測試的程式庫清單以及其他要連結的程式庫 在目標區間內 Android 規則中宣告的所有資源、資產和資訊清單檔案 此屬性的關閉程序將會於測試中完成。

deps的允許規則清單為 android_libraryaar_importjava_importjava_library、 和 java_lite_proto_library

srcs

List of labels; optional

為建立目標而處理的來源檔案清單。 必要 (下文所述的特殊情況除外)。

.java 類型的 srcs 檔案已編譯完畢。 為了方便閱讀,最好不要 產生 .java 來源檔案至 srcs。 請改為在 srcs 中加入相依規則名稱,如 。

.srcjar 類型的 srcs 檔案已解壓縮, 加以訓練(如需使用 .java 檔案產生一組 .java 檔案, genrule 或建構擴充功能)

只要 至少有一個檔案類型包含上述的檔案類型。否則, 錯誤。

srcs 為必要屬性,除非是空白,否則不得留空 已指定 runtime_deps

custom_package

String; optional

要產生 R 類別的 Java 套件。根據預設,系統會推論套件 從包含規則的 BUILD 檔案所在目錄。如果使用這項屬性 您可能也需要使用 test_class
densities

List of strings; optional

建立 APK 時要篩選的密度。對應的相容螢幕 也會新增至資訊清單中 (如果尚未包含 超級集合 StarlarkListing。
enable_data_binding

Boolean; optional; default is False

如果為 true,則此規則會處理 資料 繫結參照用於這項測試使用已啟用資料繫結的依附元件。不含 此設定,資料繫結依附元件不需要產生必要的二進位層級程式碼。 可能會導致建構失敗
javacopts

List of strings; optional

這個程式庫的額外編譯器選項。 取決於「化變數」替代和 Bourne 殼層權杖化

在全域編譯器選項之後,這些編譯器選項會傳遞至 javac。

jvm_flags

List of strings; optional

為執行此二進位檔而產生的包裝函式指令碼,要嵌入的標記清單。 須遵守 $(location) 和 「設為變數」替代,以及 Bourne 殼層權杖化

Java 二進位檔的包裝函式指令碼包含 CLASSPATH 定義 (找出所有相依的 jar 檔案) 並叫用正確的 Java 解譯器。 包裝函式指令碼產生的指令列包含 主要類別後面加上 "$@",因此您可以與其他類別 加入 kubectl 的引數不過,用於剖析的引數 JVM 必須在指令的類別名稱「之前」指定 互動jvm_flags 的內容會新增至包裝函式 即可。

請注意,這項屬性對 *_deploy.jar 沒有任何影響 輸出內容

manifest

Label; optional

Android 資訊清單檔案的名稱,通常為 AndroidManifest.xml。 如已定義 resource_files 或資產,或其中任何資訊清單的 受測試的程式庫中都含有 minSdkVersion 標記。
manifest_values

Dictionary: String -> String; optional

要在資訊清單中覆寫的值字典。在 系統會將資訊清單替換為這個字典中名稱對應的值。 applicationIdversionCodeversionNameminSdkVersiontargetSdkVersionmaxSdkVersion 也會覆寫相應的屬性 資訊清單 use-sdk 標記。系統將忽略 packageName,並從以下兩者中擇一進行設定 如果符合條件,則設為 applicationId 或是在資訊清單中指定套件 您不必為規則設定資訊清單,也能使用 manifest_values。
nocompress_extensions

List of strings; optional

資源 APK 中要保留未壓縮的副檔名清單。
plugins

List of labels; optional

在編譯期間執行的 Java 編譯器外掛程式。 每當有這項規則時,都會執行此屬性中指定的每個 java_plugin。 建構應用程式程式庫可能也會從使用以下依附元件的依附元件繼承外掛程式 exported_plugins。資源 外掛程式產生的 jar 檔案會納入這項規則的結果 jar 中
resource_configuration_filters

List of strings; optional

資源設定篩選條件清單,例如「en」會限制 Google Cloud 資源 僅限「en」中的 APK此外還會從 0 自動調整資源配置 您完全不必調整資源調度設定
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 相同,這些項目會顯示在執行階段的類別路徑中,但與一般的 deps 不同 而非編譯時間類別路徑應該只有執行階段所需的依附元件 這裡列出的條件依附元件分析工具應忽略同時顯示在兩者中的目標 《runtime_deps》和《deps》。
stamp

Integer; optional; default is 0

是否將建構資訊編碼為二進位檔。可能的值包括:
  • stamp = 1:一律在二進位檔中加上建構資訊加上戳記,即使在 --nostamp 版本。本 建議避免設定,因為這可能會終止 以及任何相依的下游動作
  • stamp = 0:一律以常數值取代建構資訊。這個 也提供良好的建構結果快取功能
  • stamp = -1:建構資訊的嵌入功能是由 --[no]stamp 旗標。

除非其依附元件變更,否則系統「不會」重新建構加上時間戳記的二進位檔。

test_class

String; optional

測試執行器要載入的 Java 類別。

這個屬性會指定要執行的 Java 類別名稱 測試。這項設定很少需要設定。如果省略這個引數,Java 類別就會生效 其名稱對應至此項目的 name 系統將使用 android_local_test 項規則。 測試類別必須加上 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)

這項規則會使用指定的 規格。您可以透過 bazel Run 啟動這個模擬器 或直接執行產生的指令碼建議根據 而不必自行定義 android_device 規則

此規則是 --run_under 標記用於 bazel 測試和 Blaze 的適當目標 此程序的第一步 是將程式碼簽入執行所有單元測試的存放區中系統會啟動模擬器、將要測試/執行的目標複製到模擬器, 然後加以測試或視需求執行

如果基礎映像檔,android_device 支援建立 KVM 映像檔 system_image 以 X86 為基礎且 已針對 I686 CPU 架構進行最佳化如要使用 KVM,請 tags = ['requires-kvm'] 附加到 android_device 規則。

隱含輸出目標

  • name_images/userdata.dat: 包含用來啟動模擬器的圖片檔和快照
  • name_images/emulator-meta-data.pb: 包含傳遞至模擬器所需的序列化資訊 重新啟動。

範例

以下範例說明瞭如何使用 android_device。 //java/android/helloandroid/BUILD包含

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

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

//java/android/helloandroid/nexus_s.properties 包含:

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

這項規則會產生圖片和一個開機指令碼。您可以啟動 執行 bazel run :nexus_s -- --action=start。指令碼會顯示 下列標記:

  • --adb_port:用來公開 ADB 的通訊埠。如果需要向 ADB 發出 以便透過這個通訊埠向模擬器發出指令 。
  • --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 MB
screen_density

Integer; required

模擬螢幕的密度,以每英寸像素為單位。 最小值為 30 ppi。
system_image

Label; required

一個檔案群組,內含下列檔案:
  • system.img:系統分區
  • kernel-qemu:模擬器會載入的 Linux kernel
  • ramdisk.img:開機時要使用的初始映像檔
  • userdata.img:初始使用者資料分區
  • source.properties: 包含 圖片
,瞭解如何調查及移除這項存取權。 這些檔案屬於 Android SDK 的一部分,或是由第三方提供 ( 例如 Intel 提供的 x86 映像檔
vertical_resolution

Integer; required

要模擬的垂直螢幕解析度 (以像素為單位)。 最小值為 240。
vm_heap

Integer; required

每個程序使用的虛擬機器堆積大小 (以 MB 為單位)。 最小值為 16 MB。

android_ndk_repository

android_ndk_repository(name, api_level, path, repo_mapping)

設定 Bazel 以使用 Android NDK,以便支援透過原生功能建構 Android 目標 再也不是件繁重乏味的工作

請注意,在 Android 上進行建構時也需要 android_sdk_repository 規則的 WORKSPACE 檔案。

如需詳細資訊,請參閱 完整說明文件,瞭解如何搭配使用 Android NDK 與 Bazel

範例

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: ./android-ndk-r20。編譯 JNI 時會使用 API 級別 24 的程式庫 再也不是件繁重乏味的工作

CPU 功能

Android NDK 中包含了 cpufeatures 程式庫 可在執行階段偵測裝置的 CPU下列範例說明如何使用 搭配使用 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)

設定 Bazel 使用本機 Android SDK 支援建構 Android 目標。

範例

為 Bazel 設定 Android SDK 至少需要加入 android_sdk_repository 規則 「androidsdk」並在 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 支援存放區」。 這是一組通用的 Android 程式庫,例如 Support 和 AppCompat 程式庫 封裝為本機 Maven 存放區android_sdk_repository 會產生 Bazel 能為每個程式庫套用目標 android_binaryandroid_library目標。

產生的目標名稱衍生自 Android 支援存放區,格式為 @androidsdk//${group}:${artifact}-${version}。 以下範例說明 android_library 如何依附 25.0.0 版的 v7 appcompat 程式庫。

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 級別 才會使用

android_sdk 可覆寫指定版本使用的 API 級別 旗標。android_sdk_repository 會為以下項目建立 android_sdk 目標: SDK 中安裝的每個 API 級別,名稱為 @androidsdk//:sdk-${level} 以及是否指定此屬性例如,若要針對非預設 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")。