Quy tắc Android

Báo cáo sự cố Xem nguồn

Quy tắc

android_binary

Xem nguồn quy tắc
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)

Tạo tệp gói ứng dụng Android (.apk).

Mục tiêu đầu ra ngầm ẩn

  • name.apk: Tệp gói ứng dụng Android có chữ ký khoá gỡ lỗi và căn chỉnh zip, có thể dùng để phát triển và gỡ lỗi ứng dụng. Bạn không thể phát hành ứng dụng khi ký bằng khoá gỡ lỗi.
  • name_unsigned.apk: Một phiên bản chưa ký của tệp ở trên có thể được ký bằng khoá phát hành trước khi phát hành công khai.
  • name_deploy.jar: Một kho lưu trữ Java chứa mục đích đóng tạm thời của mục tiêu này.

    Tệp jar triển khai chứa tất cả các lớp mà trình tải lớp sẽ tìm thấy trên đường dẫn lớp thời gian chạy của mục tiêu này từ đầu đến cuối.

  • name_proguard.jar: Một kho lưu trữ Java chứa kết quả chạy ProGuard trên name_deploy.jar. Kết quả này chỉ được tạo nếu bạn chỉ định thuộc tính proguard_specs.
  • name_proguard.map: Kết quả của tệp ánh xạ khi chạy ProGuard trên name_deploy.jar. Kết quả này chỉ được tạo nếu bạn chỉ định thuộc tính proguard_specs và đặt proguard_generate_mapping hoặc shrink_resources.

Ví dụ

Bạn có thể tìm thấy các ví dụ về quy tắc Android trong thư mục examples/android của cây nguồn Bazel.

Đối số

Thuộc tính
name

Name; required

Tên duy nhất cho mục tiêu này.

deps

List of labels; optional

Danh sách các thư viện khác được liên kết đến mục tiêu nhị phân. Các loại thư viện được phép là: android_library, java_library với quy tắc ràng buộc androidcc_library gói hoặc tạo .so thư viện gốc cho nền tảng mục tiêu Android.
srcs

List of labels; optional

Danh sách các tệp nguồn được xử lý để tạo mục tiêu.

Các tệp srcs thuộc loại .java được biên dịch. Để dễ đọc, bạn không nên đặt tên của một tệp nguồn .java đã tạo vào srcs. Thay vào đó, hãy đặt tên quy tắc phụ thuộc vào srcs như phần mô tả bên dưới.

Các tệp srcs thuộc loại .srcjar sẽ được giải nén và biên dịch. (Thao tác này rất hữu ích nếu bạn cần tạo một tập hợp các tệp .java với genrule hoặc tiện ích bản dựng.)

assets

List of labels; optional

Danh sách tài sản cần đóng gói. Thường thì đây là glob của tất cả tệp trong thư mục assets. Bạn cũng có thể tham chiếu đến các quy tắc khác (bất kỳ quy tắc nào tạo ra tệp) hoặc tệp đã xuất trong các gói khác, miễn là tất cả các tệp đó nằm trong thư mục assets_dir trong gói tương ứng.
assets_dir

String; optional

Chuỗi này cung cấp đường dẫn đến các tệp trong assets. Cặp assetsassets_dir mô tả những tài sản đóng gói. Bạn cần cung cấp cả hai thuộc tính hoặc không cung cấp thuộc tính nào trong số đó.
crunch_png

Boolean; optional; default is True

Chạy tệp PNG (hoặc không). Quá trình này không phụ thuộc vào quá trình xử lý 9 bản vá, quá trình này luôn được thực hiện. Đây là giải pháp không dùng nữa cho lỗi aapt đã được khắc phục trong aapt2.
custom_package

String; optional

Gói Java sẽ tạo nguồn java. Theo mặc định, gói được dự đoán từ thư mục có tệp BUILD chứa quy tắc này. Bạn có thể chỉ định một gói khác nhưng không nên làm như vậy vì gói này có thể gây ra xung đột đường dẫn lớp với các thư viện khác chỉ được phát hiện trong thời gian chạy.
debug_key

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

Tệp chứa kho khoá gỡ lỗi dùng để ký APK gỡ lỗi. Thường thì bạn không nên sử dụng khoá khác với khoá mặc định. Vì vậy, bạn nên bỏ thuộc tính này.

CẢNH BÁO: Không sử dụng khóa sản xuất nên được bảo vệ nghiêm ngặt và không được giữ trong cây nguồn của bạn.

debug_signing_keys

List of labels; optional

Danh sách các tệp, kho khoá gỡ lỗi dùng để ký APK gỡ lỗi. Thường thì bạn không nên sử dụng các khoá khác với khoá mặc định. Vì vậy, bạn nên bỏ thuộc tính này.

CẢNH BÁO: Không sử dụng khóa sản xuất nên được bảo vệ nghiêm ngặt và không được giữ trong cây nguồn của bạn.

debug_signing_lineage_file

Label; optional

Tệp chứa loạt ký tự cho debug_ signing_keys. Thường thì bạn không nên sử dụng các khoá khác với khoá mặc định. Vì vậy, bạn nên bỏ thuộc tính này.

CẢNH BÁO: Không sử dụng khóa sản xuất nên được bảo vệ nghiêm ngặt và không được giữ trong cây nguồn của bạn.

densities

List of strings; optional

Mật độ để lọc khi xây dựng APK. Thao tác này sẽ loại bỏ các tài nguyên có thể vẽ của đường quét mà thiết bị không có mật độ màn hình đã chỉ định để tải kích thước APK. Phần màn hình tương thích tương ứng cũng sẽ được thêm vào tệp kê khai nếu phần đó chưa chứa trang thông tin tập hợp.
dex_shards

Integer; optional; default is 1

Khi tạo tệp dex, bạn nên phân tách số lượng phân đoạn. Điều này giúp việc tạo tệp dex nhanh hơn nhiều với chi phí cài đặt ứng dụng và thời gian khởi động. Tệp nhị phân càng lớn thì càng nên sử dụng nhiều phân đoạn. Bạn nên bắt đầu thử nghiệm với giá trị 25.

Xin lưu ý rằng mỗi phân đoạn sẽ dẫn đến ít nhất một dex trong ứng dụng cuối cùng. Vì lý do này, bạn không nên đặt giá trị này thành nhiều hơn 1 cho các tệp nhị phân của bản phát hành.

dexopts

List of strings; optional

Cờ hiệu dòng lệnh bổ sung cho công cụ dx khi tạo classes.dex. Tuỳ thuộc vào hoạt động thay thế "Tạo biến"mã hoá vỏ Bourne.
enable_data_binding

