กฎ Android

กฎ

android_binary

android_binary(name, deps, srcs, assets, assets_dir, compatible_with, crunch_png, custom_package, debug_key, debug_signing_keys, debug_signing_lineage_file, densities, deprecation, dex_shards, dexopts, distribs, enable_data_binding, exec_compatible_with, exec_properties, features, incremental_dexing, instruments, javacopts, key_rotation_min_sdk, licenses, main_dex_list, main_dex_list_opts, main_dex_proguard_specs, manifest, manifest_values, multidex, nocompress_extensions, package_id, plugins, proguard_apply_dictionary, proguard_apply_mapping, proguard_generate_mapping, proguard_specs, resource_configuration_filters, resource_files, restricted_to, shrink_resources, tags, target_compatible_with, testonly, visibility)

สร้างไฟล์แพ็กเกจแอปพลิเคชัน Android (.apk)

เป้าหมายเอาต์พุตโดยนัย

  • name.apk: ไฟล์แพ็กเกจแอปพลิเคชัน Android ที่รับรองด้วยคีย์การแก้ไขข้อบกพร่องและ zipaligned ไฟล์นี้สามารถใช้เพื่อพัฒนาและแก้ไขข้อบกพร่องของแอปพลิเคชันได้ คุณไม่สามารถปล่อยแอปพลิเคชันเมื่อลงชื่อด้วยคีย์การแก้ไขข้อบกพร่องแล้ว
  • name_unsigned.apk: ไฟล์ข้างต้นในเวอร์ชันที่ไม่มีการรับรอง ซึ่งสามารถลงนามด้วยคีย์รุ่นก่อนจะเผยแพร่สู่สาธารณะ
  • name_deploy.jar: ที่เก็บถาวรของ Java ที่มีการปิดแบบสัญจรของเป้าหมายนี้

    Jar การทำให้ใช้งานได้มีคลาสทั้งหมดที่ตัวโหลดจะค้นพบโดยคลาสพาธซึ่งค้นหาคลาสพาธรันไทม์ของเป้าหมายนี้ตั้งแต่ต้นจนจบ

  • 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 ของโครงสร้างซอร์สของ Basl

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

deps

List of labels; optional

รายการไลบรารีอื่นๆ ที่จะลิงก์กับเป้าหมายไบนารี ประเภทไลบรารีที่อนุญาต ได้แก่ android_library, java_library ที่มีข้อจำกัด android และ cc_library ซึ่งกำลังห่อหรือสร้างไลบรารีแบบเนทีฟ .so รายการสำหรับแพลตฟอร์มเป้าหมายของ Android
srcs

List of labels; optional

รายการไฟล์ต้นฉบับที่ประมวลผลเพื่อสร้างเป้าหมาย

ไฟล์ srcs ประเภท .java ได้รับการคอมไพล์แล้ว เพื่อให้อ่านง่ายขึ้น คุณไม่ควรใส่ชื่อของไฟล์ต้นฉบับ .java ที่สร้างขึ้นใน srcs ให้ป้อนชื่อกฎที่เกี่ยวข้องใน srcs แทน ตามที่อธิบายด้านล่าง

ไฟล์ srcs ประเภท .srcjar ถูกคลายการแพคและคอมไพล์แล้ว (ซึ่งจะเป็นประโยชน์หากต้องการสร้างชุดไฟล์ .java ที่มี Genrule หรือส่วนขยายบิลด์)

assets

List of labels; optional

รายการเนื้อหาที่จะจัดเป็นแพ็กเกจ ซึ่งโดยปกติจะเป็น glob ของไฟล์ทั้งหมดภายในไดเรกทอรี assets นอกจากนี้ คุณยังอ้างอิงกฎอื่นๆ (กฎที่สร้างไฟล์) หรือไฟล์ที่ส่งออกในแพ็กเกจอื่นๆ ได้ ตราบใดที่ไฟล์เหล่านั้นทั้งหมดอยู่ในไดเรกทอรี assets_dir ในแพ็กเกจที่เกี่ยวข้อง
assets_dir

String; optional

สตริงที่กำหนดเส้นทางไปยังไฟล์ใน assets คู่ assets และ assets_dir อธิบายเนื้อหาแพ็กเกจ และควรระบุแอตทริบิวต์ทั้ง 2 รายการหรือไม่ระบุแอตทริบิวต์เลย
crunch_png

Boolean; optional; default is True

ใช้ PNG (หรือไม่) ซึ่งไม่เกี่ยวข้องกับการประมวลผลแพตช์ 9 ครั้ง ซึ่งมักจะดำเนินการได้เสมอ นี่เป็นวิธีแก้ปัญหาชั่วคราวที่เลิกใช้งานแล้วสำหรับข้อบกพร่องของ aapt ซึ่งได้รับการแก้ไขใน aapt2 แล้ว
custom_package

String; optional

แพ็กเกจ Java ที่จะสร้างซอร์ส Java โดยค่าเริ่มต้น ระบบจะอนุมานแพ็กเกจจากไดเรกทอรีที่มีไฟล์ BUILD ที่มีกฎดังกล่าว คุณสามารถระบุแพ็กเกจอื่นได้ แต่เราไม่แนะนำให้ทำเช่นนั้น เนื่องจากอาจทำให้เกิดความขัดแย้งของคลาสพาธกับไลบรารีอื่นๆ ที่จะตรวจพบในรันไทม์เท่านั้น
debug_key

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

ไฟล์ที่มีคีย์สโตร์สำหรับการแก้ไขข้อบกพร่องซึ่งจะใช้ลงนาม APK สำหรับการแก้ไขข้อบกพร่อง โดยปกติแล้วคุณไม่ต้องการใช้คีย์อื่นที่ไม่ใช่คีย์เริ่มต้น จึงควรละเว้นแอตทริบิวต์นี้

คำเตือน: อย่าใช้คีย์ที่ใช้งานจริง คีย์ดังกล่าวควรได้รับการปกป้องอย่างเข้มงวดและไม่เก็บเอาไว้ในโครงสร้างต้นทาง

debug_signing_keys

List of labels; optional

รายการไฟล์และคีย์สโตร์สำหรับการแก้ไขข้อบกพร่องที่จะใช้ในการรับรอง APK การแก้ไขข้อบกพร่อง โดยปกติแล้วคุณไม่ต้องการใช้คีย์อื่นที่ไม่ใช่คีย์เริ่มต้น จึงควรละเว้นแอตทริบิวต์นี้

คำเตือน: อย่าใช้คีย์ที่ใช้งานจริง คีย์ดังกล่าวควรได้รับการปกป้องอย่างเข้มงวดและไม่เก็บเอาไว้ในโครงสร้างต้นทาง

debug_signing_lineage_file

Label; optional

ไฟล์ที่มีบรรทัดการลงชื่อสำหรับ debug_signing_keys โดยปกติแล้วคุณไม่ต้องการใช้คีย์อื่นที่ไม่ใช่คีย์เริ่มต้น จึงควรละเว้นแอตทริบิวต์นี้

คำเตือน: อย่าใช้คีย์ที่ใช้งานจริง คีย์ดังกล่าวควรได้รับการปกป้องอย่างเข้มงวดและไม่เก็บเอาไว้ในโครงสร้างต้นทาง

densities

List of strings; optional

ความหนาแน่นที่จะกรองเมื่อสร้าง APK การดำเนินการนี้จะตัดทรัพยากรที่ถอนออกได้ของแรสเตอร์ซึ่งอุปกรณ์ที่มีความหนาแน่นของหน้าจอที่ระบุไว้ไม่ได้โหลดเพื่อลดขนาด APK ระบบจะเพิ่มส่วนหน้าจอที่เข้ากันได้ที่เกี่ยวข้องลงในไฟล์ Manifest ด้วยหากส่วนดังกล่าวยังไม่มีรายการซูเปอร์เซ็ตอยู่แล้ว
dex_shards

