กฎ 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 แบบทำให้ใช้งานได้จะมีคลาสทั้งหมดที่ classloader ที่ค้นหาคลาสพาธรันไทม์ของเป้าหมายนี้ ตั้งแต่ต้นจนจบ

  • 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 ของ ต้นบาเซล

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

Attributes
name

Name; required

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

deps

List of labels; optional

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

List of labels; optional

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

คอมไพล์ไฟล์ประเภท .java แล้ว srcs ไฟล์ เพื่อให้อ่านง่าย คุณไม่ควรใส่ชื่อของ สร้างไฟล์ต้นฉบับ .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

ทำการ Crawl ไฟล์ PNG (หรือไม่) ซึ่งจะเป็นอิสระจากการประมวลผล 9 แพตช์ ซึ่งมักจะเป็น เสร็จสิ้น นี่คือวิธีแก้ปัญหาที่เลิกใช้งานสำหรับ aapt Bug ที่มี ได้รับการแก้ไขแล้วใน 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

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

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

dexopts

List of strings; optional

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

Boolean; optional; default is False

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

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

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

Integer; optional; nonconfigurable; default is -1

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

Label; optional

เป้าหมาย android_binary สำหรับการวัด

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

javacopts

List of strings; optional

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

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

key_rotation_min_sdk

String; optional

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

Label; optional

ไฟล์ข้อความจะมีรายการชื่อไฟล์คลาส คลาสที่กำหนดโดยไฟล์คลาสเหล่านั้นคือ วางไว้ใน Classroom หลัก e.g.:
          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

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

Dictionary: String -> String; optional

พจนานุกรมค่าที่จะถูกลบล้างในไฟล์ Manifest ทุกอินสแตนซ์ของ ${name} ใน ระบบจะแทนที่ไฟล์ Manifest ด้วยค่าที่สอดคล้องกับชื่อในพจนานุกรมนี้ applicationId, versionCode, versionName, minSdkVersion, targetSdkVersion และ maxSdkVersion จะลบล้างแอตทริบิวต์ที่เกี่ยวข้องของไฟล์ Manifest และ ใช้แท็ก SDK ระบบจะไม่สนใจแพ็กเกจName และจะตั้งค่าจาก 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 ที่ระบุไว้ใน แอตทริบิวต์ปลั๊กอินจะทำงานเมื่อใดก็ตามที่ เป้าหมายนี้สร้างขึ้น ทรัพยากรที่สร้างโดย ปลั๊กอินจะรวมอยู่ใน jar ผลลัพธ์ของ เป้าหมาย
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 คือ ที่ระบุ ไฟล์นี้จะแสดงการแมประหว่างไฟล์ต้นฉบับและ ชื่อคลาส เมธอด และช่องที่ปรับให้ยากต่อการอ่าน (Obfuscate)

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

proguard_specs

List of labels; optional

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

List of strings; optional

รายการตัวกรองการกำหนดค่าทรัพยากร เช่น "en" ที่จะจำกัดทรัพยากรในส่วน apk ไปยังเฉพาะรายการใน "en" การกำหนดค่า หากต้องการเปิดใช้ Pseudolocalization ให้ใส่โอเปอเรเตอร์ 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 โดยค่าเริ่มต้น
  • การนำทรัพยากรรหัสที่ไม่ได้ใช้ออกรองรับเฉพาะ aapt2
หากเปิดใช้การย่อทรัพยากร name_files/resource_shrinker.log ขึ้นด้วย โดยอธิบายรายละเอียดการวิเคราะห์และการลบที่ดำเนินการ

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

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

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: ที่เก็บถาวรที่มี แหล่งที่มา ("โหลที่มา")
  • name.aar: Android "aar" แพ็กเกจที่มีที่เก็บถาวรสำหรับ Java และทรัพยากรของเป้าหมายนี้ โดยไม่มีการปิดทางอ้อม

ตัวอย่าง

ดูตัวอย่างกฎของ Android ได้ในไดเรกทอรี examples/android ของ ต้นบาเซล

ตัวอย่างต่อไปนี้จะแสดง วิธีตั้งค่า idl_import_root อนุญาตให้ //java/bazel/helloandroid/BUILD มีสิ่งต่อไปนี้

android_library(
    name = "parcelable",
    srcs = ["MyParcelable.java"], # bazel.helloandroid.MyParcelable

    # MyParcelable.aidl will be used as import for other .aidl
    # files that depend on it, but will not be compiled.
    idl_parcelables = ["MyParcelable.aidl"] # bazel.helloandroid.MyParcelable

    # We don't need to specify idl_import_root since the aidl file
    # which declares bazel.helloandroid.MyParcelable
    # is present at java/bazel/helloandroid/MyParcelable.aidl
    # underneath a java root (java/).
)