Boolean; optional; default is False

Nếu đúng, quy tắc này sẽ xử lý các biểu thức liên kết dữ liệu trong các tài nguyên bố cục có trong thuộc tính resource_files. Nếu không có tuỳ chọn cài đặt này, các biểu thức liên kết dữ liệu sẽ tạo ra lỗi bản dựng.

Để tạo một ứng dụng Android có liên kết dữ liệu, bạn cũng phải làm như sau:

  1. Đặt thuộc tính này cho tất cả quy tắc Android phụ thuộc bắc cầu vào thuộc tính này. Điều này là do các phần phụ thuộc kế thừa biểu thức liên kết dữ liệu của quy tắc thông qua việc hợp nhất tài nguyên. Vì vậy, các biến này cũng cần được xây dựng bằng liên kết dữ liệu để phân tích cú pháp các biểu thức đó.
  2. Thêm một mục deps = cho thư viện thời gian chạy liên kết dữ liệu vào tất cả các mục tiêu đặt thuộc tính này. Vị trí của thư viện này phụ thuộc vào cách thiết lập kho hàng của bạn.
incremental_dexing

Integer; optional; nonconfigurable; default is -1

Buộc xây dựng mục tiêu có hoặc không có tệp dex tăng dần, ghi đè mặc định và cờ --incremental_dexing.
instruments

Label; optional

Mục tiêu android_binary để đo lường.

Nếu bạn đặt thuộc tính này, thì android_binary này sẽ được coi là một ứng dụng kiểm thử cho các kiểm thử đo lường. Sau đó, mục tiêu android_instrumentation_test có thể chỉ định mục tiêu này trong thuộc tính test_app.

javacopts

List of strings; optional

Các tuỳ chọn trình biên dịch bổ sung cho mục tiêu này. Tuỳ thuộc vào hoạt động thay thế "Tạo biến"mã hoá vỏ Bourne.

Các tuỳ chọn trình biên dịch này được chuyển sang javac sau các tuỳ chọn trình biên dịch chung.

key_rotation_min_sdk

String; optional

Đặt phiên bản nền tảng Android tối thiểu (Cấp API) mà khoá ký xoay vòng của APK sẽ được dùng để tạo chữ ký của APK. Khoá ký ban đầu cho APK sẽ được dùng cho mọi phiên bản nền tảng trước đó.
main_dex_list

Label; optional

Tệp văn bản chứa danh sách tên tệp của lớp. Các lớp do những tệp lớp đó xác định sẽ được đưa vào các loại chính.dex. ví dụ:
          android/support/multidex/MultiDex$V19.class
          android/support/multidex/MultiDex.class
          android/support/multidex/MultiDexApplication.class
          com/google/common/base/Objects.class
                    
Phải được dùng với multidex="manual_main_dex".
main_dex_list_opts

List of strings; optional

Các tuỳ chọn dòng lệnh để chuyển đến trình tạo danh sách dex chính. Sử dụng tùy chọn này để tác động đến các lớp có trong danh sách dex chính.
main_dex_proguard_specs

List of labels; optional

Các tệp được dùng làm thông số kỹ thuật Proguard để xác định các lớp phải được giữ trong tệp dex chính. Chỉ được phép nếu bạn đặt thuộc tính multidex thành legacy.
manifest

Label; required

Tên của tệp kê khai Android, thường là AndroidManifest.xml. Phải được xác định nếu resource_files hoặc nội dung được xác định.
manifest_values

Dictionary: String -> String; optional

Dữ liệu kiểu từ điển của giá trị sẽ bị ghi đè trong tệp kê khai. Mọi bản sao của ${name} trong tệp kê khai sẽ được thay thế bằng giá trị tương ứng với tên trong từ điển này. applicationId, versionCode, versionName, minSdkVersion, targetSdkVersion và maxSdkVersion cũng sẽ ghi đè các thuộc tính tương ứng của tệp kê khai và sử dụng các thẻ-sdk. packageName sẽ bị bỏ qua và sẽ được đặt từ applicationId nếu được chỉ định hoặc gói trong tệp kê khai. Khi tệp manifest_merger được đặt thành cũ, chỉ applicationId, versionCode và versionName sẽ có hiệu lực.
multidex

String; optional; default is "native"

Liệu có tách mã thành nhiều tệp dex hay không.
Các giá trị có thể là:
  • native: Chia mã thành nhiều tệp dex khi vượt quá giới hạn chỉ mục dex 64K. Giả sử hỗ trợ nền tảng gốc để tải lớp multidex trong thời gian chạy. Chế độ này chỉ hoạt động với Android L trở lên.
  • legacy: Chia mã thành nhiều tệp dex khi vượt quá giới hạn chỉ mục dex 64K. Giả sử các lớp multidex được tải thông qua mã xử lý ứng dụng (tức là không có hỗ trợ nền tảng gốc).
  • manual_main_dex: Chia mã thành nhiều tệp dex khi vượt quá giới hạn chỉ mục dex 64K. Bạn cần chỉ định nội dung của tệp dex chính bằng cách cung cấp danh sách các lớp trong tệp văn bản sử dụng thuộc tính main_dex_list.
  • off: Biên dịch tất cả mã vào một tệp dex, ngay cả khi tệp vượt quá giới hạn chỉ mục.
nocompress_extensions

List of strings; optional

Danh sách đuôi tệp để không nén trong APK.
package_id

Integer; optional; default is 0

ID gói được chỉ định cho các tài nguyên trong tệp nhị phân này.

Xem đối số --package-id của AAPT2 để biết thêm thông tin. Điều này thường (và nên) không được đặt, dẫn đến giá trị mặc định là 127 (0x7F).

plugins

List of labels; optional

Các trình bổ trợ biên dịch Java để chạy trong thời gian biên dịch. Mọi java_plugin được chỉ định trong thuộc tính plugin sẽ chạy bất cứ khi nào mục tiêu này được tạo. Tài nguyên do trình bổ trợ tạo ra sẽ được đưa vào tệp kết quả tìm kiếm của mục tiêu.
proguard_apply_dictionary

Label; optional

Tệp được dùng làm ánh xạ cho proguard. Một dòng "word" (phân tách các dòng) để lấy dữ liệu khi đổi tên lớp và thành viên trong quá trình làm rối mã nguồn.
proguard_apply_mapping

Label; optional

Tệp được dùng làm ánh xạ cho proguard. Tệp ánh xạ do proguard_generate_mapping tạo sẽ được sử dụng lại để áp dụng cùng một bản đồ ánh xạ cho bản dựng mới.
proguard_generate_mapping

