Quy tắc Android

Báo cáo vấn đề Xem nguồn Nightly · 7.4 . 7.3 · 7.2 · 7.1 · 7.0 · 6.5

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 các tệp gói ứng dụng Android (.apk).

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

  • name.apk: Tệp gói ứng dụng Android được ký bằng khoá gỡ lỗi và zipaligned, 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: 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 tệp lưu trữ Java có chứa đóng bắc cầu 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 tìm thấy trong đườ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 tệp lưu trữ Java chứa kết quả của việc 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ả tệp ánh xạ của việc 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

Tên; bắt buộc

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

deps

Danh sách nhãn; mặc định là []

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

Danh sách nhãn; mặc định là []

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 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ư mô tả bên dưới.

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

assets

Danh sách nhãn; mặc định là []

Danh sách tài sản cần đóng gói. Đây thường là glob của mọi tệp trong thư mục assets. Bạn cũng có thể tham chiếu các quy tắc khác (mọi quy tắc 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 đó đều nằm trong thư mục assets_dir trong gói tương ứng.
assets_dir

Chuỗi; giá trị mặc định là ""

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

Boolean; giá trị mặc định là True

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

Chuỗi; giá trị mặc định là ""

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

Nhãn; mặc định là "@bazel_tools//tools/android:debug_keystore"

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

CẢNH BÁO: Không sử dụng khoá phát hành chính thức, bạn phải bảo vệ nghiêm ngặt các khoá này và không lưu trữ trong cây nguồn.

debug_signing_keys

Danh sách nhãn; mặc định là []

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

CẢNH BÁO: Không sử dụng khoá phát hành chính thức, bạn phải bảo vệ nghiêm ngặt các khoá này và không lưu trữ trong cây nguồn.

debug_signing_lineage_file

Nhãn; mặc định là None

Tệp chứa dòng chữ ký cho debug_signing_keys. Thường thì bạn không muốn sử dụng các khoá khác ngoài khoá mặc định, vì vậy, bạn nên bỏ qua thuộc tính này.

CẢNH BÁO: Không sử dụng khoá phát hành chính thức, bạn phải bảo vệ nghiêm ngặt các khoá này và không lưu trữ trong cây nguồn.

densities

Danh sách chuỗi; mặc định là []

Mật độ cần lọc khi tạo tệp 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à một thiết bị có mật độ màn hình đã chỉ định không tải được, để giảm kích thước tệp APK. Một phần tương ứng về màn hình tương thích cũng sẽ được thêm vào tệp kê khai nếu tệp này chưa chứa danh sách tập hợp con.
dex_shards

Số nguyên; mặc định là 1

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

Xin lưu ý rằng mỗi phân mảnh sẽ tạo ra ít nhất một tệp 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 phát hành.

dexopts

Danh sách chuỗi; mặc định là []

Các cờ dòng lệnh bổ sung cho công cụ dx khi tạo classes.dex. Áp dụng tuỳ chọn thay thế "Tạo biến"tạo mã thông báo shell Bourne.
enable_data_binding

Boolean; mặc định là 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 tài nguyên bố cục được đưa vào thông qua thuộc tính resource_files. Nếu không có chế độ cài đặt này, 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ả các quy tắc Android phụ thuộc vào quy tắc 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 lớp này cũng cần được tạo bằng tính nă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ục nhập 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 lưu trữ của bạn.
incremental_dexing

Số nguyên; không thể định cấu hình; giá trị mặc định là -1

Buộc tạo mục tiêu có hoặc không có hoạt động tạo tệp dex tăng dần, ghi đè các giá trị mặc định và cờ --rise_dexing.
instruments

Nhãn; mặc định là None

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

Nếu bạn đặt thuộc tính này, android_binary này sẽ được coi là một ứng dụng kiểm thử cho 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

Danh sách chuỗi; mặc định là []

Các tuỳ chọn bổ sung của trình biên dịch cho mục tiêu này. Chịu sự thay thế "Tạo biến"tạo mã thông báo shell Bourne.

Các tuỳ chọn trình biên dịch này được truyền đến javac sau các tuỳ chọn trình biên dịch toàn cục.

key_rotation_min_sdk

Chuỗi; mặc định là ""

Đặ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ẽ dùng để tạo chữ ký của APK. Khoá ký ban đầu cho APK sẽ được dùng cho tất cả các phiên bản trước của nền tảng.
main_dex_list

Nhãn; mặc định là None

Tệp văn bản chứa danh sách tên tệp lớp. Các lớp do các tệp lớp đó xác định sẽ được đưa vào classes.dex chính. 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 sử dụng với multidex="manual_main_dex".
main_dex_list_opts

Danh sách chuỗi; mặc định là []

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

Danh sách nhãn; mặc định là []

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ỉ cho phép nếu thuộc tính multidex được đặt thành legacy.
manifest

Nhãn; bắt buộc

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 tài sản được xác định.
manifest_values

Từ điển: Chuỗi -> Chuỗi; mặc định là {}

Từ điển gồm các giá trị sẽ được ghi đè trong tệp kê khai.

Mọi thực thể 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 trong tệp kê khai và thẻ uses-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 manifest_merger được đặt thành legacy, chỉ applicationId, versionCodeversionName mới có hiệu lực.

multidex

Chuỗi; giá trị mặc định là "native"

Liệu có chia mã thành nhiều tệp dex hay không.
Có thể dùng các giá trị sau:
  • native: Phân tách mã thành nhiều tệp dex khi vượt quá giới hạn chỉ mục 64K của dex. Giả định nền tảng gốc hỗ trợ việc tải các lớp multidex trong thời gian chạy. Tính năng này chỉ hoạt động với Android L trở lên.
  • legacy: Phân tách mã thành nhiều tệp dex khi vượt quá giới hạn chỉ mục 64K của dex. Giả sử các lớp multidex được tải thông qua mã ứng dụng (tức là không có tính năng hỗ trợ nền tảng gốc).
  • manual_main_dex: Phân tách mã thành nhiều tệp dex khi vượt quá giới hạn chỉ mục 64K của dex. 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 một 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ã thành một tệp dex, ngay cả khi tệp đó vượt quá giới hạn chỉ mục.
nocompress_extensions

Danh sách chuỗi; mặc định là []

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

Số nguyên; mặc định là 0

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

Hãy xem đối số --package-id của AAPT2 để biết thêm thông tin. Thông thường, bạn có thể (và nên) để giá trị này ở trạng thái chưa đặt, dẫn đến giá trị mặc định là 127 (0x7F).

plugins

Danh sách nhãn; mặc định là []

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

Nhãn; mặc định là None

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

Nhãn; mặc định là None

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

Boolean; không thể định cấu hình; mặc định là False

Liệu 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ê mối liên kết giữa tên lớp, phương thức và trường ban đầu với tên lớp, phương thức và trường đã 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ì thông số kỹ thuật Proguard không được chứa -dontobfuscate hoặc -printmapping.

proguard_specs

Danh sách nhãn; mặc định là []

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

Danh sách chuỗi; mặc định là []

Danh sách 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 tệp APK chỉ còn những tài nguyên trong cấu hình "en". Để bật tính năng bản địa hoá giả lập, hãy thêm ngôn ngữ giả lập en_XA và/hoặc ar_XB.
resource_files

Danh sách nhãn; mặc định là []

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

Số nguyên; mặc định là -1

Liệu có thực hiện việc rút gọn tài nguyên hay không. Các tài nguyên không được tệp nhị phân sử dụng sẽ bị xoá khỏi tệp APK. Tính năng 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ông cụ này hoạt động gần như theo cách tương tự như trình thu gọn tài nguyên Gradle (https://developer.android.com/studio/build/shrink-code.html#shrink-resources).

Những điểm 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
  • Tính năng xoá các tài nguyên mã nhận dạng không dùng đến chỉ được hỗ trợ với aapt2
Nếu bạn bật tính năng rút gọn tài nguyên, name_files/resource_shrinker.log cũng sẽ được tạo, trong đó nêu chi tiết về việc phân tích và xoá.

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 được kiểm soát bằng cờ --android_resource_shrinking.

aar_import

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 tệp .aar làm thư viện cho 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

Tên; bắt buộc

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

aar

Nhãn; bắt buộc

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

Danh sách nhãn; mặc định là []

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

Nhãn; mặc định là None

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

android_library

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 nó vào một tệp .jar. Thư viện Android Runtime android.jar được ngầm đưa vào đườ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 ("tệp nguồn").
  • name.aar: Gói Android "aar" chứa kho lưu trữ java và các tài nguyên của mục tiêu này. Tập hợp này không chứa tập hợp đóng 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 đây cho thấy cách đặt idl_import_root. Cho phép //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

Tên; bắt buộc

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

deps

Danh sách nhãn; mặc định là []

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 có quy tắc ràng buộc androidcc_library bao bọc hoặc tạo thư viện gốc .so cho nền tảng mục tiêu Android.
srcs

Danh sách nhãn; mặc định là []

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 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ư mô tả bên dưới.

Các tệp srcs thuộc loại .srcjar được giải nén và biên dịch. (Điều này hữu ích nếu bạn cần tạo một tập hợp các tệp .java bằng 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 các tệp xuất của java_library để biết thêm thông tin về việc xuất phần phụ thuộc). Tuy nhiên, hành vi này sẽ sớm ngừng hoạt động; hãy cố gắng không dựa vào hành vi này.

assets

Danh sách nhãn; mặc định là []

Danh sách tài sản cần đóng gói. Đây thường là glob của tất cả các tệp trong thư mục assets. Bạn cũng có thể tham chiếu các quy tắc khác (mọi quy tắc 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 đó đều nằm trong thư mục assets_dir trong gói tương ứng.
assets_dir

Chuỗi; giá trị mặc định là ""

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

Chuỗi; mặc định là ""

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

Boolean; mặc định là 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 tài nguyên bố cục có trong thuộc tính resource_files. Nếu không có chế độ cài đặt này, 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ả các quy tắc Android phụ thuộc vào quy tắc 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 lớp này cũng cần được tạo bằng tính nă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ục nhập 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 lưu trữ của bạn.
exported_plugins

Danh sách nhãn; mặc định là []

Danh sách java_plugin (ví dụ: trình xử lý chú thích) để xuất sang các thư viện trực tiếp phụ thuộc 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 trực tiếp phụ thuộc vào thư viện này, giống như thư viện đó đã khai báo rõ ràng các nhãn này trong plugins.

exports

Danh sách nhãn; mặc định là []

Việc đóng tất cả các quy tắc được truy cập 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 mà chúng thuộc về.

exports_manifest

Số nguyên; mặc định là 1

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

Chuỗi; mặc định là ""

Đườ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 idl có trong thư viện này.

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

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

Xem ví dụ.

idl_parcelables

Danh sách nhãn; mặc định là []

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

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

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

idl_preprocessed

Danh sách nhãn; mặc định là []

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

Chỉ nên đưa vào các tệp .aidl đã 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 được xử lý trước.

idl_srcs

Danh sách nhãn; mặc định là []

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

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

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

javacopts

Danh sách chuỗi; mặc định là []

Các tuỳ chọn bổ sung của trình biên dịch cho mục tiêu này. Chịu sự thay thế "Tạo biến"tạo mã thông báo shell Bourne.

Các tuỳ chọn trình biên dịch này được truyền đến javac sau các tuỳ chọn trình biên dịch toàn cục.

manifest

Nhãn; mặc định là None

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 tài sản được xác định.

Boolean; giá trị mặc định là 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 được môi trường thời gian chạy cung cấp trong quá trình thực thi.
plugins

Danh sách nhãn; mặc định là []

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

Danh sách nhãn; mặc định là []

Các tệp sẽ được dùng làm thông số kỹ thuật của Proguard. Các tệp này sẽ mô tả tập hợp thông số kỹ thuật mà Proguard sẽ sử dụng. Nếu được chỉ định, các lớp này sẽ được thêm vào bất kỳ mục tiêu android_binary nào tuỳ thuộc vào thư viện này. Các tệp được đưa vào đây chỉ được có các quy tắc giá trị không thay đổi, cụ thể là -dontnote, -dontwarn, giả định 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 là tự động trùng lặp.
resource_files

Danh sách nhãn; mặc định là []

Danh sách tài nguyên cần đóng gói. Đây thường là glob của tất cả các tệp trong thư mục res.
Các tệp đã tạo (từ genrules) cũng có thể được tham chiếu bằng Nhãn tại đây. Quy định hạn chế duy nhất là kết quả đượ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 đưa vào.

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 chương trình kiểm thử đo lường của Android. Công cụ này sẽ khởi động trình mô phỏng, cài đặt ứng dụng đang được kiểm thử, ứng dụng kiểm thử và mọi ứng dụng cần thiết 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 kiểm thử. Đổi lại, android_binary này chỉ định ứng dụng android_binary đang được kiểm thử thông qua thuộc tính công cụ.

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

Tên; bắt buộc

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

support_apks

Danh sách nhãn; mặc định là []

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

Nhãn; bắt buộc

android_device mà kiểm thử sẽ chạy trên đó.

Để chạy kiểm thử trên một trình mô phỏng đang chạy hoặc trên một thiết bị thực, 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

Nhãn; bắt buộc

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 mà nó đang 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ùng để kiểm thử đơn vị các quy tắc android_library cục bộ (thay vì trên thiết bị). Công cụ này hoạt động với khung kiểm thử Robolectric của Android. Hãy xem trang web Android Robolectric để biết thông tin chi tiết về cách viết chương trình kiểm thử Robolectric.

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

  • name.jar: Tệp 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 nguồn").
  • name_deploy.jar: Một tệp lưu trữ triển khai Java phù hợp với việc 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()
Thao tác này sẽ đưa các quy tắc maven_jar cần thiết vào Robolectric. Sau đó, mỗi quy tắc android_local_test phải phụ thuộc vào @robolectric//bazel:robolectric. Hãy 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

Tên; bắt buộc

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

deps

Danh sách nhãn; mặc định là []

Danh sách các thư viện cần kiểm thử cũng như các thư viện bổ sung cần liên kết vào 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 phần đóng giá trị bắc cầu của thuộc tính này đều được cung cấp trong kiểm thử.

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

srcs

Danh sách nhãn; mặc định là []

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 được mô tả bên dưới.

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 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ư mô tả bên dưới.

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

Tất cả các tệp khác đều 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, lỗi sẽ xuất hiện.

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

custom_package

Chuỗi; mặc định là ""

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

Danh sách chuỗi; mặc định là []

Mật độ cần lọc khi tạo tệp APK. Một phần tương ứng về màn hình tương thích cũng sẽ được thêm vào tệp kê khai nếu tệp này chưa chứa tập hợp con StarlarkListing.
enable_data_binding

Boolean; giá trị mặc định là False

Nếu đúng, quy tắc này sẽ xử lý các tệp tham chiếu liên kết dữ liệu được sử dụng trong các phần phụ thuộc có bật tính năng liên kết dữ liệu mà 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ó tính năng tạo mã cấp tệp nhị phân cần thiết và có thể gây ra lỗi bản dựng.
javacopts

Danh sách chuỗi; mặc định là []

Các tuỳ chọn bổ sung của trình biên dịch cho thư viện này. Chịu sự thay thế "Tạo biến"tạo mã thông báo shell Bourne.

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

jvm_flags

Danh sách chuỗi; mặc định là []

Danh sách cờ để nhúng vào tập lệnh trình bao bọc được tạo để chạy tệp nhị phân này. Chịu sự thay thế của $(location)"Tạo biến", cũng như tạo mã thông báo 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 thông 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ành cho việc phân tích cú pháp của 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 đượ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ê.

Lưu ý rằng thuộc tính này không ảnh hưởng đến đầu ra *_deploy.jar.

manifest

Nhãn; mặc định là None

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

Từ điển: Chuỗi -> Chuỗi; mặc định là {}

Từ điển gồm các giá trị sẽ được ghi đè trong tệp kê khai. Mọi thực thể 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ẻ uses-sdk. packageName sẽ bị bỏ qua và được thiết lập từ applicationId nếu được chỉ định hoặc gói trong tệp kê khai. Bạn không cần phải có tệp kê khai trong quy tắc để sử dụng manifest_values.
nocompress_extensions

Danh sách chuỗi; mặc định là []

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

Danh sách nhãn; mặc định là []

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

Danh sách chuỗi; mặc định là []

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

Danh sách nhãn; mặc định là []

Ngừng sử dụng: Thay vào đó, hãy sử dụng java_import và phần phụ thuộc hoặc runtime_deps.
resource_strip_prefix

Chuỗi; mặc định là ""

Tiền tố đường dẫn để loại bỏ 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. Lỗi xảy ra 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 sẽ được xác định theo cùng một logic như gói Java của các tệp nguồn. Ví dụ: tệp nguồn tại stuff/java/foo/bar/a.txt sẽ nằm tại foo/bar/a.txt.

runtime_deps

Danh sách nhãn; mặc định là []

Thư viện chỉ cung cấp cho tệp nhị phân hoặc kiểm thử cuối cùng trong thời gian chạy. Giống như deps thông thường, các tệp 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ư các tệp đó, không xuất hiện trên đường dẫn lớp thời gian biên dịch. Bạn chỉ nên liệt kê các phần phụ thuộc cần thiết trong thời gian chạy tại đây. Các công cụ phân tích phần phụ thuộc phải bỏ qua các mục tiêu xuất hiện trong cả runtime_depsdeps.
stamp

Số nguyên; mặc định là 0

Liệu có mã hoá thông tin bản dựng vào tệp nhị phân hay không. Các giá trị có thể sử dụng là:
  • 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 chế độ cài đặt này vì chế độ này có thể huỷ kích hoạt tính năng lưu vào bộ nhớ đệm từ xa cho tệp nhị phân và mọi thao tác tiếp theo phụ thuộc vào tệp nhị phân đó.
  • 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 lưu kết quả bản dựng vào bộ nhớ đệm hiệu quả.
  • stamp = -1: Bạn có thể kiểm soát việc nhúng thông tin bản dựng bằng cờ --[no]stamp.

Tệp nhị phân đã đóng dấu không được tạo lại trừ phi các phần phụ thuộc của chúng thay đổi.

test_class

Chuỗi; mặc định là ""

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 kiểm thử này. Việc thiết lập chế độ này hiếm khi xảy ra. 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. Bạn cần chú thích lớp kiểm thử bằng org.junit.runner.RunWith.

use_launcher

Boolean; giá trị mặc định là True

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 trình chạy và cờ --java_launcher liên quan sẽ bị bỏ qua cho mục tiêu này.

android_device

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 sẽ tạo một trình mô phỏng Android được định cấu hình với các thông số kỹ thuật nhất định. Bạn có thể khởi động trình mô phỏng này thông qua lệnh chạy bazel hoặc bằng cách trực tiếp thực thi tập lệnh đã tạo. Bạn nên phụ thuộc vào các quy tắc android_device hiện có 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 cho cờ --run_under để kiểm thử bazel và chạy blaze. Thao tác này sẽ khởi động 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 rồi kiểm thử hoặc chạy mục tiêu đó khi thích 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 hoá cho tối đa 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 chuyển đổi tuần tự cần thiết để truyền đến trình mô phỏng nhằm khởi động lại.

Ví dụ

Ví dụ sau đây cho thấy 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 khởi động. Bạn có thể khởi động trình mô phỏng trên máy bằng cách thực thi bazel run :nexus_s -- --action=start. Tập lệnh này cho thấy các cờ sau:

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

Đối số

Thuộc tính
name

Tên; bắt buộc

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

cache

Số nguyên; bắt buộc

Kích thước 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 là 16 megabyte.
default_properties

Nhãn; mặc định là None

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 trông giống với thiết bị thực hơn (cụ thể là việc kiểm soát các chuỗi UserAgent và hành vi khác có thể khiến ứng dụng hoặc máy chủ hoạt động theo cách 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ể đọc mà trình mô phỏng thường đặt, chẳng hạn như ro.product.model.
horizontal_resolution

Số nguyên; bắt buộc

Độ 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

Danh sách nhãn; mặc định là []

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

Số nguyên; bắt buộc

Dung lượng RAM tính bằng megabyte để mô phỏng cho thiết bị. Chế độ này áp dụng cho toàn bộ thiết bị, chứ 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

Số nguyên; bắt buộc

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

Nhãn; bắt buộc

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

Số nguyên; bắt buộc

Độ 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

Số nguyên; bắt buộc

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ợ việc tạo mục tiêu Android bằng mã gốc.

Xin lưu ý rằng cách triển khai android_ndk_repository này đang được thay thế bằng cách triển khai trong Starlark. Tính năng hỗ trợ 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 cho phiên bản Starlark.

Xin lưu ý rằng việc xây dựng cho Android cũng yêu cầu quy tắc android_sdk_repository trong tệp WORKSPACE.

Để 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ẽ xác định vị trí Android NDK từ $ANDROID_NDK_HOME và phát hiện cấp độ API cao nhất mà NDK 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 trong không gian làm việc của bạn trong ./android-ndk-r20. Thư viện 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 cpufeatures có thể dùng để phát hiện CPU của thiết bị trong thời gian chạy. Ví dụ sau đây 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

Tên; bắt buộc

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

api_level

Số nguyên; không thể định cấu hình; mặc định là 0

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

Chuỗi; không thể định cấu hình; mặc định là ""

Đườ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 từ trang web dành cho nhà phát triển Android.

repo_mapping

Từ điển: Chuỗi -> Chuỗi; mặc định là {}

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 bạn kiểm soát hoạt động phân giải phần phụ thuộc không gian làm việc đối với 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ứ khi 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ì mục đó phải thực sự phân giải phần phụ thuộc đó trong "@bar" được khai báo 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ợ việc tạo mục tiêu Android.

Ví dụ

Yêu cầu tối thiểu để thiết lập SDK Android cho Bazel là đặt quy tắc android_sdk_repository có tên "androidsdk" vào 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 Android 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 các 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 không cài đặt cấp độ API hoặc phiên bản công cụ xây dựng được 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 hoạ cách sử dụng đường dẫn tương ứng với không gian làm việc đến SDK Android. Điều này sẽ 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 Android được kiểm tra vào kiểm soát phiên bản).

Thư viện hỗ trợ

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

Tên của các mục tiêu được tạo bắt nguồn 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

Tên; bắt buộc

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

api_level

Số nguyên; không thể định cấu hình; mặc định là 0

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

Cờ android_sdk có thể ghi đè cấp độ API dùng cho một bản dựng nhất định. 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ụ: để tạo dựa trên một 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

Chuỗi; không thể định cấu hình; giá trị mặc định là ""

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

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

path

Chuỗi; không thể định cấu hình; mặc định là ""

Đường dẫn tuyệt đối hoặc tương đối đến một 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

Từ điển: Chuỗi -> Chuỗi; mặc định là {}

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 bạn kiểm soát hoạt động phân giải phần phụ thuộc không gian làm việc đối với 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ứ khi 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ì mục đó phải thực sự phân giải phần phụ thuộc đó trong "@bar" được khai báo toàn cầu ("@bar//some:target").