กฎ
- android_binary
- aar_import
- android_library
- android_instrumentation_test
- android_local_test
- android_device
- android_ndk_repository
- android_sdk_repository
android_binary
ดูแหล่งที่มาของกฎandroid_binary(name, deps, srcs, assets, assets_dir, compatible_with, crunch_png, custom_package, debug_key, debug_signing_keys, debug_signing_lineage_file, densities, deprecation, dex_shards, dexopts, distribs, enable_data_binding, exec_compatible_with, exec_properties, features, incremental_dexing, instruments, javacopts, key_rotation_min_sdk, licenses, main_dex_list, main_dex_list_opts, main_dex_proguard_specs, manifest, manifest_values, multidex, nocompress_extensions, package_id, plugins, proguard_apply_dictionary, proguard_apply_mapping, proguard_generate_mapping, proguard_specs, resource_configuration_filters, resource_files, restricted_to, shrink_resources, tags, target_compatible_with, testonly, visibility)
สร้างไฟล์แพ็กเกจแอปพลิเคชัน Android (.apk)
เป้าหมายเอาต์พุตโดยนัย
- name.apk: ไฟล์แพ็กเกจแอปพลิเคชัน Android ที่ลงชื่อด้วยคีย์การแก้ไขข้อบกพร่องและzipaligned ซึ่งสามารถใช้เพื่อพัฒนาและแก้ไขข้อบกพร่องของแอปพลิเคชันได้ คุณจะเผยแพร่แอปพลิเคชันเมื่อลงนามด้วยคีย์การแก้ไขข้อบกพร่องไม่ได้
- name_unsigned.apk: ไฟล์เวอร์ชันที่ไม่ได้ลงนามของ ไฟล์ด้านบนซึ่งลงนามด้วยคีย์รุ่นก่อนเผยแพร่ต่อสาธารณะได้
- name_deploy.jar: ที่เก็บถาวร Java ที่มี การปิดทรานซิทีฟของเป้าหมายนี้- ไฟล์ JAR ที่ใช้ในการติดตั้งใช้งานมีคลาสทั้งหมดที่ ClassLoader จะพบได้ ซึ่งค้นหา Classpath ของรันไทม์ของเป้าหมายนี้ ตั้งแต่ต้นจนจบ 
- name_proguard.jar: ที่เก็บถาวรของ Java ที่มี ผลลัพธ์ของการเรียกใช้ ProGuard ใน- name_deploy.jarเอาต์พุตนี้จะสร้างขึ้นก็ต่อเมื่อระบุแอตทริบิวต์ proguard_specs
- name_proguard.map: ผลลัพธ์ของไฟล์การแมป การเรียกใช้ ProGuard ใน- name_deploy.jarเอาต์พุตนี้จะสร้างขึ้นก็ต่อเมื่อมีการระบุแอตทริบิวต์ proguard_specs และตั้งค่า proguard_generate_mapping หรือ shrink_resources
ตัวอย่าง
ดูตัวอย่างกฎของ Android ได้ในไดเรกทอรี examples/android ของ
โครงสร้างแหล่งที่มาของ Bazel
  
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| deps | รายการป้ายกำกับ ค่าเริ่มต้นคือ  android_library,java_libraryที่มีข้อจำกัดandroidและcc_libraryการห่อหุ้มหรือการสร้างไลบรารีเนทีฟ.soสำหรับ
          แพลตฟอร์มเป้าหมาย Android | 
| srcs | รายการป้ายกำกับ ค่าเริ่มต้นคือ  ระบบจะคอมไพล์ไฟล์  ระบบจะคลายแพ็กและคอมไพล์ไฟล์  | 
| assets | รายการป้ายกำกับ ค่าเริ่มต้นคือ  globของไฟล์ทั้งหมดในไดเรกทอรีassetsนอกจากนี้ คุณยังอ้างอิงกฎอื่นๆ (กฎใดก็ตามที่สร้างไฟล์) หรือไฟล์ที่ส่งออกในแพ็กเกจอื่นๆ ได้ ตราบใดที่ไฟล์เหล่านั้นทั้งหมดอยู่ภายใต้ไดเรกทอรีassets_dirในแพ็กเกจที่เกี่ยวข้อง | 
| assets_dir | สตริง ค่าเริ่มต้นคือ  assetsคู่แอตทริบิวต์assetsและassets_dirอธิบายเนื้อหาที่แพ็กเกจ
          และควรระบุแอตทริบิวต์ทั้ง 2 รายการหรือไม่มีเลย | 
| crunch_png | บูลีน ค่าเริ่มต้นคือ  | 
| custom_package | สตริง ค่าเริ่มต้นคือ  | 
| debug_key | ป้ายกำกับ ค่าเริ่มต้นคือ  คำเตือน: อย่าใช้คีย์เวอร์ชันที่ใช้งานจริง คุณควรเก็บรักษาคีย์ดังกล่าวอย่างเคร่งครัดและไม่ควรเก็บไว้ในโครงสร้างแหล่งข้อมูล | 
| debug_signing_keys | รายการป้ายกำกับ ค่าเริ่มต้นคือ  คำเตือน: อย่าใช้คีย์เวอร์ชันที่ใช้งานจริง คุณควรเก็บรักษาคีย์ดังกล่าวอย่างเคร่งครัดและไม่ควรเก็บไว้ในโครงสร้างแหล่งข้อมูล | 
| debug_signing_lineage_file | ป้ายกำกับ ค่าเริ่มต้นคือ  คำเตือน: อย่าใช้คีย์เวอร์ชันที่ใช้งานจริง คุณควรเก็บรักษาคีย์ดังกล่าวอย่างเคร่งครัดและไม่ควรเก็บไว้ในโครงสร้างแหล่งข้อมูล | 
| densities | รายการสตริง ค่าเริ่มต้นคือ  | 
| dex_shards | จำนวนเต็ม ค่าเริ่มต้นคือ  โปรดทราบว่าแต่ละ Shard จะส่งผลให้มี DEX อย่างน้อย 1 รายการในแอปสุดท้าย ด้วยเหตุนี้ เราจึงไม่แนะนำให้ตั้งค่านี้เป็นมากกว่า 1 สำหรับไบนารีที่เผยแพร่ | 
| dexopts | รายการสตริง ค่าเริ่มต้นคือ  | 
| enable_data_binding | บูลีน ค่าเริ่มต้นคือ  หากต้องการสร้างแอป Android ด้วยการเชื่อมโยงข้อมูล คุณต้องทำสิ่งต่อไปนี้ด้วย 
 | 