Integer; optional; default is 1

ควรแยกจำนวนชาร์ด Dexing ไป ทำให้การทำงานคล่องตัวขึ้นมากโดยลดค่าใช้จ่ายในการติดตั้งแอปและเวลาในการเริ่มต้นระบบ ยิ่งไบนารีมีขนาดใหญ่ ก็ยิ่งควรใช้ชาร์ดมากขึ้นเท่านั้น 25 เป็นค่าที่ดีสำหรับการเริ่มทดลองใช้

โปรดทราบว่าชาร์ดแต่ละรายการจะทำให้เกิด Dex อย่างน้อย 1 Dex ในแอปสุดท้าย ด้วยเหตุนี้ เราจึงไม่แนะนำให้ตั้งค่านี้มากกว่า 1 สำหรับไบนารีของการเผยแพร่

dexopts

List of strings; optional

แฟล็กบรรทัดคำสั่งเพิ่มเติมสำหรับเครื่องมือ dx เมื่อสร้าง classes.dex ขึ้นอยู่กับการแทนที่ "สร้างตัวแปร" และการแปลงข้อมูลเป็นโทเค็นของ Bourne shell
enable_data_binding

Boolean; optional; default is False

หากเป็น "จริง" กฎนี้ประมวลผลนิพจน์การเชื่อมโยงข้อมูลในทรัพยากรเลย์เอาต์ที่รวมผ่านแอตทริบิวต์ resource_files หากไม่มีการตั้งค่านี้ นิพจน์การเชื่อมโยงข้อมูลจะทำให้บิลด์ล้มเหลว

หากต้องการสร้างแอป Android ที่มีการเชื่อมโยงข้อมูล คุณต้องทําสิ่งต่อไปนี้ด้วย

  1. ตั้งค่าแอตทริบิวต์นี้สำหรับกฎ Android ทั้งหมดที่ขึ้นอยู่กับกฎใน Android นี้ เนื่องจากทรัพยากร Dependency จะรับค่านิพจน์การเชื่อมโยงข้อมูลของกฎผ่านการผสานทรัพยากร ดังนั้นจึงจำเป็นต้องสร้างด้วยการเชื่อมโยงข้อมูลเพื่อแยกวิเคราะห์นิพจน์เหล่านั้นด้วย
  2. เพิ่มรายการ deps = สำหรับไลบรารีรันไทม์การเชื่อมโยงข้อมูลลงในเป้าหมายทั้งหมดที่กำหนดแอตทริบิวต์นี้ ตำแหน่งของไลบรารีนี้ขึ้นอยู่กับการตั้งค่า Depot
incremental_dexing

Integer; optional; nonconfigurable; default is -1

บังคับให้สร้างเป้าหมายโดยมีหรือไม่สร้าง Dexing ที่เพิ่มขึ้น การลบล้างค่าเริ่มต้น และแฟล็ก --incremental_dexing
instruments

Label; optional

เป้าหมาย android_binary สำหรับเครื่องมือ

หากมีการตั้งค่าแอตทริบิวต์นี้ ระบบจะถือว่า android_binary นี้เป็นแอปพลิเคชันทดสอบสำหรับการทดสอบการวัดคุม จากนั้นเป้าหมาย android_instrumentation_test จะระบุเป้าหมายนี้ในแอตทริบิวต์ test_app ได้

javacopts

List of strings; optional

ตัวเลือกคอมไพเลอร์เพิ่มเติมสำหรับเป้าหมายนี้ ขึ้นอยู่กับการแทนที่ "สร้างตัวแปร" และการแปลงข้อมูลเป็นโทเค็นของ Bourne shell

ระบบจะส่งตัวเลือกคอมไพเลอร์เหล่านี้ไปยัง javac หลังจากตัวเลือกคอมไพเลอร์ส่วนกลาง

key_rotation_min_sdk

String; optional

ตั้งค่าเวอร์ชันขั้นต่ำของแพลตฟอร์ม Android (ระดับ API) สำหรับใช้คีย์ Signing แบบหมุนเวียนของ APK เพื่อสร้างลายเซ็นของ APK ระบบจะใช้คีย์การรับรองเดิมสำหรับ APK สำหรับแพลตฟอร์มเวอร์ชันก่อนหน้าทั้งหมด
main_dex_list

Label; optional

ไฟล์ข้อความจะมีรายการชื่อไฟล์ของชั้นเรียน ชั้นเรียนที่กำหนดโดยไฟล์ชั้นเรียนเหล่านั้นจะ อยู่ใน classroom.dex หลัก เช่น
          android/support/multidex/MultiDex$V19.class
          android/support/multidex/MultiDex.class
          android/support/multidex/MultiDexApplication.class
          com/google/common/base/Objects.class
                    
ต้องใช้กับ multidex="manual_main_dex"
main_dex_list_opts

List of strings; optional

ตัวเลือกบรรทัดคำสั่งเพื่อส่งไปยังเครื่องมือสร้างรายการ Dex หลัก ให้ใช้ตัวเลือกนี้เพื่อให้มีผลกับชั้นเรียนที่อยู่ในรายการ Dex หลัก
main_dex_proguard_specs

List of labels; optional

ไฟล์ที่จะใช้เป็นข้อกำหนดของ Proguard เพื่อกำหนดคลาสที่ต้องเก็บไว้ใน Dex หลัก อนุญาตเฉพาะเมื่อตั้งค่าแอตทริบิวต์ multidex เป็น legacy
manifest

Label; required

ชื่อของไฟล์ Android Manifest ตามปกติคือ AndroidManifest.xml ต้องระบุหากมีการกำหนด resource_files หรือ Asset
manifest_values

Dictionary: String -> String; optional

พจนานุกรมของค่าที่ต้องลบล้างในไฟล์ Manifest ระบบจะแทนที่อินสแตนซ์ทั้งหมดของ ${name} ในไฟล์ Manifest ด้วยค่าที่ตรงกับชื่อในพจนานุกรมนี้ applicationId, versionCode, versionName, minSdkVersion, targetSdkVersion และ maxSdkVersion จะลบล้างแอตทริบิวต์ที่สอดคล้องกันของไฟล์ Manifest และแท็ก Use-sdk ด้วยเช่นกัน ระบบจะไม่สนใจ packageName และตั้งค่าจาก applicationId อย่างใดอย่างหนึ่งหากระบุไว้หรือแพ็กเกจในไฟล์ Manifest เมื่อตั้งค่า Manifest_merger เป็นระบบเดิม จะมีเพียง applicationId, versionCode และ versionName เท่านั้นที่จะมีผล
multidex

String; optional; default is "native"

ต้องการแบ่งโค้ดออกเป็นไฟล์ dex หลายไฟล์หรือไม่
ค่าที่เป็นไปได้มีดังนี้
  • native: แยกโค้ดออกเป็นไฟล์ dex หลายไฟล์เมื่อเกินขีดจำกัดของดัชนี dex 64K คาดว่าแพลตฟอร์มดั้งเดิมจะรองรับการโหลดคลาส Multidex ระหว่างรันไทม์ ตัวเลือกนี้ใช้ได้เฉพาะใน Android L ขึ้นไป
  • legacy: แยกโค้ดออกเป็นไฟล์ dex หลายไฟล์เมื่อเกินขีดจำกัดของดัชนี dex 64K สมมติว่าคลาส Multidex โหลดผ่านโค้ดของแอปพลิเคชัน (เช่น ไม่มีการรองรับแพลตฟอร์มเนทีฟ)
  • manual_main_dex: แยกโค้ดออกเป็นไฟล์ dex หลายไฟล์เมื่อเกินขีดจำกัดของดัชนี dex 64K คุณต้องระบุเนื้อหาของไฟล์ dex หลักด้วยการระบุรายการคลาสในไฟล์ข้อความโดยใช้แอตทริบิวต์ main_dex_list
  • off: คอมไพล์โค้ดทั้งหมดเป็นไฟล์ dex ไฟล์เดียว แม้ว่าจะเกินขีดจำกัดดัชนีก็ตาม