android_library(
    name = "foreign_parcelable",
    srcs = ["src/android/helloandroid/OtherParcelable.java"], # android.helloandroid.OtherParcelable
    idl_parcelables = [
        "src/android/helloandroid/OtherParcelable.aidl" # android.helloandroid.OtherParcelable
    ],

    # We need to specify idl_import_root because the aidl file which
    # declares android.helloandroid.OtherParcelable is not positioned
    # at android/helloandroid/OtherParcelable.aidl under a normal java root.
    # Setting idl_import_root to "src" in //java/bazel/helloandroid
    # adds java/bazel/helloandroid/src to the list of roots
    # the aidl compiler will search for imported types.
    idl_import_root = "src",
)

# Here, OtherInterface.aidl has an "import android.helloandroid.CallbackInterface;" statement.
android_library(
    name = "foreign_interface",
    idl_srcs = [
        "src/android/helloandroid/OtherInterface.aidl" # android.helloandroid.OtherInterface
        "src/android/helloandroid/CallbackInterface.aidl" # android.helloandroid.CallbackInterface
    ],

    # As above, idl_srcs which are not correctly positioned under a java root
    # must have idl_import_root set. Otherwise, OtherInterface (or any other
    # interface in a library which depends on this one) will not be able
    # to find CallbackInterface when it is imported.
    idl_import_root = "src",
)

# MyParcelable.aidl is imported by MyInterface.aidl, so the generated
# MyInterface.java requires MyParcelable.class at compile time.
# Depending on :parcelable ensures that aidl compilation of MyInterface.aidl
# specifies the correct import roots and can access MyParcelable.aidl, and
# makes MyParcelable.class available to Java compilation of MyInterface.java
# as usual.
android_library(
    name = "idl",
    idl_srcs = ["MyInterface.aidl"],
    deps = [":parcelable"],
)

# Here, ServiceParcelable uses and thus depends on ParcelableService,
# when it's compiled, but ParcelableService also uses ServiceParcelable,
# which creates a circular dependency.
# As a result, these files must be compiled together, in the same android_library.
android_library(
    name = "circular_dependencies",
    srcs = ["ServiceParcelable.java"],
    idl_srcs = ["ParcelableService.aidl"],
    idl_parcelables = ["ServiceParcelable.aidl"],
)

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

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 ที่ จะถูกประมวลผลเพื่อสร้างเป้าหมาย

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

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

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

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 ทั้งหมดที่ขึ้นต่อกันชั่วคราว เนื่องจากทรัพยากร 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 แหล่งข้อมูลที่รวมอยู่ในไลบรารีนี้

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

เมื่อระบุ 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 ควรเป็น

ไฟล์จะต้องวางอย่างเหมาะสมเพื่อให้คอมไพเลอร์ความช่วยเหลือค้นพบไฟล์ ดูคำอธิบายของ 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 ที่อาศัยไลบรารีนี้โดยตรง หรือผ่านการปิดแบบทางอ้อม

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

javacopts

List of strings; optional

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

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

manifest

Label; optional

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

Boolean; optional; default is False

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

List of labels; optional

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

List of labels; optional

ไฟล์ที่จะใช้เป็นข้อกำหนดของ Proguard ข้อมูลเหล่านี้จะอธิบายชุดข้อกำหนดที่ Proguard จะใช้ หากระบุไว้ ระบบจะเพิ่มกลุ่มเป้าหมายเหล่านั้นลงในเป้าหมาย android_binary ใดก็ตามโดยขึ้นอยู่กับไลบรารีนี้ ไฟล์ที่รวมอยู่ในที่นี้ต้องมีเฉพาะกฎที่เป็นเอกลักษณ์เท่านั้น ได้แก่ -dontnote, -dontwarn, จะถือว่าไม่ส่งผล และกฎที่ขึ้นต้นด้วย -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 ที่อยู่ระหว่างการทดสอบผ่าน 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

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 กฎภายในเครื่อง (ตรงข้ามกับอุปกรณ์) วิธีนี้ทำงานร่วมกับเฟรมเวิร์กการทดสอบ Robolectric ของ Android ดูรายละเอียดในเว็บไซต์ Android Robolectric การเขียนบทการทดสอบโรโมเลคตริกซ์

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

  • name.jar: ที่เก็บถาวรสำหรับ Java ของการทดสอบ
  • name-src.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 ที่จำเป็นสำหรับโรโปเลกตริกต์ กฎ 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

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

คอมไพล์ไฟล์ประเภท .java แล้ว srcs ไฟล์ เพื่อให้อ่านง่าย คุณไม่ควรใส่ชื่อของ สร้างไฟล์ต้นฉบับ .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 การเชื่อมโยงข้อมูลไม่มีการสร้างโค้ดระดับไบนารีที่จำเป็น และอาจทำให้บิลด์ล้มเหลว
javacopts

List of strings; optional

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

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

jvm_flags

List of strings; optional

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

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

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

manifest

Label; optional

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

Dictionary: String -> String; optional

พจนานุกรมค่าที่จะถูกลบล้างในไฟล์ Manifest ทุกอินสแตนซ์ของ ${name} ใน ระบบจะแทนที่ไฟล์ Manifest ด้วยค่าที่สอดคล้องกับชื่อในพจนานุกรมนี้ applicationId versionCode versionName minSdkVersion, targetSdkVersion และ maxSdkVersion จะลบล้างแอตทริบิวต์ที่เกี่ยวข้องด้วย ของไฟล์ Manifest และ ใช้แท็ก 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 หรือรันไทม์_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

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