| incremental_dexing | จำนวนเต็ม กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  | 
| instruments | ป้ายกำกับ ค่าเริ่มต้นคือ  
 หากตั้งค่าแอตทริบิวต์นี้ ระบบจะถือว่า  | 
| javacopts | รายการสตริง ค่าเริ่มต้นคือ  ระบบจะส่งตัวเลือกคอมไพเลอร์เหล่านี้ไปยัง javac หลังจากตัวเลือกคอมไพเลอร์ส่วนกลาง | 
| key_rotation_min_sdk | สตริง ค่าเริ่มต้นคือ  | 
| main_dex_list | ป้ายกำกับ ค่าเริ่มต้นคือ  
          android/support/multidex/MultiDex$V19.class
          android/support/multidex/MultiDex.class
          android/support/multidex/MultiDexApplication.class
          com/google/common/base/Objects.class
                    multidex="manual_main_dex" | 
| main_dex_list_opts | รายการสตริง ค่าเริ่มต้นคือ  | 
| main_dex_proguard_specs | รายการป้ายกำกับ ค่าเริ่มต้นคือ  multidexเป็นlegacy | 
| manifest | ป้ายกำกับ (ต้องระบุ)ชื่อของไฟล์ Manifest ของ Android โดยปกติคือ AndroidManifest.xmlต้องกำหนดหากมีการกำหนด resource_files หรือ assets | 
| manifest_values | พจนานุกรม: สตริง -> สตริง ค่าเริ่มต้นคือ  
          ระบบจะแทนที่อินสแตนซ์ของ  
           
          ระบบจะเพิกเฉยต่อ  
          เมื่อตั้งค่า  | 
| multidex | สตริง ค่าเริ่มต้นคือ  ค่าที่เป็นไปได้มีดังนี้ 
 | 
| nocompress_extensions | รายการสตริง ค่าเริ่มต้นคือ  | 
| package_id | จำนวนเต็ม ค่าเริ่มต้นคือ  ดูข้อมูลเพิ่มเติมได้ที่อาร์กิวเมนต์  | 
| plugins | รายการป้ายกำกับ ค่าเริ่มต้นคือ  java_pluginที่ระบุใน
          แอตทริบิวต์ปลั๊กอินจะทำงานทุกครั้งที่
          สร้างเป้าหมายนี้  ระบบจะรวมทรัพยากรที่ปลั๊กอินสร้างขึ้นไว้ในไฟล์ JAR ของผลลัพธ์ของเป้าหมาย | 
| proguard_apply_dictionary | ป้ายกำกับ ค่าเริ่มต้นคือ  | 
| proguard_apply_mapping | ป้ายกำกับ ค่าเริ่มต้นคือ  proguard_generate_mappingสร้างขึ้นเพื่อ
          นำกลับมาใช้ซ้ำเพื่อใช้การแมปเดียวกันกับบิลด์ใหม่ | 
| proguard_generate_mapping | บูลีน กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  proguard_specsเท่านั้น ไฟล์นี้จะแสดงการแมประหว่างชื่อคลาส เมธอด และฟิลด์เดิมกับชื่อที่ผ่านการปกปิดคำเตือน: หากใช้แอตทริบิวต์นี้ ข้อกำหนด Proguard
          ไม่ควรมีทั้ง  | 
| proguard_specs | รายการป้ายกำกับ ค่าเริ่มต้นคือ  | 
| resource_configuration_filters | รายการสตริง ค่าเริ่มต้นคือ  en_XAและ/หรือar_XB | 
| resource_files | รายการป้ายกำกับ ค่าเริ่มต้นคือ  globของไฟล์ทั้งหมดในไดเรกทอรีresไฟล์ที่สร้างขึ้น (จาก genrules) สามารถอ้างอิงได้โดยใช้ ป้ายกำกับที่นี่เช่นกัน ข้อจำกัดเพียงอย่างเดียวคือ เอาต์พุตที่สร้างขึ้นต้องอยู่ภายใต้ไดเรกทอรี " res" เดียวกันกับไฟล์
          ทรัพยากรอื่นๆ ที่รวมไว้ | 