Boolean; optional; nonconfigurable; default is False

Có tạo tệp ánh xạ Proguard hay không. Tệp ánh xạ sẽ chỉ được tạo nếu bạn chỉ định proguard_specs. Tệp này sẽ liệt kê bản đồ ánh xạ giữa tên lớp, phương thức và tên trường ban đầu và bị làm rối mã nguồn.

CẢNH BÁO: Nếu bạn sử dụng thuộc tính này, thông số kỹ thuật của Proguard sẽ không được chứa cả -dontobfuscate-printmapping.

proguard_specs

List of labels; optional

Tệp được dùng làm thông số kỹ thuật Proguard. Tệp này sẽ mô tả tập hợp các thông số kỹ thuật mà Proguard sẽ sử dụng.
resource_configuration_filters

List of strings; optional

Danh sách các bộ lọc cấu hình tài nguyên, chẳng hạn như "en" sẽ giới hạn các tài nguyên trong APK chỉ thành các tài nguyên trong cấu hình "en". Để bật ngôn ngữ giả lập, hãy thêm ngôn ngữ giả lập en_XA và/hoặc ar_XB.
resource_files

List of labels; optional

Danh sách tài nguyên cần đóng gói. Thường thì đây là glob của tất cả tệp trong thư mục res.
Bạn cũng có thể tham chiếu các tệp đã tạo (từ quy tắc tạo) bằng Nhãn tại đây. Hạn chế duy nhất là các kết quả đầu ra được tạo phải nằm trong cùng thư mục "res" với mọi tệp tài nguyên khác có trong đó.
shrink_resources

Integer; optional; default is -1

Liệu có cần rút gọn tài nguyên hay không. Các tài nguyên không được nhị phân sử dụng sẽ bị xóa khỏi APK. Điều này chỉ được hỗ trợ cho các quy tắc sử dụng tài nguyên cục bộ (tức là các thuộc tính manifestresource_files) và yêu cầu ProGuard. Cách thức hoạt động chủ yếu tương tự như trình rút gọn tài nguyên Gradle (https://developer.android.com/studio/build/shrink-code.html#shrink-resources).

Những khác biệt đáng chú ý:

  • tài nguyên trong values/ sẽ bị xoá cũng như tài nguyên dựa trên tệp
  • sử dụng strict mode theo mặc định
  • chỉ hỗ trợ các tài nguyên mã nhận dạng không dùng đến với aapt2
Nếu tính năng rút gọn tài nguyên đang bật, thì name_files/resource_shrinker.log cũng sẽ được tạo, cung cấp thông tin chi tiết về quá trình phân tích và xoá tài khoản.

Các loại tệp có thể được thu thập dữ liệu bao gồm:

  • shrink_resources = 1: Bật tính năng rút gọn tài nguyên Android
  • shrink_resources = 0: Tắt tính năng rút gọn tài nguyên Android
  • shrink_resources = -1: Tính năng rút gọn chịu sự kiểm soát của cờ android-resource_shrinking.

aar_nhập

Xem nguồn quy tắc
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)

Quy tắc này cho phép sử dụng các tệp .aar làm thư viện cho các quy tắc android_libraryandroid_binary.

Ví dụ

    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"],
    )

Đối số

Thuộc tính
name

Name; required

Tên duy nhất cho mục tiêu này.

aar

Label; required

Tệp .aar để cung cấp cho các mục tiêu Android phụ thuộc vào mục tiêu này.
exports

List of labels; optional

Mục tiêu để xuất sang các quy tắc phụ thuộc vào quy tắc này. Xem java_library.exports.
srcjar

Label; optional

Một tệp JAR chứa mã nguồn cho các tệp JAR được biên dịch trong AAR.

thư viện_android

Xem nguồn quy tắc
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)

Quy tắc này biên dịch và lưu trữ các nguồn của quy tắc thành tệp .jar. Thư viện thời gian chạy Android android.jar được ngầm đặt trên đường dẫn lớp biên dịch.

Mục tiêu đầu ra ngầm ẩn

  • libname.jar: Một kho lưu trữ Java.
  • libname-src.jar: Một tệp lưu trữ chứa các nguồn ("jar jar").
  • name.aar: Một gói Android 'aar' chứa tệp lưu trữ java và các tài nguyên của mục tiêu này. Nó không chứa phần đóng cửa bắc cầu.

Ví dụ

Bạn có thể tìm thấy các ví dụ về quy tắc Android trong thư mục examples/android của cây nguồn Bazel.

Ví dụ sau cho thấy cách đặt idl_import_root. Cho //java/bazel/helloandroid/BUILD chứa:

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"],
)

Đối số

Thuộc tính
name

Name; required

Tên duy nhất cho mục tiêu này.

deps

List of labels; optional

Danh sách các thư viện khác cần liên kết. Các loại thư viện được phép là: android_library, java_library với quy tắc ràng buộc androidcc_library gói hoặc tạo .so thư viện gốc cho nền tảng mục tiêu Android.
srcs

List of labels; optional

Danh sách các tệp .java hoặc .srcjar được xử lý để tạo mục tiêu.

Các tệp srcs thuộc loại .java được biên dịch. Để dễ đọc, bạn không nên đặt tên của một tệp nguồn .java đã tạo vào srcs. Thay vào đó, hãy đặt tên quy tắc phụ thuộc vào srcs như phần mô tả bên dưới.

Các tệp srcs thuộc loại .srcjar sẽ được giải nén và biên dịch. (Thao tác này rất hữu ích nếu bạn cần tạo một tập hợp các tệp .java với genrule hoặc tiện ích bản dựng.)

Nếu bạn bỏ qua srcs, thì mọi phần phụ thuộc được chỉ định trong deps sẽ được xuất từ quy tắc này (xem phần xuất ra của java_library để biết thêm thông tin về cách xuất các phần phụ thuộc). Tuy nhiên, hành vi này sẽ sớm không còn được dùng; hãy cố gắng không dựa vào hành vi đó.

assets

List of labels; optional

Danh sách tài sản cần đóng gói. Thường thì đây là glob của tất cả tệp trong thư mục assets. Bạn cũng có thể tham chiếu đến các quy tắc khác (bất kỳ quy tắc nào tạo ra tệp) hoặc tệp đã xuất trong các gói khác, miễn là tất cả các tệp đó nằm trong thư mục assets_dir trong gói tương ứng.
assets_dir

String; optional

Chuỗi này cung cấp đường dẫn đến các tệp trong assets. Cặp assetsassets_dir mô tả những tài sản đóng gói. Bạn cần cung cấp cả hai thuộc tính hoặc không cung cấp thuộc tính nào trong số đó.
custom_package