nocompress_extensions

List of strings; optional

รายการนามสกุลไฟล์ที่ไม่บีบอัดเป็นไฟล์ APK
package_id

Integer; optional; default is 0

รหัสแพ็กเกจที่จะกำหนดให้กับทรัพยากรในไบนารีนี้

ดูข้อมูลเพิ่มเติมได้ในอาร์กิวเมนต์ --package-id ของ AAPT2 ซึ่งโดยทั่วไปสามารถ (และควร) ไม่ได้ตั้งค่าได้ ซึ่งทำให้มีค่าเริ่มต้นเป็น 127 (0x7F)

plugins

List of labels; optional

ปลั๊กอินของคอมไพเลอร์ Java ที่จะเรียกใช้ในเวลาคอมไพล์ ระบบจะเรียกใช้ java_plugin ทั้งหมดที่ระบุในแอตทริบิวต์ปลั๊กอินเมื่อมีการสร้างเป้าหมายนี้ ทรัพยากรที่ปลั๊กอินสร้างขึ้นจะรวมอยู่ในโหลผลลัพธ์ของเป้าหมาย
proguard_apply_dictionary

Label; optional

ไฟล์ที่จะใช้เป็นการแมปสำหรับ Proguard ไฟล์ที่แยกบรรทัดของ "คำ" ที่จะดึงมาเมื่อเปลี่ยนชื่อชั้นเรียนและสมาชิกระหว่างการสร้างความสับสน
proguard_apply_mapping

Label; optional

ไฟล์ที่จะใช้เป็นการแมปสำหรับ Proguard ไฟล์การแมปที่ proguard_generate_mapping สร้างขึ้นเพื่อนํามาใช้ซ้ำกับบิลด์ใหม่
proguard_generate_mapping

Boolean; optional; nonconfigurable; default is False

จะสร้างไฟล์การแมป Proguard ไหม ระบบจะสร้างไฟล์การแมปก็ต่อเมื่อระบุ proguard_specs เท่านั้น ไฟล์นี้จะแสดงรายการการแมประหว่างชื่อคลาส เมธอด และช่องเดิมที่สร้างความสับสน

คำเตือน: หากใช้แอตทริบิวต์นี้ ข้อกำหนด Proguard ไม่ควรมี -dontobfuscate และ -printmapping

proguard_specs

List of labels; optional

ไฟล์ที่จะใช้เป็นข้อมูลจำเพาะของ Proguard ไฟล์นี้จะอธิบายชุดข้อกำหนดที่ Proguard ใช้งาน
resource_configuration_filters

List of strings; optional

รายการตัวกรองการกำหนดค่าทรัพยากร เช่น "en" ที่จะจำกัดทรัพยากรใน apk ให้มีเฉพาะทรัพยากรในการกำหนดค่า "en" เท่านั้น หากต้องการเปิดใช้การแปล Pseudolocalization ให้ใส่ภาษา Pseudo ใน en_XA และ/หรือ ar_XB
resource_files

List of labels; optional

รายการทรัพยากรที่จะจัดทำเป็นแพ็กเกจ ซึ่งโดยปกติจะเป็น glob ของไฟล์ทั้งหมดภายในไดเรกทอรี res
ป้ายกำกับที่นี่สามารถอ้างอิงไฟล์ที่สร้างขึ้น (จาก genrules) ได้เช่นกัน ข้อจำกัดเพียงอย่างเดียวคือเอาต์พุตที่สร้างขึ้นต้องอยู่ในไดเรกทอรี "res" เดียวกันกับไฟล์ทรัพยากรอื่นๆ ที่รวมอยู่
shrink_resources

Integer; optional; default is -1