Integer; optional; default is 0

ระบุว่าจะเข้ารหัสข้อมูลบิลด์ลงในไบนารีหรือไม่ ค่าที่เป็นไปได้มีดังนี้
  • stamp = 1: ประทับตราข้อมูลบิลด์ลงในไบนารีเสมอ แม้ใน --nostamp บิลด์ ควรหลีกเลี่ยงการตั้งค่า เนื่องจากอาจทำให้การแคชระยะไกลหยุดทำงาน ไบนารีและการดำเนินการดาวน์สตรีมที่ใช้
  • stamp = 0: แทนที่ข้อมูลบิลด์ด้วยค่าคงที่เสมอ ช่วงเวลานี้ จะให้การแคชผลลัพธ์ของบิลด์ที่ดี
  • stamp = -1: การฝังข้อมูลบิลด์ควบคุมโดย Flag --[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 ที่กำหนดค่าด้วย โปรแกรมจำลองนี้อาจเริ่มต้นจากการเรียกใช้ Bazel หรือเรียกใช้สคริปต์ที่สร้างขึ้นโดยตรง ขอแนะนำให้พึ่ง กับกฎ android_device ที่มีอยู่ แทนการกำหนดของคุณเอง

กฎนี้เป็นเป้าหมายที่เหมาะสําหรับ Flag --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

กฎนี้จะสร้างรูปภาพและสคริปต์เริ่มต้น คุณเริ่มโปรแกรมจำลองได้ ในเครื่องโดยเรียกใช้ :nexus_s --action=start สคริปต์จะแสดง ค่าสถานะต่อไปนี้

  • --adb_port: พอร์ตที่แสดง adb หากคุณต้องการออก adb ไปยังโปรแกรมจำลอง นี่คือพอร์ตที่คุณจะออกการเชื่อมต่อ adb เป็น
  • --emulator_port: พอร์ตที่แสดงการจัดการ telnet ของโปรแกรมจำลอง คอนโซลผู้ดูแลระบบ
  • --enable_display: เริ่มต้นโปรแกรมจำลองด้วยจอแสดงผลหากเป็น true (ค่าเริ่มต้น) เป็น "เท็จ")
  • --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: ไฟล์พร็อพเพอร์ตี้ที่มีข้อมูลเกี่ยวกับพร็อพเพอร์ตี้ รูปภาพ
ไฟล์เหล่านี้เป็นส่วนหนึ่งของ SDK ของ Android หรือให้บริการโดยบุคคลที่สาม (สำหรับ ตัวอย่างที่ 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 ของอุปกรณ์ขณะรันไทม์ได้ ตัวอย่างต่อไปนี้จะแสดงวิธีการใช้ CPU พร้อม 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 ของที่เก็บนี้

ตัวอย่างเช่น รายการ "@foo": "@bar" จะประกาศว่า ที่เก็บขึ้นอยู่กับ "@foo" (เช่น ทรัพยากร Dependency ของ "@foo//some:target") ซึ่งควรแก้ไขการอ้างอิงนั้นภายใน "@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 จะใช้ API ของ Android ระดับสูงสุด และสร้างเวอร์ชันเครื่องมือที่ติดตั้งใน 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" ชุดไลบรารี Android ทั่วไปที่มีเวอร์ชันต่างๆ เช่น ไลบรารี Support และ AppCompat ที่จัดแพ็กเกจเป็นที่เก็บ Maven ในเครื่อง android_sdk_repository สร้าง Bazel เป้าหมายสำหรับแต่ละไลบรารีเหล่านี้ที่สามารถใช้ในทรัพยากร Dependency ของ เป้าหมาย android_binary และ android_library

ชื่อของเป้าหมายที่สร้างขึ้นได้มาจากพิกัด Maven ของไลบรารีใน ที่เก็บการสนับสนุนของ Android ในรูปแบบ @androidsdk//${group}:${artifact}-${version} ตัวอย่างต่อไปนี้แสดงให้เห็นว่า android_library จะใช้เวอร์ชัน 25.0.0 ของ ไลบรารี Appcompat v7

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 สูงสุด ที่ติดตั้งแล้ว

android_sdk ลบล้างระดับ API ที่ใช้สำหรับบิลด์หนึ่งๆ ได้ แจ้ง android_sdk_repository สร้างเป้าหมาย android_sdk สำหรับ ระดับ API แต่ละระดับที่ติดตั้งใน SDK ด้วยชื่อ @androidsdk//:sdk-${level} มีการระบุแอตทริบิวต์นี้หรือไม่ ตัวอย่างเช่น ในการสร้างด้วย API ที่ไม่ใช่ 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 ที่จะใช้จากภายใน Android SDK หากไม่ได้ระบุ จะใช้เครื่องมือสร้างเวอร์ชันล่าสุดที่ติดตั้ง

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

path

String; optional; nonconfigurable

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

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

repo_mapping

Dictionary: String -> String; optional

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

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