String; optional

Gói Java sẽ tạo nguồn java. Theo mặc định, gói được dự đoán từ thư mục có tệp BUILD chứa quy tắc này. Bạn có thể chỉ định một gói khác nhưng không nên làm như vậy vì gói này có thể gây ra xung đột đường dẫn lớp với các thư viện khác chỉ được phát hiện trong thời gian chạy.
enable_data_binding

Boolean; optional; default is False

Nếu đúng, quy tắc này sẽ xử lý các biểu thức liên kết dữ liệu trong các tài nguyên bố cục có trong thuộc tính resource_files. Nếu không có tuỳ chọn cài đặt này, các biểu thức liên kết dữ liệu sẽ tạo ra lỗi bản dựng.

Để tạo một ứng dụng Android có liên kết dữ liệu, bạn cũng phải làm như sau:

  1. Đặt thuộc tính này cho tất cả quy tắc Android phụ thuộc bắc cầu vào thuộc tính này. Điều này là do các phần phụ thuộc kế thừa biểu thức liên kết dữ liệu của quy tắc thông qua việc hợp nhất tài nguyên. Vì vậy, các biến này cũng cần được xây dựng bằng liên kết dữ liệu để phân tích cú pháp các biểu thức đó.
  2. Thêm một mục deps = cho thư viện thời gian chạy liên kết dữ liệu vào tất cả các mục tiêu đặt thuộc tính này. Vị trí của thư viện này phụ thuộc vào cách thiết lập kho hàng của bạn.
exported_plugins

List of labels; optional

Danh sách java_plugin (ví dụ: trình xử lý chú giải) để xuất sang các thư viện phụ thuộc trực tiếp vào thư viện này.

Danh sách java_plugin được chỉ định sẽ được áp dụng cho mọi thư viện phụ thuộc trực tiếp vào thư viện này, giống như khi thư viện đó đã khai báo rõ ràng các nhãn này trong plugins.

exports

List of labels; optional

Việc đóng tất cả các quy tắc có thể tiếp cận thông qua các thuộc tính exports được coi là phần phụ thuộc trực tiếp của bất kỳ quy tắc nào trực tiếp phụ thuộc vào mục tiêu có exports.

exports không phải là phần phụ thuộc trực tiếp của quy tắc chứa các quy tắc đó.

exports_manifest

Integer; optional; default is 1

Liệu có xuất mục nhập tệp kê khai sang mục tiêu android_binary phụ thuộc vào mục tiêu này hay không. Không bao giờ xuất các thuộc tính uses-permissions.
idl_import_root

String; optional

Đường dẫn tương đối theo gói đến gốc của cây gói java chứa các nguồn không hợp lệ có trong thư viện này.

Đường dẫn này sẽ được dùng làm thư mục gốc khi nhập khi xử lý các nguồn không hợp lệ phụ thuộc vào thư viện này.

Khi idl_import_root được chỉ định, cả idl_parcelablesidl_srcs đều phải ở đường dẫn mà gói java của đối tượng mà chúng đại diện trong idl_import_root chỉ định. Khi idl_import_root không được chỉ định, cả idl_parcelablesidl_srcs đều phải ở tại đường dẫn mà gói chỉ định trong thư mục gốc Java.

Xem ví dụ.

idl_parcelables

List of labels; optional

Danh sách các định nghĩa IDL Android cần cung cấp dưới dạng tệp nhập. Những tệp này sẽ được cung cấp dưới dạng mục nhập cho bất kỳ mục tiêu android_library nào phụ thuộc vào thư viện này, trực tiếp hoặc thông qua việc đóng chuyển tiếp, nhưng sẽ không được dịch sang Java hoặc biên dịch.

Bạn chỉ nên bao gồm các tệp .aidl tương ứng trực tiếp với các nguồn .java trong thư viện này (ví dụ: các phương thức triển khai tuỳ chỉnh của Parcelable), nếu không thì bạn nên sử dụng idl_srcs.

Bạn phải đặt các tệp này sao cho phù hợp để trình biên dịch aidl tìm thấy chúng. Hãy xem mô tả về idl_import_root để biết thông tin về ý nghĩa của điều này.

idl_preprocessed

List of labels; optional

Danh sách các định nghĩa IDL Android được xử lý trước để cung cấp dưới dạng nhập. Những tệp này sẽ được cung cấp dưới dạng mục nhập cho bất kỳ mục tiêu android_library nào phụ thuộc vào thư viện này, trực tiếp hoặc thông qua việc đóng chuyển tiếp, nhưng sẽ không được dịch sang Java hoặc biên dịch.

Bạn chỉ nên đưa các tệp .aidl được xử lý trước tương ứng trực tiếp với các nguồn .java trong thư viện này (ví dụ: các phương thức triển khai tuỳ chỉnh của Parcelable), nếu không, hãy sử dụng idl_srcs cho các định nghĩa Android IDL cần được dịch sang giao diện Java và sử dụng idl_parcelable cho các tệp AIDL chưa xử lý trước.

idl_srcs

List of labels; optional

Danh sách định nghĩa Android IDL để dịch sang giao diện Java. Sau khi được tạo, các giao diện Java sẽ được biên dịch cùng với nội dung của srcs.

Những tệp này sẽ được cung cấp dưới dạng tệp nhập cho bất kỳ mục tiêu android_library nào phụ thuộc vào thư viện này, trực tiếp hoặc thông qua tính năng đóng bắc cầu.

Bạn phải đặt các tệp này sao cho phù hợp để trình biên dịch aidl tìm thấy chúng. Hãy xem mô tả về idl_import_root để biết thông tin về ý nghĩa của điều này.

javacopts

List of strings; optional

Các tuỳ chọn trình biên dịch bổ sung cho mục tiêu này. Tuỳ thuộc vào hoạt động thay thế "Tạo biến"mã hoá vỏ Bourne.

Các tuỳ chọn trình biên dịch này được chuyển sang javac sau các tuỳ chọn trình biên dịch chung.

manifest

Label; optional

Tên của tệp kê khai Android, thường là AndroidManifest.xml. Phải được xác định nếu resource_files hoặc nội dung được xác định.

Boolean; optional; default is False

Chỉ sử dụng thư viện này để biên dịch chứ không phải trong thời gian chạy. Kết quả của một quy tắc được đánh dấu là neverlink sẽ không được dùng trong quá trình tạo .apk. Hữu ích nếu thư viện sẽ được môi trường thời gian chạy cung cấp trong quá trình thực thi.
plugins