จะทำการย่อทรัพยากรหรือไม่ ระบบจะนำทรัพยากรที่ไบนารีไม่ได้ใช้ออกจาก APK ฟีเจอร์นี้รองรับเฉพาะกฎที่ใช้ทรัพยากรในเครื่อง (เช่น แอตทริบิวต์ manifest และ resource_files) และต้องใช้ ProGuard โดยจะทำงานในลักษณะเดียวกันกับเครื่องมือลดขนาดทรัพยากร Gradle (https://developer.android.com/studio/build/shrink-code.html#shrink-resources)

ความแตกต่างที่เห็นได้ชัดมีดังนี้

  • ระบบจะนำทรัพยากรใน values/ ออก รวมถึงทรัพยากรที่อิงตามไฟล์
  • ใช้ strict mode โดยค่าเริ่มต้น
  • การนำทรัพยากร ID ที่ไม่ได้ใช้ออกจะใช้ได้กับ aapt2 เท่านั้น
หากเปิดใช้การลดขนาดทรัพยากร ระบบจะสร้าง name_files/resource_shrinker.log ด้วย ซึ่งจะแสดงรายละเอียดการวิเคราะห์และลบที่ดำเนินการ

ค่าที่เป็นไปได้มีดังนี้

  • shrink_resources = 1: เปิดการลดขนาดทรัพยากร Android
  • shrink_resources = 0: ปิดการย่อทรัพยากร Android
  • shrink_resources = -1: การลดขนาดจะควบคุมโดยแฟล็ก --android_resource_shrinking

aar_import

aar_import(name, deps, data, aar, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, exports, features, licenses, restricted_to, srcjar, tags, target_compatible_with, testonly, visibility)

กฎนี้อนุญาตให้ใช้ไฟล์ .aar เป็นไลบรารีสำหรับกฎ android_library และ android_binary

ตัวอย่าง

    aar_import(
        name = "google-vr-sdk",
        aar = "gvr-android-sdk/libraries/sdk-common-1.10.0.aar",
    )

    android_binary(
        name = "app",
        manifest = "AndroidManifest.xml",
        srcs = glob(["**.java"]),
        deps = [":google-vr-sdk"],
    )

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

aar

Label; required

ไฟล์ .aar ที่จะให้กับเป้าหมาย Android ที่ขึ้นอยู่กับเป้าหมายนี้
exports

List of labels; optional

เป้าหมายที่จะส่งออกไปยังกฎที่ขึ้นอยู่กับกฎนี้ โปรดดู java_library.exports.
srcjar

Label; optional

ไฟล์ JAR ที่มีซอร์สโค้ดสำหรับไฟล์ JAR ที่คอมไพล์แล้วใน AAR

android_library

android_library(name, deps, srcs, data, assets, assets_dir, compatible_with, custom_package, deprecation, distribs, enable_data_binding, exec_compatible_with, exec_properties, exported_plugins, exports, exports_manifest, features, idl_import_root, idl_parcelables, idl_preprocessed, idl_srcs, javacopts, licenses, manifest, neverlink, plugins, proguard_specs, resource_files, restricted_to, tags, target_compatible_with, testonly, visibility)

กฎนี้จะรวบรวมและเก็บแหล่งที่มาไว้ในไฟล์ .jar ระบบจะใส่ไลบรารีรันไทม์ Android android.jar ลงในเส้นทางคลาสการคอมไพล์โดยปริยาย

เป้าหมายเอาต์พุตโดยนัย

  • libname.jar: ที่เก็บถาวรสำหรับ Java
  • libname-src.jar: ที่เก็บถาวรที่มีแหล่งที่มา ("Jar ต้นทาง")
  • name.aar: แพ็กเกจ android "aar" ที่มีที่เก็บถาวรของ Java และทรัพยากรของเป้าหมายนี้ แต่ไม่ได้มีการปิดชั่วคราว

ตัวอย่าง

ดูตัวอย่างกฎ Android ได้ในไดเรกทอรี examples/android ของโครงสร้างซอร์สของ Basl

ตัวอย่างต่อไปนี้แสดงวิธีการตั้งค่า 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

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

deps

List of labels; optional

รายชื่อไลบรารีอื่นๆ ที่จะลิงก์ด้วย ประเภทไลบรารีที่ได้รับอนุญาต ได้แก่ android_library, java_library ที่มีข้อจำกัด android และ cc_library ซึ่งกำลังห่อหรือสร้างไลบรารีแบบเนทีฟ .so รายการสำหรับแพลตฟอร์มเป้าหมาย Android
srcs

List of labels; optional

รายการไฟล์ .java หรือ .srcjar ที่ดำเนินการเพื่อสร้างเป้าหมาย

ไฟล์ srcs ประเภท .java ได้รับการคอมไพล์แล้ว เพื่อให้อ่านง่ายขึ้น คุณไม่ควรใส่ชื่อของไฟล์ต้นฉบับ .java ที่สร้างขึ้นใน srcs ให้ป้อนชื่อกฎที่เกี่ยวข้องใน srcs แทน ตามที่อธิบายด้านล่าง

ไฟล์ srcs ประเภท .srcjar ถูกคลายการแพคและคอมไพล์แล้ว (ซึ่งจะเป็นประโยชน์หากต้องการสร้างชุดไฟล์ .java ที่มี Genrule หรือส่วนขยายบิลด์)

หากละเว้น srcs ระบบจะส่งออกทรัพยากร Dependency ที่ระบุใน deps จากกฎนี้ (ดูข้อมูลเพิ่มเติมเกี่ยวกับการส่งออกทรัพยากร Dependency ได้ที่การส่งออกของ java_library) อย่างไรก็ตาม เราจะเลิกใช้งานลักษณะการทำงานนี้ในเร็วๆ นี้ โปรดอย่าใช้งานลักษณะการทำงานนี้

assets

List of labels; optional

รายการเนื้อหาที่จะจัดเป็นแพ็กเกจ ซึ่งโดยปกติจะเป็น glob ของไฟล์ทั้งหมดภายในไดเรกทอรี assets นอกจากนี้ คุณยังอ้างอิงกฎอื่นๆ (กฎที่สร้างไฟล์) หรือไฟล์ที่ส่งออกในแพ็กเกจอื่นๆ ได้ ตราบใดที่ไฟล์เหล่านั้นทั้งหมดอยู่ในไดเรกทอรี assets_dir ในแพ็กเกจที่เกี่ยวข้อง
assets_dir

String; optional

สตริงที่กำหนดเส้นทางไปยังไฟล์ใน assets คู่ assets และ assets_dir อธิบายเนื้อหาแพ็กเกจ และควรระบุแอตทริบิวต์ทั้ง 2 รายการหรือไม่ระบุแอตทริบิวต์เลย
custom_package

String; optional

แพ็กเกจ Java ที่จะสร้างซอร์ส Java โดยค่าเริ่มต้น ระบบจะอนุมานแพ็กเกจจากไดเรกทอรีที่มีไฟล์ BUILD ที่มีกฎดังกล่าว คุณสามารถระบุแพ็กเกจอื่นได้ แต่เราไม่แนะนำให้ทำเช่นนั้น เนื่องจากอาจทำให้เกิดความขัดแย้งของคลาสพาธกับไลบรารีอื่นๆ ที่จะตรวจพบในรันไทม์เท่านั้น
enable_data_binding

Boolean; optional; default is False

หากเป็น "จริง" กฎนี้ประมวลผลนิพจน์การเชื่อมโยงข้อมูลในทรัพยากรเลย์เอาต์ที่รวมผ่านแอตทริบิวต์ resource_files หากไม่มีการตั้งค่านี้ นิพจน์การเชื่อมโยงข้อมูลจะทำให้บิลด์ล้มเหลว

หากต้องการสร้างแอป Android ที่มีการเชื่อมโยงข้อมูล คุณต้องทําสิ่งต่อไปนี้ด้วย

  1. ตั้งค่าแอตทริบิวต์นี้สำหรับกฎ Android ทั้งหมดที่ขึ้นอยู่กับกฎใน Android นี้ เนื่องจากทรัพยากร Dependency จะรับค่านิพจน์การเชื่อมโยงข้อมูลของกฎผ่านการผสานทรัพยากร ดังนั้นจึงจำเป็นต้องสร้างด้วยการเชื่อมโยงข้อมูลเพื่อแยกวิเคราะห์นิพจน์เหล่านั้นด้วย
  2. เพิ่มรายการ deps = สำหรับไลบรารีรันไทม์การเชื่อมโยงข้อมูลลงในเป้าหมายทั้งหมดที่กำหนดแอตทริบิวต์นี้ ตำแหน่งของไลบรารีนี้ขึ้นอยู่กับการตั้งค่า Depot
exported_plugins

List of labels; optional

รายการของ java_plugin (เช่น ตัวประมวลผลคำอธิบายประกอบ) ที่จะส่งออกไปยังไลบรารีที่ขึ้นอยู่กับไลบรารีนี้โดยตรง

ระบบจะใช้รายการ java_plugin ที่ระบุกับไลบรารีใดก็ตามที่ขึ้นอยู่กับไลบรารีนี้โดยตรง เหมือนกับว่าไลบรารีได้ประกาศป้ายกำกับเหล่านี้อย่างชัดเจนใน plugins

exports

List of labels; optional

การปิดกฎทั้งหมดที่เข้าถึงผ่านแอตทริบิวต์ exports ถือเป็นทรัพยากร Dependency โดยตรงของกฎที่ขึ้นอยู่กับเป้าหมายที่มี exports โดยตรง

exports ไม่ใช่รายละเอียดโดยตรงจากกฎที่เป็นอยู่

exports_manifest

Integer; optional; default is 1

ต้องการส่งออกรายการไฟล์ Manifest ไปยังเป้าหมาย android_binary ที่ขึ้นอยู่กับเป้าหมายนี้หรือไม่ ระบบจะไม่ส่งออกแอตทริบิวต์ uses-permissions เลย
idl_import_root

String; optional

เส้นทางสัมพัทธ์ของแพ็กเกจไปยังรูทของแผนผังแพ็กเกจ Java ที่มีแหล่งที่มาของ idl ที่รวมอยู่ในไลบรารีนี้

ระบบจะใช้เส้นทางนี้เป็นรูทการนำเข้าเมื่อประมวลผลแหล่งที่มาของ ID ที่ขึ้นอยู่กับไลบรารีนี้

เมื่อระบุ idl_import_root ทั้ง idl_parcelables และ idl_srcs ต้องอยู่ในเส้นทางที่ระบุโดยแพ็กเกจ Java ของออบเจ็กต์ที่แสดงภายใต้ idl_import_root เมื่อไม่ได้ระบุ idl_import_root ทั้ง idl_parcelables และ idl_srcs ต้องอยู่ในเส้นทางที่ระบุโดยแพ็กเกจภายใต้รูท Java

ดู ตัวอย่าง

idl_parcelables

List of labels; optional

รายการคำนิยามของ Android IDL ที่จะใช้เป็นการนำเข้า ไฟล์เหล่านี้จะพร้อมใช้งานเป็นการนำเข้าสําหรับเป้าหมาย android_library ที่ขึ้นอยู่กับไลบรารีนี้โดยตรงหรือผ่านการปิดด้วยทางอ้อม แต่จะไม่มีการแปลเป็น Java หรือคอมไพล์

ควรรวมเฉพาะไฟล์ .aidl ที่ตรงกับแหล่งที่มา .java ในไลบรารีนี้โดยตรง (เช่น การใช้งาน Parcelable ที่กำหนดเอง) ไม่เช่นนั้นควรใช้ idl_srcs

ต้องวางไฟล์เหล่านี้อย่างเหมาะสมเพื่อให้คอมไพเลอร์ Aidl สามารถค้นหาได้ ดูข้อมูลเกี่ยวกับความหมายได้ที่คำอธิบายของ idl_import_root

idl_preprocessed

List of labels; optional

รายการคำจำกัดความ Android IDL ที่ประมวลผลล่วงหน้าเพื่อนำไปใช้เป็นการนำเข้า ไฟล์เหล่านี้จะพร้อมใช้งานเป็นการนำเข้าสําหรับเป้าหมาย android_library ที่ขึ้นอยู่กับไลบรารีนี้โดยตรงหรือผ่านการปิดด้วยทางอ้อม แต่จะไม่มีการแปลเป็น Java หรือคอมไพล์

ควรรวมเฉพาะไฟล์ .aidl ที่ประมวลผลล่วงหน้าซึ่งสอดคล้องกับแหล่งที่มา .java ในไลบรารีนี้โดยตรง (เช่น การใช้งานที่กำหนดเองของ Parcelable) ไม่เช่นนั้น ให้ใช้ idl_srcs สำหรับคำนิยาม Android IDL ที่ต้องแปลเป็นอินเทอร์เฟซ Java และใช้ idl_parcelable สำหรับไฟล์ AIDL ที่ไม่ได้ประมวลผลล่วงหน้า

idl_srcs

List of labels; optional

รายการคำนิยามของ Android IDL ที่จะแปลเป็นอินเทอร์เฟซ Java หลังจากที่สร้างอินเทอร์เฟซ Java แล้ว ระบบจะคอมไพล์เข้ากับเนื้อหาของ srcs

ไฟล์เหล่านี้จะพร้อมใช้งานเป็นการนำเข้าสำหรับเป้าหมาย android_library ที่ขึ้นอยู่กับไลบรารีนี้โดยตรงหรือผ่านการปิดทางอ้อม

ต้องวางไฟล์เหล่านี้อย่างเหมาะสมเพื่อให้คอมไพเลอร์ Aidl สามารถค้นหาได้ ดูข้อมูลเกี่ยวกับความหมายได้ที่คำอธิบายของ idl_import_root

javacopts

List of strings; optional

ตัวเลือกคอมไพเลอร์เพิ่มเติมสำหรับเป้าหมายนี้ ขึ้นอยู่กับการแทนที่ "สร้างตัวแปร" และการแปลงข้อมูลเป็นโทเค็นของ Bourne shell

ระบบจะส่งตัวเลือกคอมไพเลอร์เหล่านี้ไปยัง javac หลังจากตัวเลือกคอมไพเลอร์ส่วนกลาง

manifest

Label; optional

ชื่อของไฟล์ Android Manifest ตามปกติคือ AndroidManifest.xml ต้องระบุหากมีการกำหนด resource_files หรือ Asset

Boolean; optional; default is False

ใช้ไลบรารีนี้สำหรับการคอมไพล์เท่านั้น ไม่ใช่ระหว่างรันไทม์ ระบบจะไม่ใช้เอาต์พุตของกฎที่ทำเครื่องหมายว่า neverlink ในการสร้าง .apk มีประโยชน์หากสภาพแวดล้อมรันไทม์จะจัดเตรียมไลบรารีไว้ให้ระหว่างการดำเนินการ
plugins

List of labels; optional

ปลั๊กอินของคอมไพเลอร์ Java ที่จะเรียกใช้ในเวลาคอมไพล์ ระบบจะเรียกใช้ java_plugin ทั้งหมดที่ระบุในแอตทริบิวต์ปลั๊กอินเมื่อมีการสร้างเป้าหมายนี้ ทรัพยากรที่ปลั๊กอินสร้างขึ้นจะรวมอยู่ในโหลผลลัพธ์ของเป้าหมาย
proguard_specs

List of labels; optional

ไฟล์ที่จะใช้เป็นข้อมูลจำเพาะของ Proguard ซึ่งจะอธิบายถึงชุดข้อกำหนดที่ Proguard ใช้งาน หากระบุ ระบบจะเพิ่มกลุ่มเป้าหมายนี้ลงในเป้าหมาย android_binary ใดก็ตาม ทั้งนี้ขึ้นอยู่กับไลบรารีนี้ ไฟล์ที่ระบุไว้ที่นี่ต้องมีเฉพาะกฎแบบ ID เท่านั้น ได้แก่ -dontnote, -dontwarn, summarynosideeffects และกฎที่ขึ้นต้นด้วย -keep ตัวเลือกอื่นๆ จะปรากฏใน Proguard_specs ของ android_binary เท่านั้นเพื่อให้แน่ใจว่ามีการผสานที่ไม่ใช่แบบโทโลจี
resource_files

List of labels; optional

รายการทรัพยากรที่จะจัดทำเป็นแพ็กเกจ ซึ่งโดยปกติจะเป็น glob ของไฟล์ทั้งหมดภายในไดเรกทอรี res
ป้ายกำกับที่นี่สามารถอ้างอิงไฟล์ที่สร้างขึ้น (จาก genrules) ได้เช่นกัน ข้อจำกัดเพียงอย่างเดียวคือเอาต์พุตที่สร้างขึ้นต้องอยู่ในไดเรกทอรี "res" เดียวกันกับไฟล์ทรัพยากรอื่นๆ ที่รวมอยู่

android_instrumentation_test

android_instrumentation_test(name, data, args, compatible_with, deprecation, distribs, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, licenses, local, restricted_to, shard_count, size, support_apks, tags, target_compatible_with, target_device, test_app, testonly, timeout, toolchains, visibility)

กฎ android_instrumentation_test จะทำการทดสอบการใช้เครื่องมือ Android โปรแกรมจะเริ่มโปรแกรมจำลอง ติดตั้งแอปพลิเคชันที่กำลังทดสอบ แอปพลิเคชันทดสอบ และแอปพลิเคชันอื่นๆ ที่จำเป็น ตลอดจนทำการทดสอบที่กำหนดไว้ในแพ็กเกจการทดสอบ

แอตทริบิวต์ test_app ระบุ android_binary ที่มีการทดสอบ จากนั้น android_binary นี้จะระบุแอปพลิเคชัน android_binary ภายใต้การทดสอบผ่านแอตทริบิวต์เครื่องมือ

ตัวอย่าง

# 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

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

support_apks

List of labels; optional

APK อื่นๆ ที่จะติดตั้งในอุปกรณ์ก่อนที่การทดสอบการใช้เครื่องมือจะเริ่มขึ้น
target_device

Label; required

android_device ที่การทดสอบควรทำงาน

หากต้องการเรียกใช้การทดสอบในโปรแกรมจําลองที่ใช้งานอยู่แล้วหรือในอุปกรณ์จริง ให้ใช้อาร์กิวเมนต์เหล่านี้ --test_output=streamed --test_arg=--device_broker_type=LOCAL_ADB_SERVER --test_arg=--device_serial_number=$device_identifier

test_app

Label; required

เป้าหมาย android_binary ที่มีคลาสการทดสอบ เป้าหมาย android_binary ต้องระบุเป้าหมายที่กำลังทดสอบผ่านแอตทริบิวต์ instruments

android_local_test

android_local_test(name, deps, srcs, data, args, compatible_with, custom_package, densities, deprecation, enable_data_binding, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, javacopts, jvm_flags, licenses, local, manifest, manifest_values, nocompress_extensions, plugins, resource_configuration_filters, resource_jars, resource_strip_prefix, restricted_to, runtime_deps, shard_count, size, stamp, tags, target_compatible_with, test_class, testonly, timeout, toolchains, use_launcher, visibility)

กฎนี้มีไว้สำหรับกฎ android_library หน่วยในการทดสอบภายในเครื่อง (แทนที่จะเป็นในอุปกรณ์) ใช้งานได้กับเฟรมเวิร์กการทดสอบ Android Robolectric ดูรายละเอียดเกี่ยวกับการเขียนการทดสอบ Robolectric ได้ที่เว็บไซต์ Android Robolectric

เป้าหมายเอาต์พุตโดยนัย

  • name.jar: ที่เก็บถาวรของ Java ของการทดสอบ
  • name-src.jar: ที่เก็บถาวรที่มีแหล่งที่มา ("jar แหล่งที่มา")
  • name_deploy.jar: ที่เก็บถาวรของการทำให้ใช้งาน Java ได้เหมาะสำหรับการทำให้ใช้งานได้ (สร้างขึ้นเมื่อมีการขออย่างชัดแจ้งเท่านั้น)

ตัวอย่าง

หากต้องการใช้ Robolectric กับ android_local_test ให้เพิ่มที่เก็บของ Robolectric ลงในไฟล์ WORKSPACE:

http_archive(
    name = "robolectric",
    urls = ["https://github.com/robolectric/robolectric/archive/<COMMIT>.tar.gz"],
    strip_prefix = "robolectric-<COMMIT>",
    sha256 = "<HASH>",
)
load("@robolectric//bazel:robolectric.bzl", "robolectric_repositories")
robolectric_repositories()
ซึ่งจะดึงกฎ 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:robolectric",
    ],
)

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

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