| shrink_resources | จำนวนเต็ม ค่าเริ่มต้นคือ  manifestและresource_files) และต้องใช้ ProGuard
          โดยจะทำงานในลักษณะเดียวกับเครื่องมือลดขนาดทรัพยากรของ Gradle
          (https://developer.android.com/studio/build/shrink-code.html#shrink-resources)ความแตกต่างที่สำคัญ 
 name_files/resource_shrinker.logด้วย โดยจะแสดงรายละเอียดการวิเคราะห์และการลบที่ดำเนินการค่าที่เป็นไปได้มีดังนี้ 
 | 
aar_import
ดูแหล่งที่มาของกฎaar_import(name, deps, data, aar, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, exports, features, licenses, restricted_to, srcjar, tags, target_compatible_with, testonly, visibility)
  กฎนี้อนุญาตให้ใช้ไฟล์ .aar เป็นไลบรารีสำหรับกฎ android_library และ android_binary
ตัวอย่าง
    aar_import(
        name = "google-vr-sdk",
        aar = "gvr-android-sdk/libraries/sdk-common-1.10.0.aar",
    )
    android_binary(
        name = "app",
        manifest = "AndroidManifest.xml",
        srcs = glob(["**.java"]),
        deps = [":google-vr-sdk"],
    )
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| aar | ป้ายกำกับ (ต้องระบุ)ไฟล์ .aarที่จะให้แก่เป้าหมาย Android ที่ขึ้นอยู่กับเป้าหมายนี้ | 
| exports | รายการป้ายกำกับ ค่าเริ่มต้นคือ  | 
| srcjar | ป้ายกำกับ ค่าเริ่มต้นคือ  | 
android_library
ดูแหล่งที่มาของกฎandroid_library(name, deps, srcs, data, assets, assets_dir, compatible_with, custom_package, deprecation, distribs, enable_data_binding, exec_compatible_with, exec_properties, exported_plugins, exports, exports_manifest, features, idl_import_root, idl_parcelables, idl_preprocessed, idl_srcs, javacopts, licenses, manifest, neverlink, plugins, proguard_specs, resource_files, restricted_to, tags, target_compatible_with, testonly, visibility)
กฎนี้จะรวบรวมและเก็บแหล่งที่มาไว้ในไฟล์ .jar
  ระบบจะใส่ไลบรารีรันไทม์ของ Android android.jar ไว้ใน
  เส้นทางคลาสการคอมไพล์โดยนัย
เป้าหมายเอาต์พุตโดยนัย
- libname.jar: ที่เก็บถาวร Java
- libname-src.jar: ที่เก็บถาวรที่มี แหล่งที่มา ("ไฟล์ JAR ของแหล่งที่มา")
- name.aar: บันเดิล 'aar' ของ Android ที่มีที่เก็บถาวรของ Java และทรัพยากรของเป้าหมายนี้ โดยไม่มีการปิดทรานซิทีฟ
ตัวอย่าง
ดูตัวอย่างกฎของ Android ได้ในไดเรกทอรี examples/android ของ
โครงสร้างแหล่งที่มาของ Bazel
ตัวอย่างต่อไปนี้แสดงวิธีตั้งค่า idl_import_root
//java/bazel/helloandroid/BUILD ต้องมีข้อมูลต่อไปนี้
android_library(
    name = "parcelable",
    srcs = ["MyParcelable.java"], # bazel.helloandroid.MyParcelable
    # MyParcelable.aidl will be used as import for other .aidl
    # files that depend on it, but will not be compiled.
    idl_parcelables = ["MyParcelable.aidl"] # bazel.helloandroid.MyParcelable
    # We don't need to specify idl_import_root since the aidl file
    # which declares bazel.helloandroid.MyParcelable
    # is present at java/bazel/helloandroid/MyParcelable.aidl
    # underneath a java root (java/).
)
android_library(
    name = "foreign_parcelable",
    srcs = ["src/android/helloandroid/OtherParcelable.java"], # android.helloandroid.OtherParcelable
    idl_parcelables = [
        "src/android/helloandroid/OtherParcelable.aidl" # android.helloandroid.OtherParcelable
    ],
    # We need to specify idl_import_root because the aidl file which
    # declares android.helloandroid.OtherParcelable is not positioned
    # at android/helloandroid/OtherParcelable.aidl under a normal java root.
    # Setting idl_import_root to "src" in //java/bazel/helloandroid
    # adds java/bazel/helloandroid/src to the list of roots
    # the aidl compiler will search for imported types.
    idl_import_root = "src",
)
# Here, OtherInterface.aidl has an "import android.helloandroid.CallbackInterface;" statement.
android_library(
    name = "foreign_interface",
    idl_srcs = [
        "src/android/helloandroid/OtherInterface.aidl" # android.helloandroid.OtherInterface
        "src/android/helloandroid/CallbackInterface.aidl" # android.helloandroid.CallbackInterface
    ],
    # As above, idl_srcs which are not correctly positioned under a java root
    # must have idl_import_root set. Otherwise, OtherInterface (or any other
    # interface in a library which depends on this one) will not be able
    # to find CallbackInterface when it is imported.
    idl_import_root = "src",
)
# MyParcelable.aidl is imported by MyInterface.aidl, so the generated
# MyInterface.java requires MyParcelable.class at compile time.
# Depending on :parcelable ensures that aidl compilation of MyInterface.aidl
# specifies the correct import roots and can access MyParcelable.aidl, and
# makes MyParcelable.class available to Java compilation of MyInterface.java
# as usual.
android_library(
    name = "idl",
    idl_srcs = ["MyInterface.aidl"],
    deps = [":parcelable"],
)
# Here, ServiceParcelable uses and thus depends on ParcelableService,
# when it's compiled, but ParcelableService also uses ServiceParcelable,
# which creates a circular dependency.
# As a result, these files must be compiled together, in the same android_library.
android_library(
    name = "circular_dependencies",
    srcs = ["ServiceParcelable.java"],
    idl_srcs = ["ParcelableService.aidl"],
    idl_parcelables = ["ServiceParcelable.aidl"],
)
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| deps | รายการป้ายกำกับ ค่าเริ่มต้นคือ  android_library,java_libraryที่มีข้อจํากัดandroidและcc_libraryการห่อหรือการสร้างไลบรารีเนทีฟ.soสําหรับแพลตฟอร์มเป้าหมาย Android | 
| srcs | รายการป้ายกำกับ ค่าเริ่มต้นคือ  .javaหรือ.srcjarที่
         ประมวลผลเพื่อสร้างเป้าหมายระบบจะคอมไพล์ไฟล์  ระบบจะคลายแพ็กและคอมไพล์ไฟล์  หากละเว้น  | 
| assets | รายการป้ายกำกับ ค่าเริ่มต้นคือ  globของไฟล์ทั้งหมดในไดเรกทอรีassetsนอกจากนี้ คุณยังอ้างอิงกฎอื่นๆ (กฎใดก็ตามที่สร้างไฟล์) หรือไฟล์ที่ส่งออกในแพ็กเกจอื่นๆ ได้ ตราบใดที่ไฟล์เหล่านั้นทั้งหมดอยู่ภายใต้ไดเรกทอรีassets_dirในแพ็กเกจที่เกี่ยวข้อง | 
| assets_dir | สตริง ค่าเริ่มต้นคือ  assetsคู่แอตทริบิวต์assetsและassets_dirอธิบายเนื้อหาที่แพ็กเกจ
          และควรระบุแอตทริบิวต์ทั้ง 2 รายการหรือไม่มีเลย | 
| custom_package | สตริง ค่าเริ่มต้นคือ  | 
| enable_data_binding | บูลีน ค่าเริ่มต้นคือ  หากต้องการสร้างแอป Android ด้วยการเชื่อมโยงข้อมูล คุณต้องทำสิ่งต่อไปนี้ด้วย 
 | 
| exported_plugins | รายการป้ายกำกับ ค่าเริ่มต้นคือ  java_plugin(เช่น annotation
        processors) ที่จะส่งออกไปยังไลบรารีที่ขึ้นต่อกันกับไลบรารีนี้โดยตรง
          ระบบจะใช้รายการ  | 
| exports | รายการป้ายกำกับ ค่าเริ่มต้นคือ  exportsแอตทริบิวต์
        ถือเป็นทรัพยากร Dependency โดยตรงของกฎใดก็ตามที่ขึ้นอยู่กับเป้าหมายที่มีexportsโดยตรง
 | 
| exports_manifest | จำนวนเต็ม ค่าเริ่มต้นคือ  android_binaryที่ขึ้นอยู่กับเป้าหมายนี้หรือไม่
         ระบบจะไม่ส่งออกแอตทริบิวต์uses-permissions | 
| idl_import_root | สตริง ค่าเริ่มต้นคือ  ระบบจะใช้เส้นทางนี้เป็นรูทการนำเข้าเมื่อประมวลผลแหล่งที่มาของ IDL ที่ ขึ้นอยู่กับไลบรารีนี้ เมื่อระบุ  ดู ตัวอย่าง | 
| idl_parcelables | รายการป้ายกำกับ ค่าเริ่มต้นคือ  android_libraryเป้าหมายใดๆ ที่ขึ้นอยู่กับไลบรารีนี้โดยตรง
        หรือผ่านการปิดทรานซิทีฟ แต่จะไม่แปลเป็น Java
        หรือคอมไพล์ควรใส่เฉพาะไฟล์  คุณต้องวางไฟล์เหล่านี้อย่างเหมาะสมเพื่อให้คอมไพเลอร์ AIDL ค้นหาได้ ดูข้อมูลเกี่ยวกับความหมายของตัวแปรนี้ได้ที่คำอธิบายของ idl_import_root | 
| idl_preprocessed | รายการป้ายกำกับ ค่าเริ่มต้นคือ  android_libraryเป้าหมายใดๆ ที่ขึ้นอยู่กับไลบรารีนี้โดยตรง
        หรือผ่านการปิดทรานซิทีฟ แต่จะไม่แปลเป็น Java
        หรือคอมไพล์ควรมีเฉพาะไฟล์  | 
| idl_srcs | รายการป้ายกำกับ ค่าเริ่มต้นคือ  srcsระบบจะทำให้ไฟล์เหล่านี้พร้อมใช้งานเป็นการนำเข้าสำหรับ คุณต้องวางไฟล์เหล่านี้อย่างเหมาะสมเพื่อให้คอมไพเลอร์ AIDL ค้นหาได้ ดูข้อมูลเกี่ยวกับความหมายของตัวแปรนี้ได้ที่คำอธิบายของ idl_import_root | 
| javacopts | รายการสตริง ค่าเริ่มต้นคือ  ระบบจะส่งตัวเลือกคอมไพเลอร์เหล่านี้ไปยัง javac หลังจากตัวเลือกคอมไพเลอร์ส่วนกลาง | 
| manifest | ป้ายกำกับ ค่าเริ่มต้นคือ  AndroidManifest.xmlต้องกำหนดหากมีการกำหนด resource_files หรือ assets | 
| neverlink | บูลีน ค่าเริ่มต้นคือ  neverlinkในการสร้าง.apkมีประโยชน์ในกรณีที่สภาพแวดล้อมรันไทม์จะจัดเตรียมไลบรารีให้ในระหว่างการดำเนินการ | 
| plugins | รายการป้ายกำกับ ค่าเริ่มต้นคือ  java_pluginที่ระบุใน
          แอตทริบิวต์ปลั๊กอินจะทำงานทุกครั้งที่
          สร้างเป้าหมายนี้  ระบบจะรวมทรัพยากรที่ปลั๊กอินสร้างขึ้นไว้ในไฟล์ JAR ของผลลัพธ์ของเป้าหมาย | 
| proguard_specs | รายการป้ายกำกับ ค่าเริ่มต้นคือ  android_binaryใดก็ตามโดยขึ้นอยู่กับคลังนี้
        ไฟล์ที่รวมไว้ที่นี่ต้องมีเฉพาะกฎที่ไม่มีผลข้างเคียง ได้แก่ -dontnote, -dontwarn,
        assumenosideeffects และกฎที่ขึ้นต้นด้วย -keep ตัวเลือกอื่นๆ จะปรากฏได้เฉพาะในandroid_binaryproguard_specs เพื่อให้แน่ใจว่าการผสานจะไม่ซ้ำซ้อน | 
| resource_files | รายการป้ายกำกับ ค่าเริ่มต้นคือ  globของไฟล์ทั้งหมดในไดเรกทอรีresไฟล์ที่สร้างขึ้น (จาก genrules) สามารถอ้างอิงได้โดยใช้ ป้ายกำกับที่นี่เช่นกัน ข้อจำกัดเพียงอย่างเดียวคือ เอาต์พุตที่สร้างขึ้นต้องอยู่ภายใต้ไดเรกทอรี " res" เดียวกันกับไฟล์
          ทรัพยากรอื่นๆ ที่รวมไว้ | 
android_instrumentation_test
ดูแหล่งที่มาของกฎandroid_instrumentation_test(name, data, args, compatible_with, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, licenses, local, restricted_to, shard_count, size, support_apks, tags, target_compatible_with, target_device, test_app, testonly, timeout, toolchains, visibility)
  android_instrumentation_test จะเรียกใช้การทดสอบการวัดคุมของ Android โดยจะ
  เริ่มโปรแกรมจำลอง ติดตั้งแอปพลิเคชันที่กำลังทดสอบ แอปพลิเคชันทดสอบ และ
  แอปพลิเคชันอื่นๆ ที่จำเป็น แล้วเรียกใช้การทดสอบที่กำหนดไว้ในแพ็กเกจทดสอบ
  แอตทริบิวต์ test_app ระบุ
  android_binary ซึ่งมีการทดสอบ android_binary นี้จะระบุแอปพลิเคชัน android_binary ที่อยู่ระหว่างการทดสอบผ่านแอตทริบิวต์ instruments
ตัวอย่าง
# java/com/samples/hello_world/BUILD
android_library(
    name = "hello_world_lib",
    srcs = ["Lib.java"],
    manifest = "LibraryManifest.xml",
    resource_files = glob(["res/**"]),
)
# The app under test
android_binary(
    name = "hello_world_app",
    manifest = "AndroidManifest.xml",
    deps = [":hello_world_lib"],
)
# javatests/com/samples/hello_world/BUILD
android_library(
    name = "hello_world_test_lib",
    srcs = ["Tests.java"],
    deps = [
      "//java/com/samples/hello_world:hello_world_lib",
      ...  # test dependencies such as Espresso and Mockito
    ],
)
# The test app
android_binary(
    name = "hello_world_test_app",
    instruments = "//java/com/samples/hello_world:hello_world_app",
    manifest = "AndroidManifest.xml",
    deps = [":hello_world_test_lib"],
)
android_instrumentation_test(
    name = "hello_world_uiinstrumentation_tests",
    target_device = ":some_target_device",
    test_app = ":hello_world_test_app",
)
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| support_apks | รายการป้ายกำกับ ค่าเริ่มต้นคือ  | 
| target_device | ป้ายกำกับ (ต้องระบุ) android_device ที่ควรใช้ทดสอบ หากต้องการเรียกใช้การทดสอบในโปรแกรมจำลองที่ทำงานอยู่แล้วหรือในอุปกรณ์จริง ให้ใช้อาร์กิวเมนต์ต่อไปนี้
         | 
| test_app | ป้ายกำกับ (ต้องระบุ)เป้าหมาย android_binary ที่มีคลาสทดสอบ android_binaryเป้าหมายต้องระบุเป้าหมายที่กำลังทดสอบผ่านแอตทริบิวต์instruments | 
android_local_test
ดูแหล่งที่มาของกฎandroid_local_test(name, deps, srcs, data, args, compatible_with, custom_package, densities, deprecation, enable_data_binding, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, javacopts, jvm_flags, licenses, local, manifest, manifest_values, nocompress_extensions, plugins, resource_configuration_filters, resource_jars, resource_strip_prefix, restricted_to, runtime_deps, shard_count, size, stamp, tags, target_compatible_with, test_class, testonly, timeout, toolchains, use_launcher, visibility)
กฎนี้ใช้สำหรับการทดสอบหน่วยของandroid_libraryกฎในเครื่อง
(เทียบกับการทดสอบในอุปกรณ์)
โดยทำงานร่วมกับเฟรมเวิร์กการทดสอบ Robolectric ของ Android
ดูรายละเอียดเกี่ยวกับการเขียนการทดสอบ Robolectric ได้ที่เว็บไซต์ Android Robolectric
เป้าหมายเอาต์พุตโดยนัย
- name.jar: ไฟล์เก็บถาวร Java ของการทดสอบ
- name-src.jar: ที่เก็บถาวรที่มีแหล่งที่มา ("source jar")
- name_deploy.jar: ไฟล์เก็บถาวรสำหรับการติดตั้งใช้งาน Java ที่เหมาะสม สำหรับการติดตั้งใช้งาน (สร้างขึ้นเมื่อมีการขออย่างชัดแจ้งเท่านั้น)
ตัวอย่าง
หากต้องการใช้ Robolectric กับ android_local_test ให้เพิ่มที่เก็บของ Robolectric ลงในไฟล์ WORKSPACE ดังนี้
http_archive(
    name = "robolectric",
    urls = ["https://github.com/robolectric/robolectric-bazel/archive/<COMMIT>.tar.gz"],
    strip_prefix = "robolectric-bazel-<COMMIT>",
    sha256 = "<HASH>",
)
load("@robolectric//bazel:robolectric.bzl", "robolectric_repositories")
robolectric_repositories()
maven_jarกฎที่จำเป็นสำหรับ Robolectric
จากนั้นกฎ android_local_test แต่ละข้อควรขึ้นอยู่กับ
@robolectric//bazel:robolectric ดูตัวอย่างด้านล่าง
android_local_test(
    name = "SampleTest",
    srcs = [
        "SampleTest.java",
    ],
    manifest = "LibManifest.xml",
    deps = [
        ":sample_test_lib",
        "@robolectric//bazel:android-all",
    ],
)
android_library(
    name = "sample_test_lib",
    srcs = [
         "Lib.java",
    ],
    resource_files = glob(["res/**"]),
    manifest = "AndroidManifest.xml",
)
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| deps | รายการป้ายกำกับ ค่าเริ่มต้นคือ  
        รายการกฎที่อนุญาตใน  | 
| srcs | รายการป้ายกำกับ ค่าเริ่มต้นคือ  ระบบจะคอมไพล์ไฟล์  ระบบจะคลายแพ็กและคอมไพล์ไฟล์  ระบบจะไม่สนใจไฟล์อื่นๆ ทั้งหมด ตราบใดที่ มีไฟล์ประเภทใดประเภทหนึ่งตามที่อธิบายไว้ข้างต้นอย่างน้อย 1 ไฟล์ ไม่เช่นนั้นจะเกิด ข้อผิดพลาด 
        ต้องระบุแอตทริบิวต์  | 
| custom_package | สตริง ค่าเริ่มต้นคือ  test_classด้วย | 
| densities | รายการสตริง ค่าเริ่มต้นคือ  | 
| enable_data_binding | บูลีน ค่าเริ่มต้นคือ  | 
| javacopts | รายการสตริง ค่าเริ่มต้นคือ  ระบบจะส่งตัวเลือกคอมไพเลอร์เหล่านี้ไปยัง javac หลังจากตัวเลือกคอมไพเลอร์ส่วนกลาง | 
| jvm_flags | รายการสตริง ค่าเริ่มต้นคือ  สคริปต์ Wrapper สำหรับไบนารี Java มีคำจำกัดความ CLASSPATH
          (เพื่อค้นหาไฟล์ JAR ที่ขึ้นต่อกันทั้งหมด) และเรียกใช้ตัวแปล Java ที่ถูกต้อง
          บรรทัดคำสั่งที่สคริปต์ Wrapper สร้างขึ้นจะมีชื่อของ
          คลาสหลักตามด้วย  โปรดทราบว่าแอตทริบิวต์นี้ไม่มีผลต่อ | 
| manifest | ป้ายกำกับ ค่าเริ่มต้นคือ  AndroidManifest.xmlต้องกำหนดหากมีการกำหนด resource_files หรือชิ้นงาน หรือหากไฟล์ Manifest ใดๆ จาก
        ไลบรารีภายใต้การทดสอบมีแท็กminSdkVersion | 
| manifest_values | พจนานุกรม: สตริง -> สตริง ค่าเริ่มต้นคือ  applicationId,versionCode,versionName,minSdkVersion,targetSdkVersionและmaxSdkVersionจะลบล้างแอตทริบิวต์ที่เกี่ยวข้อง
        ของไฟล์ Manifest และ
        แท็ก uses-sdk ด้วย ระบบจะเพิกเฉยต่อpackageNameและจะตั้งค่าจากapplicationIdหากมีการระบุ หรือแพ็กเกจในไฟล์ Manifest
        คุณไม่จำเป็นต้องมีไฟล์ Manifest ในกฎเพื่อใช้ manifest_values | 
| nocompress_extensions | รายการสตริง ค่าเริ่มต้นคือ  | 
| plugins | รายการป้ายกำกับ ค่าเริ่มต้นคือ  java_pluginทุกรายการที่ระบุในแอตทริบิวต์นี้จะทำงานทุกครั้งที่มีการสร้างกฎนี้
           ไลบรารีอาจรับช่วงปลั๊กอินจากทรัพยากร Dependency ที่ใช้exported_pluginsด้วย ระบบจะรวมทรัพยากร
          ที่ปลั๊กอินสร้างขึ้นไว้ในไฟล์ JAR ที่ได้จากกฎนี้ | 
| resource_configuration_filters | รายการสตริง ค่าเริ่มต้นคือ  | 
| resource_jars | รายการป้ายกำกับ ค่าเริ่มต้นคือ  | 
| resource_strip_prefix | สตริง ค่าเริ่มต้นคือ  
            หากระบุไว้ ระบบจะนำคำนำหน้าเส้นทางนี้ออกจากทุกไฟล์ในแอตทริบิวต์  | 
| runtime_deps | รายการป้ายกำกับ ค่าเริ่มต้นคือ  depsทั่วไป ไฟล์เหล่านี้จะปรากฏใน classpath ของรันไทม์ แต่จะไม่ปรากฏใน classpath ของเวลาคอมไพล์ การอ้างอิงที่จำเป็นเฉพาะในเวลาเรียกใช้ควร
          แสดงไว้ที่นี่ เครื่องมือวิเคราะห์การขึ้นต่อกันควรละเว้นเป้าหมายที่ปรากฏทั้งในruntime_depsและdeps | 
| stamp | จำนวนเต็ม ค่าเริ่มต้นคือ  
 ระบบจะไม่สร้างไบนารีที่ประทับเวลาใหม่ เว้นแต่ว่ามีการเปลี่ยนแปลงในทรัพยากร Dependency | 
| test_class | สตริง ค่าเริ่มต้นคือ  
        แอตทริบิวต์นี้ระบุชื่อของคลาส Java ที่การทดสอบนี้จะเรียกใช้ ไม่ค่อยมีความจำเป็นในการตั้งค่านี้ หากละเว้นอาร์กิวเมนต์นี้ ระบบจะใช้คลาส Java
        ที่มีชื่อสอดคล้องกับ  | 
| use_launcher | บูลีน ค่าเริ่มต้นคือ  หากตั้งค่าแอตทริบิวต์นี้เป็น "เท็จ" ระบบจะไม่สนใจแอตทริบิวต์
          launcher และแฟล็กที่เกี่ยวข้อง
           | 
android_device
ดูแหล่งที่มาของกฎandroid_device(name, cache, compatible_with, default_properties, deprecation, distribs, exec_compatible_with, exec_properties, features, horizontal_resolution, licenses, platform_apks, ram, restricted_to, screen_density, system_image, tags, target_compatible_with, testonly, vertical_resolution, visibility, vm_heap)
กฎนี้จะสร้างโปรแกรมจำลอง Android ที่กำหนดค่าตามข้อมูลจำเพาะที่ระบุ คุณอาจเริ่มโปรแกรมจำลองนี้ผ่านคำสั่ง bazel run หรือโดยการเรียกใช้สคริปต์ที่สร้างขึ้นโดยตรง เราขอแนะนำให้ใช้กฎ android_device ที่มีอยู่แทนการกำหนดกฎของคุณเอง
กฎนี้เป็นเป้าหมายที่เหมาะสมสำหรับแฟล็ก --run_under ในการทดสอบ Bazel และการเรียกใช้ Blaze โดยจะเริ่มโปรแกรมจำลอง คัดลอกเป้าหมายที่กำลังทดสอบ/เรียกใช้ไปยังโปรแกรมจำลอง และทดสอบหรือเรียกใช้ตามความเหมาะสม
android_device รองรับการสร้างอิมเมจ KVM หากsystem_image พื้นฐานเป็นแบบ X86 และได้รับการเพิ่มประสิทธิภาพสำหรับสถาปัตยกรรม CPU I686 อย่างมาก หากต้องการใช้ KVM ให้เพิ่ม
   tags = ['requires-kvm']  ในกฎ android_device
เป้าหมายเอาต์พุตโดยนัย
- name_images/userdata.dat: มีไฟล์รูปภาพและสแนปชอตเพื่อเริ่มโปรแกรมจำลอง
- name_images/emulator-meta-data.pb: มีข้อมูลที่จัดลำดับซึ่งจำเป็นต่อการส่งต่อให้โปรแกรมจำลองเพื่อ รีสตาร์ท
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงวิธีใช้ android_device
//java/android/helloandroid/BUILD มี
android_device(
    name = "nexus_s",
    cache = 32,
    default_properties = "nexus_s.properties",
    horizontal_resolution = 480,
    ram = 512,
    screen_density = 233,
    system_image = ":emulator_images_android_16_x86",
    vertical_resolution = 800,
    vm_heap = 32,
)
filegroup(
    name = "emulator_images_android_16_x86",
    srcs = glob(["androidsdk/system-images/android-16/**"]),
)
//java/android/helloandroid/nexus_s.properties มี
ro.product.brand=google ro.product.device=crespo ro.product.manufacturer=samsung ro.product.model=Nexus S ro.product.name=soju
กฎนี้จะสร้างรูปภาพและสคริปต์เริ่มต้น คุณเริ่มโปรแกรมจำลอง ในเครื่องได้โดยการเรียกใช้ bazel run :nexus_s -- --action=start สคริปต์จะแสดงแฟล็กต่อไปนี้
- --adb_port: พอร์ตที่จะเปิดเผย adb หากต้องการออกคำสั่ง adb ไปยังโปรแกรมจำลอง นี่คือพอร์ตที่คุณจะออกคำสั่ง adb connect ไปยัง
- --emulator_port: พอร์ตที่จะเปิดเผยคอนโซลการจัดการ Telnet ของโปรแกรมจำลอง
- --enable_display: เริ่มโปรแกรมจำลองที่มีจอแสดงผลหากเป็นจริง (ค่าเริ่มต้น เป็นเท็จ)
- --action: Either start or kill.
- --apks_to_install: รายการ APK ที่จะติดตั้งในโปรแกรมจำลอง
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| cache | จำนวนเต็ม; ต้องระบุขนาดพาร์ติชันแคชของโปรแกรมจำลองในหน่วยเมกะไบต์ ค่าต่ำสุดของพารามิเตอร์นี้คือ 16 เมกะไบต์ | 
| default_properties | ป้ายกำกับ ค่าเริ่มต้นคือ  | 
| horizontal_resolution | จำนวนเต็ม; ต้องระบุความละเอียดของหน้าจอแนวนอนในหน่วยพิกเซลที่จะจำลอง ค่าต่ำสุดคือ 240 | 
| platform_apks | รายการป้ายกำกับ ค่าเริ่มต้นคือ  | 
| ram | จำนวนเต็ม; ต้องระบุปริมาณ RAM ในหน่วยเมกะไบต์ที่จะจำลองสำหรับอุปกรณ์ การตั้งค่านี้มีผลกับอุปกรณ์ทั้งเครื่อง ไม่ใช่แค่แอปใดแอปหนึ่งที่ติดตั้งในอุปกรณ์ ค่าต่ำสุดคือ 64 เมกะไบต์ | 
| screen_density | จำนวนเต็ม; ต้องระบุความหนาแน่นของหน้าจอที่จำลองในหน่วยพิกเซลต่อนิ้ว ค่าต่ำสุดของพารามิเตอร์นี้คือ 30 ppi | 
| system_image | ป้ายกำกับ (ต้องระบุ)กลุ่มไฟล์ที่มีไฟล์ต่อไปนี้ 
 | 
| vertical_resolution | จำนวนเต็ม; ต้องระบุความละเอียดหน้าจอแนวตั้งเป็นพิกเซลที่จะจำลอง ค่าต่ำสุดคือ 240 | 
| vm_heap | จำนวนเต็ม; ต้องระบุขนาดฮีปของเครื่องเสมือนในหน่วยเมกะไบต์ที่ Android จะใช้สำหรับแต่ละกระบวนการ ค่าต่ำสุดคือ 16 เมกะไบต์ | 
android_ndk_repository
ดูแหล่งที่มาของกฎandroid_ndk_repository(name, api_level, path, repo_mapping)
กำหนดค่า Bazel ให้ใช้ Android NDK เพื่อรองรับการสร้างเป้าหมาย Android ด้วยโค้ดเนทีฟ
โปรดทราบว่าการใช้งาน android_ndk_repository นี้จะถูกแทนที่ด้วยการใช้งานใน Starlark
 การรองรับ NDK เวอร์ชันในอนาคต รวมถึงเวอร์ชัน 25 ขึ้นไป จะ
ได้รับการติดตั้งใช้งานใน Starlark เวอร์ชันของ android_ndk_repository ดู
rules_android_ndk สำหรับ Starlark
เวอร์ชัน
โปรดทราบว่าการสร้างสำหรับ Android ต้องมีกฎ android_sdk_repository ในไฟล์
WORKSPACE ด้วย
ดูข้อมูลเพิ่มเติมได้ใน เอกสารประกอบฉบับเต็มเกี่ยวกับการใช้ Android NDK กับ Bazel
ตัวอย่าง
android_ndk_repository(
    name = "androidndk",
)
ตัวอย่างข้างต้นจะค้นหา Android NDK จาก $ANDROID_NDK_HOME และตรวจหาระดับ API สูงสุดที่รองรับ
android_ndk_repository(
    name = "androidndk",
    path = "./android-ndk-r20",
    api_level = 24,
)
ตัวอย่างข้างต้นจะใช้ Android NDK ที่อยู่ในพื้นที่ทำงานของคุณใน
./android-ndk-r20 โดยจะใช้ไลบรารี API ระดับ 24 เมื่อคอมไพล์โค้ด JNI
cpufeatures
Android NDK มี ไลบรารี cpufeatures ซึ่งใช้ตรวจหา CPU ของอุปกรณ์ได้ในขณะรันไทม์ ตัวอย่างต่อไปนี้แสดงวิธีใช้ cpufeatures กับ Bazel
# jni.cc #include "ndk/sources/android/cpufeatures/cpu-features.h" ...
# BUILD
cc_library(
    name = "jni",
    srcs = ["jni.cc"],
    deps = ["@androidndk//:cpufeatures"],
)
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| api_level | จำนวนเต็ม กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  | 
| path | สตริง กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  $ANDROID_NDK_HOMEคุณดาวน์โหลด Android NDK ได้จาก เว็บไซต์ของนักพัฒนาแอป Android | 
| repo_mapping | พจนานุกรม: สตริง -> สตริง ค่าเริ่มต้นคือ  เช่น รายการ  | 
android_sdk_repository
ดูแหล่งที่มาของกฎandroid_sdk_repository(name, api_level, build_tools_version, path, repo_mapping)
กำหนดค่า Bazel ให้ใช้ Android SDK ในเครื่องเพื่อรองรับการสร้างเป้าหมาย Android
ตัวอย่าง
การตั้งค่า Android SDK สำหรับ Bazel ขั้นต่ำคือการใส่กฎandroid_sdk_repository
ชื่อ "androidsdk" ในไฟล์ WORKSPACE และตั้งค่า $ANDROID_HOME
ตัวแปรสภาพแวดล้อมเป็นเส้นทางของ Android SDK Bazel จะใช้ Android API ระดับสูงสุด
และเวอร์ชันเครื่องมือบิลด์ที่ติดตั้งใน Android SDK โดยค่าเริ่มต้น
android_sdk_repository(
    name = "androidsdk",
)
หากต้องการให้มั่นใจว่าการสร้างจะทำซ้ำได้ คุณสามารถตั้งค่าแอตทริบิวต์ path, api_level และ build_tools_version เป็นค่าที่เฉพาะเจาะจงได้ การสร้างจะล้มเหลวหาก
Android SDK ไม่ได้ติดตั้งระดับ API หรือเวอร์ชันเครื่องมือสร้างที่ระบุ
android_sdk_repository(
    name = "androidsdk",
    path = "./sdk",
    api_level = 19,
    build_tools_version = "25.0.0",
)
ตัวอย่างข้างต้นยังแสดงการใช้เส้นทางที่สัมพันธ์กับพื้นที่ทํางานไปยัง Android SDK ด้วย ซึ่งจะมีประโยชน์หาก Android SDK เป็นส่วนหนึ่งของพื้นที่ทำงาน Bazel (เช่น หากมีการเช็คอินในระบบควบคุมเวอร์ชัน)
ไลบรารีการสนับสนุน
ไลบรารีการสนับสนุนมีอยู่ใน Android SDK Manager ในชื่อ "Android Support Repository"
ซึ่งเป็นชุดไลบรารี Android ทั่วไปที่มีการกำหนดเวอร์ชัน เช่น ไลบรารี Support และ AppCompat
ที่จัดแพ็กเกจเป็นที่เก็บ Maven ในเครื่อง android_sdk_repository จะสร้างเป้าหมาย Bazel
 สำหรับไลบรารีแต่ละรายการที่ใช้ในทรัพยากร Dependency ของเป้าหมาย android_binary และ android_library ได้
ชื่อของเป้าหมายที่สร้างขึ้นมาจากพิกัด Maven ของไลบรารีใน
ที่เก็บ Android Support โดยจัดรูปแบบเป็น @androidsdk//${group}:${artifact}-${version}
ตัวอย่างต่อไปนี้แสดงวิธีที่ android_library สามารถขึ้นอยู่กับไลบรารี
v7 appcompat เวอร์ชัน 25.0.0
android_library(
    name = "lib",
    srcs = glob(["*.java"]),
    manifest = "AndroidManifest.xml",
    resource_files = glob(["res/**"]),
    deps = ["@androidsdk//com.android.support:appcompat-v7-25.0.0"],
)
อาร์กิวเมนต์
| Attributes | |
|---|---|
| name | ชื่อ (ต้องระบุ) ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ | 
| api_level | จำนวนเต็ม กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  คุณสามารถลบล้างระดับ API ที่ใช้สำหรับบิลด์ที่กำหนดได้โดยใช้แฟล็ก  หากต้องการดู | 
| build_tools_version | สตริง กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  Bazel ต้องใช้เครื่องมือบิลด์เวอร์ชัน 30.0.0 ขึ้นไป | 
| path | สตริง กำหนดค่าไม่ได้ ค่าเริ่มต้นคือ  $ANDROID_HOMEคุณดาวน์โหลด Android SDK ได้จาก เว็บไซต์ของนักพัฒนาแอป Android | 
| repo_mapping | พจนานุกรม: สตริง -> สตริง ค่าเริ่มต้นคือ  เช่น รายการ  |