List of labels; optional

Các trình bổ trợ biên dịch Java để chạy trong thời gian biên dịch. Mọi java_plugin được chỉ định trong thuộc tính plugin sẽ chạy bất cứ khi nào mục tiêu này được tạo. Tài nguyên do trình bổ trợ tạo ra sẽ được đưa vào tệp kết quả tìm kiếm của mục tiêu.
proguard_specs

List of labels; optional

Tệp được dùng làm thông số kỹ thuật Proguard. Những điều này sẽ mô tả tập hợp các thông số kỹ thuật mà Proguard sẽ sử dụng. Nếu được chỉ định, các thư viện đó sẽ được thêm vào bất kỳ mục tiêu android_binary nào tùy thuộc vào thư viện này. Các tệp được bao gồm ở đây chỉ được có các quy tắc rõ ràng, cụ thể là -dontnote, -dontwarn, nonosideEffect và các quy tắc bắt đầu bằng -keep. Các tuỳ chọn khác chỉ có thể xuất hiện trong proguard_specs của android_binary, để đảm bảo việc hợp nhất không phải dữ liệu tự động.
resource_files

List of labels; optional

Danh sách tài nguyên cần đóng gói. Thường thì đây là glob của tất cả tệp trong thư mục res.
Bạn cũng có thể tham chiếu các tệp đã tạo (từ quy tắc tạo) bằng Nhãn tại đây. Hạn chế duy nhất là các kết quả đầu ra được tạo phải nằm trong cùng thư mục "res" với mọi tệp tài nguyên khác có trong đó.

android_Instrumentation_test

Xem nguồn quy tắc
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)

Quy tắc android_instrumentation_test chạy các bài kiểm thử đo lường của Android. Hoạt động này sẽ khởi động một trình mô phỏng, cài đặt ứng dụng đang được kiểm thử, ứng dụng kiểm thử và bất kỳ ứng dụng cần thiết nào khác, đồng thời chạy các chương trình kiểm thử được xác định trong gói kiểm thử.

Thuộc tính test_app chỉ định android_binary chứa nội dung kiểm thử. android_binary lần lượt chỉ định ứng dụng android_binary đang được kiểm thử thông qua thuộc tính Instruments.

Ví dụ:

# 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",
)

Đối số

Thuộc tính
name

Name; required

Tên duy nhất cho mục tiêu này.

support_apks

List of labels; optional

Các APK khác để cài đặt trên thiết bị trước khi bắt đầu kiểm thử đo lường.
target_device

Label; required

android_device nơi thử nghiệm sẽ chạy.

Để chạy kiểm thử trên trình mô phỏng đang chạy hoặc trên thiết bị thực tế, bạn hãy sử dụng các đối số sau: --test_output=streamed --test_arg=--device_broker_type=LOCAL_ADB_SERVER --test_arg=--device_serial_number=$device_identifier

test_app

Label; required

Mục tiêu android_binary chứa các lớp kiểm thử. Mục tiêu android_binary phải chỉ định mục tiêu nào đang được kiểm thử thông qua thuộc tính instruments.

android_local_test

Xem nguồn quy tắc
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)

Quy tắc này dành cho các quy tắc kiểm thử đơn vị android_library cục bộ (trái ngược với trên thiết bị). Hoạt động này hoạt động với khung kiểm thử Android Robolectric. Hãy xem trang web Android Robolectric để biết thông tin chi tiết về cách viết thử nghiệm Robolectric.

Mục tiêu đầu ra ngầm ẩn

  • name.jar: Bản lưu trữ Java của kiểm thử.
  • name-src.jar: Một tệp lưu trữ chứa các nguồn ("jar jar").
  • name_deploy.jar: Tệp lưu trữ triển khai Java phù hợp để triển khai (chỉ được tạo nếu được yêu cầu rõ ràng).

Ví dụ

Để sử dụng Robolectric với android_local_test, hãy thêm kho lưu trữ của Robolectric vào tệp 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()
Phương thức này lấy các quy tắc maven_jar cần thiết cho Robolectric. Sau đó, mỗi quy tắc android_local_test phải phụ thuộc vào @robolectric//bazel:robolectric. Xem ví dụ bên dưới.

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",
)

Đối số

Thuộc tính
name

Name; required

Tên duy nhất cho mục tiêu này.

deps

List of labels; optional

Danh sách thư viện cần thử nghiệm cũng như các thư viện bổ sung cần được liên kết với mục tiêu. Tất cả tài nguyên, tài sản và tệp kê khai được khai báo trong các quy tắc Android trong sự đóng cửa bắc cầu của thuộc tính này đều được cung cấp trong quá trình kiểm thử.

Danh sách quy tắc được phép trong depsandroid_library, aar_import, java_import, java_libraryjava_lite_proto_library.

srcs

List of labels; optional

Danh sách các tệp nguồn được xử lý để tạo mục tiêu. Bắt buộc ngoại trừ trường hợp đặc biệt theo mô tả dưới đây.

Các tệp srcs thuộc loại .java được biên dịch. Để dễ đọc, bạn không nên đặt tên của một tệp nguồn .java đã tạo vào srcs. Thay vào đó, hãy đặt tên quy tắc phụ thuộc vào srcs như phần mô tả bên dưới.

Các tệp srcs thuộc loại .srcjar sẽ được giải nén và biên dịch. (Thao tác này rất hữu ích nếu bạn cần tạo một tập hợp các tệp .java với genrule hoặc tiện ích bản dựng.)

Tất cả các tệp khác sẽ bị bỏ qua, miễn là có ít nhất một tệp thuộc loại tệp được mô tả ở trên. Nếu không, hệ thống sẽ phát sinh lỗi.

Thuộc tính srcs là bắt buộc và không được để trống, trừ phi runtime_deps được chỉ định.

custom_package

String; optional

Gói Java mà trong đó lớp R sẽ được tạo. Theo mặc định, gói được dự đoán là từ thư mục có chứa tệp BUILD có chứa quy tắc này. Nếu sử dụng thuộc tính này thì bạn cũng có thể phải sử dụng test_class.
densities

List of strings; optional

Mật độ để lọc khi xây dựng APK. Một phần màn hình tương thích tương ứng cũng sẽ được thêm vào tệp kê khai nếu phần tử này chưa có siêu sao StarlarkListing.
enable_data_binding

Boolean; optional; default is False