deps

List of labels; optional

รายการไลบรารีที่จะทดสอบ รวมถึงไลบรารีเพิ่มเติมที่จะลิงก์กับเป้าหมาย ทรัพยากร ชิ้นงาน และไฟล์ Manifest ทั้งหมดที่ประกาศในกฎของ Android เมื่อปิดชั่วคราวของแอตทริบิวต์นี้จะใช้ได้ในการทดสอบ

รายการกฎที่อนุญาตใน deps คือ android_library, aar_import, java_import, java_library และ java_lite_proto_library

srcs

List of labels; optional

รายการไฟล์ต้นฉบับที่ประมวลผลเพื่อสร้างเป้าหมาย ต้องระบุยกเว้นในกรณีพิเศษที่อธิบายไว้ด้านล่าง

ไฟล์ srcs ประเภท .java ได้รับการคอมไพล์แล้ว เพื่อให้อ่านง่ายขึ้น คุณไม่ควรใส่ชื่อของไฟล์ต้นฉบับ .java ที่สร้างขึ้นใน srcs ให้ป้อนชื่อกฎที่เกี่ยวข้องใน srcs แทน ตามที่อธิบายด้านล่าง

ไฟล์ srcs ประเภท .srcjar ถูกคลายการแพคและคอมไพล์แล้ว (ซึ่งจะเป็นประโยชน์หากต้องการสร้างชุดไฟล์ .java ที่มี Genrule หรือส่วนขยายบิลด์)

