規則
- android_binary
- aar_import
- android_library
- android_instrumentation_test
- android_local_test
- android_device
- android_ndk_repository
- android_sdk_repository
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
:一個 Java 封存檔,包含在name_deploy.jar
上執行 ProGuard 的結果。只有在指定 proguard_specs 屬性時,才會產生這項輸出內容。name_proguard.map
:在name_deploy.jar
上執行 ProGuard 的對應檔案結果。只有在指定 proguard_specs 屬性,並設定 proguard_generate_mapping 或 shrink_resources 時,才會產生這項輸出內容。
範例
您可以在 Bazel 來源樹狀結構的 examples/android
目錄中找到 Android 規則範例。
引數
屬性 | |
---|---|
name |
名稱;必填 此目標的專屬名稱。 |
deps
|
標籤清單;預設值為 android_library 、具有 android 限制的 java_library ,以及針對 Android 目標平台的 cc_library 包裝或產生 .so 原生資料庫。 |
srcs
|
標籤清單;預設值為
系統會解壓縮並編譯 |
assets
|
標籤清單;預設值為 assets 目錄下所有檔案的 glob 。您也可以參照其他規則 (任何會產生檔案的規則) 或其他套件中的匯出檔案,只要這些檔案全都位於對應套件的 assets_dir 目錄中。 |
assets_dir
|
字串;預設為 assets 中檔案的路徑。assets 和 assets_dir 組合可說明已封裝的資產,且必須同時提供這兩個屬性,或都不提供。 |
crunch_png
|
布林值;預設值為 |
custom_package
|
字串;預設為 |
debug_key
|
標籤;預設值為 警告:請勿使用正式版金鑰,應嚴格保護這些金鑰,且不要儲存在原始碼樹狀結構中。 |
debug_signing_keys
|
標籤清單;預設為 警告:請勿使用正式版金鑰,應嚴格保護這些金鑰,且不要儲存在原始碼樹狀結構中。 |
debug_signing_lineage_file
|
標籤;預設為 警告:請勿使用正式版金鑰,應嚴格保護這些金鑰,且不要儲存在原始碼樹狀結構中。 |
densities
|
字串清單;預設值為 |
dex_shards
|
整數;預設值為 請注意,每個區段都會在最終應用程式中產生至少一個 dex。因此,不建議將此值設為大於 1 的發布二進位檔。 |
dexopts
|
字串清單;預設為 |
enable_data_binding
|
布林值;預設值為 如要建構包含資料繫結的 Android 應用程式,您也必須執行下列步驟:
|
incremental_dexing
|
整數;nonconfigurable;預設值為 |
instruments
|
標籤;預設為 要檢測的 如果設定這項屬性,系統會將此 |
javacopts
|
字串清單;預設值為 在全域編譯器選項之後,這些編譯器選項會傳遞至 javac。 |
key_rotation_min_sdk
|
字串;預設為 |
main_dex_list
|
標籤;預設為 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
|
字串清單;預設值為 |
main_dex_proguard_specs
|
標籤清單;預設為 multidex 屬性設為 legacy 時才能使用。 |
manifest
|
標籤;必填 Android 資訊清單檔案的名稱,通常為AndroidManifest.xml 。如果已定義 resource_files 或 assets,則必須定義此屬性。 |
manifest_values
|
字典:字串 -> 字串;預設值為
資訊清單中的所有
系統會忽略
當 |
multidex
|
字串;預設為 可能的值包括:
|
nocompress_extensions
|
字串清單;預設為 |
package_id
|
整數;預設值為 詳情請參閱 AAPT2 的 |
plugins
|
標籤清單;預設為 java_plugin 。外掛程式產生的資源會納入目標的結果 jar 中。 |
proguard_apply_dictionary
|
標籤;預設值為 |
proguard_apply_mapping
|
標籤;預設為 proguard_generate_mapping 產生的對應檔案,用於重新用於將相同的對應關係套用至新建構作業。 |
proguard_generate_mapping
|
布林值;不可設定;預設值為 proguard_specs 時,系統才會產生對應檔案。這個檔案會列出原始和模糊處理的類別、方法和欄位名稱之間的對應關係。警告:如果使用這項屬性,Proguard 規格應不含 |
proguard_specs
|
標籤清單;預設為 |
resource_configuration_filters
|
字串清單;預設值為 en_XA 和/或 ar_XB 偽本地。 |
resource_files
|
標籤清單;預設為 res 目錄下所有檔案的 glob 。
這裡的標籤也可以參照 genrules 產生的檔案。唯一的限制是產生的輸出內容必須與任何其他所含資源檔案位於相同的「 res 」目錄。 |
shrink_resources
|
整數,預設值為 manifest 和 resource_files 屬性) 的規則,且需要 ProGuard。其運作方式與 Gradle 資源縮減器大致相同 (https://developer.android.com/studio/build/shrink-code.html#shrink-resources)。主要差異:
name_files/resource_shrinker.log ,詳細說明已執行的分析和刪除作業。
可能的值:
|
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
|
標籤清單;預設為 |
srcjar
|
標籤;預設值為 |
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 封存檔和資源。但不包含傳遞閉包。
範例
您可以在 Bazel 來源樹狀結構的 examples/android
目錄中找到 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_library 、具有 android 限制的 java_library ,以及針對 Android 目標平台的 cc_library 包裝或產生 .so 原生資料庫。 |
srcs
|
標籤清單;預設值為 .java 或 .srcjar 檔案清單。
如果省略 |
assets
|
標籤清單;預設為 assets 目錄下所有檔案的 glob 。您也可以參照其他規則 (任何會產生檔案的規則) 或其他套件中的匯出檔案,只要這些檔案全都位於對應套件的 assets_dir 目錄中。 |
assets_dir
|
字串;預設為 assets 中檔案的路徑。assets 和 assets_dir 組合用於描述封裝素材資源,且應提供兩項屬性,或完全不提供這兩項屬性。 |
custom_package
|
字串;預設值為 |
enable_data_binding
|
布林值;預設值為 如要建構包含資料繫結的 Android 應用程式,您也必須執行下列步驟:
|
exported_plugins
|
標籤清單;預設為 java_plugin 清單 (例如註解處理器)。
指定的 |
exports
|
標籤清單;預設值為 exports 屬性聯絡的所有規則都視為直接依附於 exports 目標的任何規則的直接依附性。
|
exports_manifest
|
整數;預設值為 android_binary 目標。uses-permissions 屬性一律不會匯出。 |
idl_import_root
|
字串;預設為 處理依附這個程式庫的 idl 來源時,這個路徑會做為匯入根目錄。 指定 請參閱範例。 |
idl_parcelables
|
標籤清單;預設值為 android_library 目標中,直接或透過轉換閉包進行匯入,但不會轉譯為 Java 或編譯。只能加入與這個程式庫中直接相對應的 請務必妥善放置這些檔案,輔助編譯器才能找到。如要瞭解這代表什麼意義,請參閱 idl_import_root 的說明。 |
idl_preprocessed
|
標籤清單;預設為 android_library 目標中,直接或透過轉換閉包進行匯入,但不會轉譯為 Java 或編譯。請僅納入與此程式庫中的 |
idl_srcs
|
標籤清單;預設為 srcs 的內容一起編譯。這些檔案會直接或透過其傳遞式閉包,提供給任何依附此程式庫的 這些檔案必須放置在適當位置,讓 ADI 編譯器能夠找到。如要瞭解這代表什麼意義,請參閱 idl_import_root 的說明。 |
javacopts
|
字串清單;預設為 在全域編譯器選項之後,這些編譯器選項會傳遞至 javac。 |
manifest
|
標籤;預設值為 AndroidManifest.xml 。如果已定義 resource_files 或 assets,則必須定義此屬性。 |
neverlink
|
布林值;預設值為 neverlink 的規則輸出內容不會用於建立 .apk 。如果執行階段環境會在執行期間提供程式庫,此選項就很實用。 |
plugins
|
標籤清單;預設值為 java_plugin 。外掛程式產生的資源會納入目標的結果 JAR 中。 |
proguard_specs
|
標籤清單;預設為 android_binary 目標。此處所包含的檔案只能包含同質性規則,也就是 -dontnote、-dontwarn、assumenosideeffects,以及開頭為 -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
會透過 檢測屬性,指定接受測試的 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
|
標籤清單;預設值為 |
target_device
|
標籤 (必填) 測試應執行的 android_device。 如要在已啟動的模擬器或實體裝置上執行測試,請使用下列引數:
|
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()
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
|
標籤清單;預設值為
|
srcs
|
標籤清單;預設值為 編譯
只要具備上述至少一種檔案類型,系統就會忽略所有其他檔案。否則會擲回錯誤。
|
custom_package
|
字串;預設為 test_class 。 |
densities
|
字串清單;預設為 |
enable_data_binding
|
布林值;預設值為 |
javacopts
|
字串清單;預設為 這些編譯器選項會在全域編譯器選項之後傳遞至 javac。 |
jvm_flags
|
字串清單;預設為 Java 二進位檔的包裝函式指令碼包含 CLASSPATH 定義 (用於尋找所有依附的 JAR),並叫用正確的 Java 轉譯器。包裝函式指令碼產生的指令列包含主要類別名稱,後面接著 請注意,這個屬性對 |
manifest
|
標籤;預設值為 AndroidManifest.xml 。如果已定義 resource_files 或素材資源,或是測試中程式庫的任何資訊清單含有 minSdkVersion 標記,則必須定義此屬性。 |
manifest_values
|
字典:字串 -> 字串;預設為 applicationId 、versionCode 、versionName 、minSdkVersion 、targetSdkVersion 和 maxSdkVersion 也會覆寫資訊清單和 uses-sdk 標記的相應屬性。系統會忽略 packageName ,並根據 applicationId 或資訊清單中的套件進行設定。您不必為規則設定資訊清單,也能使用 manifest_values。
|
nocompress_extensions
|
字串清單;預設值為 |
plugins
|
標籤清單;預設為 java_plugin 。程式庫也可能會從使用 exported_plugins 的依附元件繼承外掛程式。外掛程式產生的資源會納入這項規則產生的 jar 檔案。 |
resource_configuration_filters
|
字串清單;預設值為 |
resource_jars
|
標籤清單;預設為 |
resource_strip_prefix
|
字串;預設值為
如果指定,系統會從 |
runtime_deps
|
標籤清單;預設為 deps 相同,這些內容會顯示在執行階段的類別路徑中,但與編譯時間類別路徑不同。這裡應列出只有在執行階段需要的依附元件。依附元件分析工具應忽略同時顯示在 runtime_deps 和 deps 中的目標。 |
stamp
|
整數;預設值為
除非依附元件變更,否則系統不會重新建構經過標記的二進位檔。 |
test_class
|
字串;預設為
這個屬性可指定要由此測試執行的 Java 類別名稱。這項設定很少需要設定。如果省略這個引數,系統會使用名稱對應至此 |
use_launcher
|
布林值;預設值為 如果將這項屬性設為 false,系統會忽略這個目標的 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 規則,而不要自行定義規則。
這項規則是 --run_under 標記用於 bazel 測試和 Blaze 執行作業的適當目標。模擬器會啟動模擬器、將要測試/執行的目標複製到模擬器,然後測試或執行。
如果基礎 system_image 是以 X86 為基礎,且已針對 I686 CPU 架構完成最佳化調整,android_device
即可支援建立 KVM 映像檔。如要使用 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 指令,這個通訊埠是 ADB 會連線的目標通訊埠。
- --emulator_port:用於公開模擬器 telnet 管理主控台的通訊埠。
- --enable_display:如果為 true,則會啟動帶有顯示裝置的模擬器 (預設為 false)。
- --action:開始或終止。
- --apks_to_install:要在模擬器上安裝的 APK 清單。
引數
屬性 | |
---|---|
name |
名稱;必填 這個目標的專屬名稱。 |
cache
|
整數;必要 模擬器快取分區的大小 (以 MB 為單位)。最小值為 16 MB。 |
default_properties
|
標籤;預設為 |
horizontal_resolution
|
整數;必要 要模擬的水平螢幕解析度 (以像素為單位)。 最小值為 240。 |
platform_apks
|
標籤清單;預設值為 |
ram
|
整數;必填 針對裝置模擬的 RAM 容量 (以 MB 為單位)。 這項設定適用於整部裝置,而非裝置上安裝的特定應用程式。最小值為 64 MB。 |
screen_density
|
整數;必填 模擬螢幕的密度,以每英寸像素為單位。最小值為 30 ppi。 |
system_image
|
標籤;必填 包含下列檔案的檔案群組:
|
vertical_resolution
|
整數;必要 要模擬的垂直螢幕解析度 (以像素為單位)。 最小值為 240。 |
vm_heap
|
整數;必要 Android 會用來處理各個程序的虛擬機器堆積大小 (以 MB 為單位)。最小值為 16 MB。 |
android_ndk_repository
查看規則來源android_ndk_repository(name, api_level, path, repo_mapping)
設定 Bazel 使用 Android NDK,以便使用原生程式碼建構 Android 目標。
請注意,這個 android_ndk_repository
實作項目將由 Starlark 中的實作項目取代。我們將在 android_ndk_repository
的 Starlark 版本中實作 NDK 的未來版本 (包括 25 以上版本)。如要瞭解 Starlark 版本,請參閱 rules_android_ndk。
請注意,針對 Android 進行建構也需要 WORKSPACE
檔案中的 android_sdk_repository
規則。
詳情請參閱 使用 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-r20
工作區內的 Android NDK。這個外掛程式在編譯 JNI 程式碼時會使用 API 級別 24 的程式庫。
cpufeatures
Android NDK 包含 cpufeatures 程式庫,可用於在執行階段偵測裝置的 CPU。以下範例說明如何將 Cpufeatures 與 Bazel 搭配使用。
# jni.cc #include "ndk/sources/android/cpufeatures/cpu-features.h" ...
# BUILD cc_library( name = "jni", srcs = ["jni.cc"], deps = ["@androidndk//:cpufeatures"], )
引數
屬性 | |
---|---|
name |
名稱;必填 這個目標的專屬名稱。 |
api_level
|
整數;不可設定;預設值為 |
path
|
字串;nonconfigurable;預設值為 $ANDROID_NDK_HOME 環境變數。
您可以從 Android 開發人員網站下載 Android NDK。 |
repo_mapping
|
字典:字串 -> 字串;預設為 舉例來說,項目 |
android_sdk_repository
查看規則來源android_sdk_repository(name, api_level, build_tools_version, path, repo_mapping)
設定 Bazel 使用本機 Android SDK,以支援建構 Android 目標。
範例
設定 Bazel 適用的 Android SDK 時,最基本的方法是在WORKSPACE
檔案中納入名為「androidsdk」的 android_sdk_repository
規則,並將 $ANDROID_HOME
環境變數設為 Android SDK 的路徑。根據預設,Bazel 會使用 Android SDK 中安裝的最高 Android API 級別和建構工具版本。android_sdk_repository( name = "androidsdk", )
為確保能夠重現的版本,path
、api_level
和 build_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_binary
和 android_library
目標的依附元件。
產生的目標名稱會取自 Android 支援存放區中程式庫的 Maven 座標,格式為 @androidsdk//${group}:${artifact}-${version}
。以下範例說明 android_library
如何依附 25.0.0 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
|
整數;不可設定;預設值為
如要查看 |
build_tools_version
|
字串;不可設定;預設值為 Bazel 需要建構工具 30.0.0 以上版本。 |
path
|
字串;nonconfigurable;預設值為 $ANDROID_HOME 環境變數。
您可以前往 Android 開發人員網站下載 Android SDK。 |
repo_mapping
|
字典:字串 -> 字串;預設值為 舉例來說,項目 |