Nếu đúng, quy tắc này sẽ xử lý các tham chiếu liên kết dữ liệu được sử dụng trong các phần phụ thuộc đã bật liên kết dữ liệu mà quy trình kiểm thử này sử dụng. Nếu không có chế độ cài đặt này, các phần phụ thuộc liên kết dữ liệu sẽ không có mã tạo nhị phân cần thiết và có thể gây ra lỗi cho bản dựng.
javacopts

List of strings; optional

Các tuỳ chọn biên dịch bổ sung cho thư viện này. Tuỳ thuộc vào hoạt động thay thế "Tạo biến"mã hoá vỏ Bourne.

Các tuỳ chọn trình biên dịch này được chuyển sang javac sau các tuỳ chọn trình biên dịch chung.

jvm_flags

List of strings; optional

Danh sách cờ cần nhúng trong tập lệnh trình bao bọc được tạo để chạy tệp nhị phân này. Tuỳ thuộc vào hoạt động thay thế $(location)"Tạo biến", cũng như mã hoá shell Bourne.

Tập lệnh trình bao bọc cho tệp nhị phân Java bao gồm định nghĩa CLASSPATH (để tìm tất cả các tệp jar phụ thuộc) và gọi trình phiên dịch Java phù hợp. Dòng lệnh do tập lệnh trình bao bọc tạo ra bao gồm tên của lớp chính, theo sau là "$@" để bạn có thể truyền các đối số khác sau tên lớp. Tuy nhiên, các đối số dùng để phân tích cú pháp JVM phải được chỉ định trước tên lớp trên dòng lệnh. Nội dung của jvm_flags sẽ được thêm vào tập lệnh trình bao bọc trước khi tên lớp được liệt kê.

Xin lưu ý rằng thuộc tính này không ảnh hưởng đến kết quả *_deploy.jar.

manifest

Label; optional

Tên của tệp kê khai Android, thường là AndroidManifest.xml. Phải được xác định nếu xác định resource_files hoặc thành phần, hoặc nếu có bất kỳ tệp kê khai nào từ các thư viện đang kiểm thử có thẻ minSdkVersion.
manifest_values

Dictionary: String -> String; optional

Dữ liệu kiểu từ điển của giá trị sẽ bị ghi đè trong tệp kê khai. Mọi bản sao của ${name} trong tệp kê khai sẽ được thay thế bằng giá trị tương ứng với tên trong từ điển này. applicationId, versionCode, versionName, minSdkVersion, targetSdkVersionmaxSdkVersion cũng sẽ ghi đè các thuộc tính tương ứng của tệp kê khai và thẻ use-sdk. packageName sẽ bị bỏ qua và được đặt từ applicationId nếu được chỉ định hoặc gói trong tệp kê khai. Không cần phải có tệp kê khai trên quy tắc để sử dụng manifest_values.
nocompress_extensions

List of strings; optional

Danh sách các đuôi tệp để không nén trong tệp APK tài nguyên.
plugins

List of labels; optional

Các trình bổ trợ biên dịch Java để chạy trong thời gian biên dịch. Mọi java_plugin được chỉ định trong thuộc tính này sẽ chạy mỗi khi bạn tạo quy tắc này. Thư viện cũng có thể kế thừa trình bổ trợ từ các phần phụ thuộc sử dụng exported_plugins. Tài nguyên do trình bổ trợ tạo ra sẽ được đưa vào tệp kết quả chứa quy tắc này.
resource_configuration_filters

List of strings; optional

Danh sách các bộ lọc cấu hình tài nguyên, chẳng hạn như "en" sẽ giới hạn các tài nguyên trong APK chỉ thành các tài nguyên trong cấu hình "en".
resource_jars

List of labels; optional

Ngừng sử dụng: Thay vào đó, hãy sử dụng java_import và deps hoặc Runtime_deps.
resource_strip_prefix

String; optional

Tiền tố đường dẫn để xoá khỏi tài nguyên Java.

Nếu được chỉ định, tiền tố đường dẫn này sẽ bị xoá khỏi mọi tệp trong thuộc tính resources. Đã xảy ra lỗi khi tệp tài nguyên không nằm trong thư mục này. Nếu không được chỉ định (mặc định), đường dẫn của tệp tài nguyên được xác định theo cùng logic như gói Java của các tệp nguồn. Ví dụ: một tệp nguồn tại stuff/java/foo/bar/a.txt sẽ nằm tại foo/bar/a.txt.

runtime_deps

List of labels; optional

Các thư viện để chỉ cung cấp cho tệp nhị phân cuối cùng hoặc kiểm thử trong thời gian chạy. Giống như deps thông thường, các mục này sẽ xuất hiện trên đường dẫn lớp thời gian chạy, nhưng không giống như trên đường dẫn lớp thời gian biên dịch. Các phần phụ thuộc chỉ cần trong thời gian chạy phải được liệt kê ở đây. Các công cụ phân tích phần phụ thuộc nên bỏ qua các mục tiêu xuất hiện trong cả runtime_depsdeps.
stamp

Integer; optional; default is 0

Liệu có mã hóa thông tin bản dựng vào tệp nhị phân hay không. Có thể là những giá trị sau đây:
  • stamp = 1: Luôn đóng dấu thông tin bản dựng vào tệp nhị phân, ngay cả trong các bản dựng --nostamp. Bạn nên tránh sử dụng chế độ cài đặt này vì chế độ này có thể tắt bộ nhớ đệm từ xa cho tệp nhị phân và mọi hành động xuôi dòng phụ thuộc vào tệp đó.
  • stamp = 0: Luôn thay thế thông tin bản dựng bằng các giá trị không đổi. Điều này giúp cải thiện đáng kể việc lưu kết quả xây dựng vào bộ nhớ đệm.
  • stamp = -1: Việc nhúng thông tin bản dựng được kiểm soát bởi cờ --[no]stamp.

Các tệp nhị phân có dấu không được tạo lại trừ khi các phần phụ thuộc thay đổi.

test_class

String; optional

Lớp Java sẽ được trình chạy kiểm thử tải.

Thuộc tính này chỉ định tên của một lớp Java sẽ được chạy bằng chương trình kiểm thử này. Hiếm khi cần đặt giá trị này. Nếu đối số này bị bỏ qua, thì lớp Java có tên tương ứng với name của quy tắc android_local_test này sẽ được sử dụng. Lớp chú thích kiểm thử cần được chú thích bằng org.junit.runner.RunWith.

use_launcher

Boolean; optional; default is True

Liệu tệp nhị phân có nên sử dụng trình chạy tuỳ chỉnh hay không.

Nếu bạn đặt thuộc tính này thành false, thuộc tính launcher và cờ --java_launcher có liên quan sẽ bị bỏ qua đối với mục tiêu này.