ระบบจะไม่สนใจไฟล์อื่นๆ ทั้งหมด ตราบใดที่มีไฟล์บางประเภทตามที่อธิบายไว้ข้างต้นอย่างน้อย 1 ไฟล์ มิฉะนั้นระบบจะแสดงข้อผิดพลาดขึ้นมา

ต้องระบุแอตทริบิวต์ srcs และเว้นว่างไม่ได้ เว้นแต่จะระบุ runtime_deps

custom_package

String; optional

แพ็กเกจ Java ที่จะสร้างคลาส R โดยค่าเริ่มต้น ระบบจะอนุมานแพ็กเกจจากไดเรกทอรีที่มีไฟล์ BUILD ที่มีกฎดังกล่าว หากใช้แอตทริบิวต์นี้ คุณอาจจะต้องใช้ test_class ด้วย
densities

List of strings; optional

ความหนาแน่นที่จะกรองเมื่อสร้าง APK ระบบจะเพิ่มส่วนหน้าจอที่เข้ากันได้ที่เกี่ยวข้องลงในไฟล์ Manifest ด้วยหากส่วนดังกล่าวยังไม่มี Superset StarlarkListing อยู่แล้ว
enable_data_binding

Boolean; optional; default is False

หากเป็นจริง กฎนี้ประมวลผลการอ้างอิงการเชื่อมโยงข้อมูลที่ใช้ในทรัพยากร Dependency ที่เปิดใช้การเชื่อมโยงข้อมูลซึ่งใช้โดยการทดสอบนี้ หากไม่มีการตั้งค่านี้ ทรัพยากร Dependency ที่เชื่อมโยงกับข้อมูลจะไม่สร้างโค้ดระดับไบนารีที่จำเป็น และอาจทำให้บิลด์ล้มเหลว
javacopts

List of strings; optional

ตัวเลือกคอมไพเลอร์เพิ่มเติมสำหรับไลบรารีนี้ ขึ้นอยู่กับการแทนที่ "สร้างตัวแปร" และการแปลงข้อมูลเป็นโทเค็นของ Bourne shell

ระบบจะส่งตัวเลือกคอมไพเลอร์เหล่านี้ไปยัง javac หลังจากตัวเลือกคอมไพเลอร์ส่วนกลาง

jvm_flags

List of strings; optional

รายการแฟล็กที่จะฝังในสคริปต์ Wrapper ที่สร้างขึ้นสำหรับการเรียกใช้ไบนารีนี้ ขึ้นอยู่กับการแทนที่ $(location) และ "MakeVariable" และการแปลงข้อมูลเป็นโทเค็นของ Bourne shell

สคริปต์ Wrapper สำหรับไบนารีของ Java มีคําจํากัดความ CLASSPATH (เพื่อค้นหา Jars ที่ขึ้นต่อกันทั้งหมด) และเรียกใช้อินเทอร์พรีเตอร์ Java ที่ถูกต้อง บรรทัดคำสั่งที่สร้างโดยสคริปต์ Wrapper จะมีชื่อของคลาสหลักตามด้วย "$@" เพื่อให้คุณส่งผ่านอาร์กิวเมนต์อื่นๆ หลังชื่อคลาสได้ อย่างไรก็ตาม คุณต้องระบุอาร์กิวเมนต์ที่มีไว้สำหรับการแยกวิเคราะห์โดย JVM ก่อนชื่อคลาสในบรรทัดคำสั่ง เนื้อหาของ jvm_flags จะเพิ่มไปยังสคริปต์ Wrapper ก่อนที่ชื่อคลาสจะแสดง

โปรดทราบว่าแอตทริบิวต์นี้ไม่มีผลกับเอาต์พุต *_deploy.jar

manifest

Label; optional

ชื่อของไฟล์ Android Manifest ตามปกติคือ AndroidManifest.xml ต้องระบุหากมีการกำหนด resource_files หรือ Asset หรือไฟล์ Manifest ใดๆ จากไลบรารีภายใต้การทดสอบมีแท็ก minSdkVersion อยู่ในนั้น
manifest_values

Dictionary: String -> String; optional