thiết bị_android

Xem nguồn quy tắc
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)

Quy tắc này tạo một trình mô phỏng Android được định cấu hình bằng các thông số kỹ thuật cụ thể. Bạn có thể bắt đầu trình mô phỏng này thông qua lệnh chạy bazel hoặc bằng cách thực thi trực tiếp tập lệnh đã tạo. Bạn nên dựa vào các quy tắc hiện có của android_device thay vì xác định quy tắc của riêng mình.

Quy tắc này là một mục tiêu phù hợp để gắn cờ --run_under để kiểm thử bazel và chạy blaze. Bắt đầu một trình mô phỏng, sao chép mục tiêu đang được kiểm thử/chạy vào trình mô phỏng, thử nghiệm hoặc chạy mục tiêu đó nếu phù hợp.

android_device hỗ trợ tạo hình ảnh KVM nếu system_image cơ bản dựa trên X86 và được tối ưu hóa cho hầu hết kiến trúc CPU I686. Để sử dụng KVM, hãy thêm tags = ['requires-kvm'] vào quy tắc android_device.

Mục tiêu đầu ra ngầm ẩn

  • name_images/userdata.dat: Chứa các tệp hình ảnh và ảnh chụp nhanh để khởi động trình mô phỏng
  • name_images/emulator-meta-data.pb: Chứa thông tin được chuyển đổi tuần tự cần thiết để chuyển đến trình mô phỏng nhằm khởi động lại.

Ví dụ

Ví dụ sau cho biết cách sử dụng android_device. //java/android/helloandroid/BUILD chứa

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 chứa:

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

Quy tắc này sẽ tạo hình ảnh và tập lệnh bắt đầu. Bạn có thể khởi động trình mô phỏng cục bộ bằng cách thực thi bazel run :nexus_s -- --action=start. Tập lệnh sẽ hiển thị các cờ sau:

  • --adb_port: Cổng để hiển thị adb. Nếu muốn đưa ra các lệnh adb cho trình mô phỏng, thì đây là cổng mà bạn sẽ tạo adb kết nối.
  • --emulator_port: Cổng để hiển thị bảng điều khiển quản lý viễn thông của trình mô phỏng.
  • --enable_display: Bắt đầu trình mô phỏng bằng màn hình nếu là true (mặc định là false).
  • --hành động: Bắt đầu hoặc tiêu diệt.
  • --apks_to_install: danh sách các APK để cài đặt trên trình mô phỏng.

Đối số

Thuộc tính
name

Name; required

Tên duy nhất cho mục tiêu này.

cache

Integer; required

Dung lượng tính bằng megabyte của phân vùng bộ nhớ đệm của trình mô phỏng. Giá trị tối thiểu của thuộc tính này là 16 megabyte.
default_properties

Label; optional

Một tệp thuộc tính duy nhất được đặt trong /default.prop trên trình mô phỏng. Điều này cho phép tác giả quy tắc định cấu hình thêm để trình mô phỏng xuất hiện giống với một thiết bị thực (cụ thể là kiểm soát chuỗi UserAgent và các hành vi khác có thể khiến ứng dụng hoặc máy chủ hoạt động khác với một thiết bị cụ thể). Các thuộc tính trong tệp này sẽ ghi đè các thuộc tính chỉ đọc thường do trình mô phỏng thiết lập, chẳng hạn như ro.product.model.
horizontal_resolution

Integer; required

Độ phân giải màn hình theo chiều ngang tính bằng pixel để mô phỏng. Giá trị tối thiểu là 240.
platform_apks

List of labels; optional

Danh sách các APK được cài đặt trên thiết bị tại thời điểm khởi động.
ram

Integer; required

Lượng ram tính bằng megabyte để mô phỏng cho thiết bị. Quy định này áp dụng cho toàn bộ thiết bị, không chỉ cho một ứng dụng cụ thể được cài đặt trên thiết bị. Giá trị tối thiểu là 64 megabyte.
screen_density

Integer; required

Mật độ của màn hình mô phỏng tính bằng pixel trên inch. Giá trị tối thiểu của thuộc tính này là 30 ppi.
system_image

Label; required

Một nhóm tệp chứa các tệp sau:
  • system.img: Phân vùng hệ thống
  • kernel-qemu: Hạt nhân Linux mà trình mô phỏng sẽ tải
  • ramdisk.img: Hình ảnh đầu tiên để sử dụng tại thời điểm khởi động
  • userdata.img: Phân vùng dữ liệu người dùng ban đầu
  • source.properties: Tệp thuộc tính chứa thông tin về các hình ảnh
Những tệp này là một phần của SDK Android hoặc do bên thứ ba cung cấp (ví dụ: Intel cung cấp hình ảnh x86).
vertical_resolution

Integer; required

Độ phân giải màn hình dọc (tính bằng pixel) để mô phỏng. Giá trị tối thiểu là 240.
vm_heap

Integer; required

Dung lượng tính bằng megabyte của vùng nhớ khối xếp máy ảo mà Android sẽ sử dụng cho mỗi quy trình. Giá trị tối thiểu là 16 megabyte.

Android_ndk_repository

Xem nguồn quy tắc
android_ndk_repository(name, api_level, path, repo_mapping)

Định cấu hình Bazel để sử dụng Android NDK nhằm hỗ trợ xây dựng các mục tiêu Android bằng mã gốc.

Lưu ý rằng phương thức triển khai này của android_ndk_repository sẽ được thay thế bằng phương thức triển khai trong Starlark. Việc hỗ trợ cho các phiên bản NDK trong tương lai bao gồm cả phiên bản 25 trở lên sẽ được triển khai trong phiên bản Starlark của android_ndk_repository. Xem rules_android_ndk để biết phiên bản Starlark.

Xin lưu ý rằng việc tạo bản dựng cho Android cũng yêu cầu quy tắc android_sdk_repository trong tệp WORKSPACE của bạn.

Để biết thêm thông tin, hãy đọc tài liệu đầy đủ về cách sử dụng Android NDK với Bazel.

Ví dụ

android_ndk_repository(
    name = "androidndk",
)

Ví dụ trên sẽ định vị Android NDK từ $ANDROID_NDK_HOME và phát hiện cấp API cao nhất mà Android hỗ trợ.

android_ndk_repository(
    name = "androidndk",
    path = "./android-ndk-r20",
    api_level = 24,
)

Ví dụ trên sẽ sử dụng Android NDK nằm bên trong không gian làm việc của bạn trong ./android-ndk-r20. Công cụ này sẽ sử dụng các thư viện API cấp 24 khi biên dịch mã JNI.