พจนานุกรมของค่าที่ต้องลบล้างในไฟล์ Manifest ระบบจะแทนที่อินสแตนซ์ทั้งหมดของ ${name} ในไฟล์ Manifest ด้วยค่าที่ตรงกับชื่อในพจนานุกรมนี้ applicationId, versionCode, versionName, minSdkVersion, targetSdkVersion และ maxSdkVersion จะลบล้างแอตทริบิวต์ที่เกี่ยวข้องของไฟล์ Manifest และแท็ก Use-sdk ด้วย ระบบจะละเว้น packageName และจะตั้งค่าจาก applicationId หากระบุไว้หรือแพ็กเกจในไฟล์ Manifest คุณไม่จำเป็นต้องมีไฟล์ Manifest ในกฎเพื่อใช้ manifest_values
nocompress_extensions

List of strings; optional

รายการนามสกุลไฟล์ที่ต้องปล่อยไว้โดยไม่บีบอัดใน APK ทรัพยากร
plugins

List of labels; optional

ปลั๊กอินของคอมไพเลอร์ Java ที่จะเรียกใช้ในเวลาคอมไพล์ java_plugin ทั้งหมดที่ระบุในแอตทริบิวต์นี้จะทำงานเมื่อมีการสร้างกฎนี้ ไลบรารีอาจรับค่าปลั๊กอินจากทรัพยากร Dependency ที่ใช้ exported_plugins ด้วย ทรัพยากรที่ปลั๊กอินสร้างขึ้นจะรวมอยู่ใน Jar ที่เป็นผลลัพธ์ของกฎนี้
resource_configuration_filters

List of strings; optional

รายการตัวกรองการกำหนดค่าทรัพยากร เช่น "en" ที่จะจำกัดทรัพยากรใน apk ให้มีเพียงทรัพยากรในการกำหนดค่า "en" เท่านั้น
resource_jars

List of labels; optional

เลิกใช้งานแล้ว: ใช้ java_import และ deps หรือ session_deps แทน
resource_strip_prefix

String; optional

คำนำหน้าเส้นทางที่จะตัดจากทรัพยากร Java

หากระบุไว้ ระบบจะตัดคำนำหน้าเส้นทางออกจากทุกไฟล์ในแอตทริบิวต์ resources เกิดข้อผิดพลาดที่ไฟล์ทรัพยากรไม่อยู่ในไดเรกทอรีนี้ หากไม่ได้ระบุไว้ (ค่าเริ่มต้น) ระบบจะกำหนดเส้นทางของไฟล์ทรัพยากรตามตรรกะเดียวกันกับแพ็กเกจ Java ของไฟล์ต้นฉบับ เช่น ไฟล์ต้นฉบับที่ stuff/java/foo/bar/a.txt จะอยู่ที่ foo/bar/a.txt

runtime_deps

List of labels; optional

ไลบรารีให้พร้อมใช้งานสำหรับไบนารีสุดท้ายหรือทดสอบที่รันไทม์เท่านั้น คลาสพาธของรันไทม์เหมือนกับ deps ทั่วไป แต่จะไม่ปรากฏในคลาสพาธของเวลาคอมไพล์ ไม่เหมือนกับ deps ทรัพยากร Dependency ที่จำเป็นเฉพาะรันไทม์ควรแสดงรายการที่นี่ เครื่องมือวิเคราะห์การขึ้นต่อกันควรไม่สนใจเป้าหมายที่ปรากฏในทั้ง runtime_deps และ deps
stamp

Integer; optional; default is 0

จะเข้ารหัสข้อมูลของบิลด์ลงในไบนารีหรือไม่ ค่าที่เป็นไปได้มีดังนี้
  • stamp = 1: ประทับข้อมูลบิลด์ลงในไบนารีเสมอ แม้กระทั่งในบิลด์ --nostamp ควรหลีกเลี่ยงการตั้งค่านี้ เนื่องจากอาจกำจัดการแคชระยะไกลสำหรับไบนารีและการดำเนินการดาวน์สตรีมที่ต้องใช้การตั้งค่าดังกล่าว
  • stamp = 0: แทนที่ข้อมูลของบิลด์ด้วยค่าคงที่เสมอ ซึ่งทำให้มีการแคชผลลัพธ์ของบิลด์ที่ดี
  • stamp = -1: การฝังข้อมูลของบิลด์จะควบคุมโดยแฟล็ก --[no]stamp

ระบบจะไม่สร้างไบนารีที่ประทับตราขึ้นมาใหม่เว้นแต่มีการเปลี่ยนแปลงทรัพยากร Dependency

test_class

String; optional

คลาส Java ที่ตัวดำเนินการโหลดจะโหลด

แอตทริบิวต์นี้ระบุชื่อของคลาส Java ที่จะเรียกใช้โดยการทดสอบนี้ ไม่ค่อยต้องตั้งค่า หากละเว้นอาร์กิวเมนต์นี้ ระบบจะใช้คลาส Java ที่มีชื่อสอดคล้องกับ name ของกฎ android_local_test นี้ คลาสการทดสอบต้องมีคำอธิบายประกอบด้วย org.junit.runner.RunWith

use_launcher

Boolean; optional; default is True

ไบนารีควรใช้ Launcher ที่กำหนดเองหรือไม่

หากตั้งค่าแอตทริบิวต์นี้เป็น "เท็จ" ระบบจะละเว้นแอตทริบิวต์ Launcher และแฟล็ก --java_launcher ที่เกี่ยวข้องสำหรับเป้าหมายนี้

android_device

android_device(name, cache, compatible_with, default_properties, deprecation, distribs, exec_compatible_with, exec_properties, features, horizontal_resolution, licenses, platform_apks, ram, restricted_to, screen_density, system_image, tags, target_compatible_with, testonly, vertical_resolution, visibility, vm_heap)

กฎนี้สร้างโปรแกรมจำลอง Android ที่กำหนดค่าด้วยข้อกำหนดเฉพาะที่ระบุ โปรแกรมจำลองนี้อาจเริ่มต้นผ่านคำสั่งเรียกใช้เบซาลหรือโดยการเรียกใช้สคริปต์ที่สร้างโดยตรง ขอแนะนำให้ใช้กฎ android_device ที่มีอยู่แทนการกำหนดของตัวเอง

กฎนี้เหมาะสำหรับการตั้งค่าแฟล็ก --run_under เป็นการทดสอบแบบเบเซลและ 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: เริ่มต้นโปรแกรมจำลองด้วยหน้าจอแสดงผล ถ้า true (ค่าเริ่มต้นเป็น false)
  • --action: เริ่มหรือฆ่า
  • --apks_to_install: รายการ apk ที่จะติดตั้งในโปรแกรมจำลอง

อาร์กิวเมนต์

Attributes
name

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

cache

Integer; required

ขนาดเป็นเมกะไบต์ของพาร์ติชันแคชของโปรแกรมจำลอง ค่าต่ำสุดคือ 16 เมกะไบต์
default_properties

Label; optional

ไฟล์พร็อพเพอร์ตี้เดียวที่จะวางใน /default.prop ในโปรแกรมจำลอง ซึ่งจะช่วยให้ผู้เขียนกฎกำหนดค่าโปรแกรมจำลองให้เหมือนอุปกรณ์จริงมากขึ้น (โดยเฉพาะอย่างยิ่งการควบคุมสตริง UserAgent และการทำงานอื่นๆ ที่อาจทำให้แอปพลิเคชันหรือเซิร์ฟเวอร์ทำงานแตกต่างจากอุปกรณ์บางเครื่อง) พร็อพเพอร์ตี้ในไฟล์นี้จะลบล้างพร็อพเพอร์ตี้แบบอ่านอย่างเดียวที่โปรแกรมจำลองจะตั้งค่าไว้ เช่น ro.product.model
horizontal_resolution

Integer; required

ความละเอียดหน้าจอแนวนอนในหน่วยพิกเซลเพื่อจำลอง ค่าต่ำสุดคือ 240
platform_apks

List of labels; optional

รายการ APK ที่จะติดตั้งในอุปกรณ์เมื่อเปิดเครื่อง
ram

Integer; required

จำนวน RAM ในหน่วยเมกะไบต์ที่จะจำลองสำหรับอุปกรณ์ การดำเนินการนี้มีผลกับทั้งอุปกรณ์ ไม่ใช่เฉพาะแอปใดแอปหนึ่งที่ติดตั้งในอุปกรณ์ ค่าต่ำสุดคือ 64 เมกะไบต์
screen_density

Integer; required

ความหนาแน่นของหน้าจอจำลองในหน่วยพิกเซลต่อนิ้ว ค่าต่ำสุดของค่านี้คือ 30 ppi
system_image

Label; required

กลุ่มไฟล์ที่มีไฟล์ต่อไปนี้
  • system.img: พาร์ติชันระบบ
  • kernel-qemu: เคอร์เนลของ Linux ที่โปรแกรมจำลองจะโหลด
  • ramdisk.img: อิมเมจเริ่มต้นที่จะใช้เมื่อเปิดเครื่อง
  • userdata.img: พาร์ติชันข้อมูลผู้ใช้เริ่มต้น
  • source.properties: ไฟล์พร็อพเพอร์ตี้ที่มีข้อมูลเกี่ยวกับรูปภาพต่างๆ
ไฟล์เหล่านี้เป็นส่วนหนึ่งของ Android SDK หรือให้บริการโดยบุคคลที่สาม (เช่น Intel มีรูปภาพ x86)
vertical_resolution

Integer; required

ความละเอียดหน้าจอแนวตั้งเป็นพิกเซลที่จะจำลอง ค่าต่ำสุดคือ 240
vm_heap

Integer; required

ขนาดในหน่วยเมกะไบต์ของฮีปเครื่องเสมือนที่ Android จะใช้ในแต่ละกระบวนการ ค่าต่ำสุดคือ 16 เมกะไบต์

android_ndk_repository

android_ndk_repository(name, api_level, path, repo_mapping)

กำหนดค่า Bazel ให้ใช้ Android NDK เพื่อรองรับการสร้างเป้าหมาย Android ด้วยโค้ดแบบเนทีฟ

โปรดทราบว่าการสร้างแอปสำหรับ Android จำเป็นต้องมีกฎ android_sdk_repository ในไฟล์ WORKSPACE ด้วย

สำหรับข้อมูลเพิ่มเติม โปรดอ่าน เอกสารฉบับเต็มเกี่ยวกับการใช้ Android NDK กับ Bazel

ตัวอย่าง

android_ndk_repository(
    name = "androidndk",
)

ตัวอย่างข้างต้นจะระบุ Android NDK จาก $ANDROID_NDK_HOME และตรวจหาระดับ API สูงสุดที่รองรับ

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

ตัวอย่างข้างต้นจะใช้ Android NDK ที่อยู่ในพื้นที่ทำงานของคุณใน ./android-ndk-r20 โดยจะใช้ไลบรารี API ระดับ 24 เมื่อคอมไพล์โค้ด JNI

CPU

Android NDK มีไลบรารี CPU ของฟีเจอร์ ซึ่งใช้ในการตรวจหา 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

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

api_level

Integer; optional; nonconfigurable; default is 0

ระดับ API ของ Android สำหรับสร้างเสริม หากไม่ระบุ ระบบจะใช้ระดับ API สูงสุดที่ติดตั้ง
path

String; optional; nonconfigurable

เส้นทางสัมบูรณ์หรือสัมพัทธ์ไปยัง Android NDK ต้องตั้งค่าแอตทริบิวต์นี้หรือตัวแปรสภาพแวดล้อม $ANDROID_NDK_HOME

คุณดาวน์โหลด Android NDK ได้จากเว็บไซต์ของนักพัฒนาซอฟต์แวร์ Android

repo_mapping

Dictionary: String -> String; optional

พจนานุกรมจากชื่อที่เก็บในเครื่องไปจนถึงชื่อที่เก็บส่วนกลาง การดำเนินการนี้จะช่วยให้ควบคุมความละเอียดของทรัพยากร Dependency ของพื้นที่ทำงานสำหรับทรัพยากร Dependency ของที่เก็บนี้ได้

ตัวอย่างเช่น รายการ "@foo": "@bar" ประกาศว่าเมื่อที่เก็บนี้ต้องพึ่งพา "@foo" (เช่น ทรัพยากร Dependency ใน "@foo//some:target") ทุกครั้งที่ที่เก็บดังกล่าวควรแก้ไขทรัพยากร Dependency ดังกล่าวภายใน "@bar" ("@bar//some:target") ที่ประกาศทั่วโลก

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 ซึ่งมีรูปแบบเป็น @androidsdk//${group}:${artifact}-${version} ตัวอย่างต่อไปนี้แสดงให้เห็นว่า android_library จะใช้ไลบรารี 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

Name; required

ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้

api_level

Integer; optional; nonconfigurable; default is 0

ระดับ API ของ Android ที่จะสร้างขึ้นโดยค่าเริ่มต้น หากไม่ระบุ ระบบจะใช้ระดับ API สูงสุดที่ติดตั้ง

ระดับ API ที่ใช้สำหรับบิลด์หนึ่งๆ อาจลบล้างได้ด้วยแฟล็ก android_sdk android_sdk_repository สร้างเป้าหมาย android_sdk สำหรับ API แต่ละระดับที่ติดตั้งใน SDK ด้วยชื่อ @androidsdk//:sdk-${level} ไม่ว่าจะระบุแอตทริบิวต์นี้หรือไม่ก็ตาม เช่น หากต้องการสร้างเทียบกับระดับ API ที่ไม่ใช่ค่าเริ่มต้น: bazel build --android_sdk=@androidsdk//:sdk-19 //java/com/example:app

หากต้องการดูเป้าหมาย android_sdk ทั้งหมดที่สร้างโดย android_sdk_repository คุณสามารถเรียกใช้ bazel query "kind(android_sdk, @androidsdk//...)"

build_tools_version

String; optional; nonconfigurable

เวอร์ชันของเครื่องมือสร้าง Android ที่จะใช้จากภายใน SDK ของ Android หากไม่ได้ระบุไว้ ระบบจะใช้เครื่องมือสร้างเวอร์ชันล่าสุดที่ติดตั้งไว้

Bazel ต้องใช้เครื่องมือสร้างเวอร์ชัน 30.0.0 ขึ้นไป

path

String; optional; nonconfigurable

เส้นทางสัมบูรณ์หรือสัมพัทธ์ไปยัง Android SDK ต้องตั้งค่าแอตทริบิวต์นี้หรือตัวแปรสภาพแวดล้อม $ANDROID_HOME

ดาวน์โหลด Android SDK ได้จากเว็บไซต์นักพัฒนาแอป Android

repo_mapping

Dictionary: String -> String; optional

พจนานุกรมจากชื่อที่เก็บในเครื่องไปจนถึงชื่อที่เก็บส่วนกลาง การดำเนินการนี้จะช่วยให้ควบคุมความละเอียดของทรัพยากร Dependency ของพื้นที่ทำงานสำหรับทรัพยากร Dependency ของที่เก็บนี้ได้

ตัวอย่างเช่น รายการ "@foo": "@bar" ประกาศว่าเมื่อที่เก็บนี้ต้องพึ่งพา "@foo" (เช่น ทรัพยากร Dependency ใน "@foo//some:target") ทุกครั้งที่ที่เก็บดังกล่าวควรแก้ไขทรัพยากร Dependency ดังกล่าวภายใน "@bar" ("@bar//some:target") ที่ประกาศทั่วโลก