cpufeatures

Android NDK chứa thư viện ccpufeatures có thể dùng để phát hiện CPU của thiết bị trong thời gian chạy. Ví dụ sau minh hoạ cách sử dụng cpufeatures với Bazel.

# jni.cc
#include "ndk/sources/android/cpufeatures/cpu-features.h"
...
# BUILD
cc_library(
    name = "jni",
    srcs = ["jni.cc"],
    deps = ["@androidndk//:cpufeatures"],
)

Đối số

Thuộc tính
name

Name; required

Tên duy nhất cho mục tiêu này.

api_level

Integer; optional; nonconfigurable; default is 0

Cấp độ API Android để xây dựng. Nếu không được chỉ định, cấp API cao nhất được cài đặt sẽ được sử dụng.
path

String; optional; nonconfigurable

Đường dẫn tuyệt đối hoặc tương đối đến Android NDK. Bạn phải đặt thuộc tính này hoặc biến môi trường $ANDROID_NDK_HOME.

Bạn có thể tải Android NDK xuống qua trang web dành cho nhà phát triển Android.

repo_mapping

Dictionary: String -> String; optional

Từ điển từ tên kho lưu trữ cục bộ đến tên kho lưu trữ toàn cục. Điều này cho phép kiểm soát phần phụ thuộc không gian làm việc cho các phần phụ thuộc của kho lưu trữ này.

Ví dụ: một mục "@foo": "@bar" khai báo rằng bất cứ lúc nào kho lưu trữ này phụ thuộc vào "@foo" (chẳng hạn như phần phụ thuộc trên "@foo//some:target"), thì trên thực tế, mục đó sẽ phân giải phần phụ thuộc đó trong "@bar" được khai báo trên toàn cầu ("@bar//some:target").

Android_sdk_repository

Xem nguồn quy tắc
android_sdk_repository(name, api_level, build_tools_version, path, repo_mapping)

Định cấu hình Bazel để sử dụng SDK Android cục bộ nhằm hỗ trợ xây dựng các mục tiêu Android.

Ví dụ

Việc tối thiểu để thiết lập SDK Android cho Bazel là đặt quy tắc android_sdk_repository có tên "androidsdk" trong tệp WORKSPACE và đặt biến môi trường $ANDROID_HOME thành đường dẫn của SDK Android. Theo mặc định, Bazel sẽ sử dụng cấp độ API cao nhất và phiên bản công cụ xây dựng được cài đặt trong SDK Android.
android_sdk_repository(
    name = "androidsdk",
)

Để đảm bảo các bản dựng có thể tái tạo, bạn có thể đặt thuộc tính path, api_levelbuild_tools_version thành các giá trị cụ thể. Bản dựng sẽ không thành công nếu SDK Android chưa cài đặt cấp độ API hoặc phiên bản công cụ xây dựng đã chỉ định.

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

Ví dụ trên cũng minh họa việc sử dụng đường dẫn tương đối không gian làm việc đến SDK Android. Điều này hữu ích nếu SDK Android là một phần của không gian làm việc Bazel (ví dụ: nếu SDK được kiểm tra vào chế độ kiểm soát phiên bản).

Thư viện hỗ trợ

Thư viện hỗ trợ hiện có trong Trình quản lý SDK Android dưới dạng "Kho lưu trữ hỗ trợ Android". Đây là một nhóm các thư viện Android phổ biến, chẳng hạn như thư viện Hỗ trợ và thư viện AppCompat, được đóng gói dưới dạng một kho lưu trữ Maven cục bộ. android_sdk_repository tạo các mục tiêu Bazel cho mỗi thư viện có thể sử dụng trong các phần phụ thuộc của mục tiêu android_binaryandroid_library.

Tên của các mục tiêu đã tạo được lấy từ toạ độ Maven của các thư viện trong Kho lưu trữ hỗ trợ Android, có định dạng là @androidsdk//${group}:${artifact}-${version}. Ví dụ sau cho thấy cách android_library có thể phụ thuộc vào phiên bản 25.0.0 của thư viện appcompat phiên bản 7.

android_library(
    name = "lib",
    srcs = glob(["*.java"]),
    manifest = "AndroidManifest.xml",
    resource_files = glob(["res/**"]),
    deps = ["@androidsdk//com.android.support:appcompat-v7-25.0.0"],
)

Đối số

Thuộc tính
name

Name; required

Tên duy nhất cho mục tiêu này.

api_level

Integer; optional; nonconfigurable; default is 0

Cấp API Android để xây dựng theo mặc định. Nếu không được chỉ định, cấp API cao nhất được cài đặt sẽ được sử dụng.

Cấp độ API dùng cho một bản dựng cụ thể có thể bị cờ android_sdk ghi đè. android_sdk_repository tạo một mục tiêu android_sdk cho mỗi cấp độ API được cài đặt trong SDK có tên @androidsdk//:sdk-${level}, cho dù thuộc tính này có được chỉ định hay không. Ví dụ: để xây dựng dựa trên cấp độ API không mặc định: bazel build --android_sdk=@androidsdk//:sdk-19 //java/com/example:app.

Để xem tất cả mục tiêu android_sdk do android_sdk_repository tạo, bạn có thể chạy bazel query "kind(android_sdk, @androidsdk//...)".

build_tools_version

String; optional; nonconfigurable

Phiên bản của bộ công cụ xây dựng Android để sử dụng trong SDK Android. Nếu bạn không chỉ định, công cụ xây dựng mới nhất sẽ cài đặt phiên bản mới nhất.

Bazel yêu cầu công cụ xây dựng phiên bản 30.0.0 trở lên.

path

String; optional; nonconfigurable

Đường dẫn tuyệt đối hoặc tương đối đến SDK Android. Bạn phải đặt thuộc tính này hoặc biến môi trường $ANDROID_HOME.

Bạn có thể tải SDK Android xuống từ trang web dành cho nhà phát triển Android.

repo_mapping

Dictionary: String -> String; optional

Từ điển từ tên kho lưu trữ cục bộ đến tên kho lưu trữ toàn cục. Điều này cho phép kiểm soát phần phụ thuộc không gian làm việc cho các phần phụ thuộc của kho lưu trữ này.

Ví dụ: một mục "@foo": "@bar" khai báo rằng bất cứ lúc nào kho lưu trữ này phụ thuộc vào "@foo" (chẳng hạn như phần phụ thuộc trên "@foo//some:target"), thì trên thực tế, mục đó sẽ phân giải phần phụ thuộc đó trong "@bar" được khai báo trên toàn cầu ("@bar//some:target").