กฎ Android

รายงานปัญหา ดูแหล่งที่มา

กฎ

ไบนารี Android

ดูแหล่งที่มาของกฎ
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 ที่ลงนามด้วยคีย์การแก้ไขข้อบกพร่องและการซิปไลน์อาจนํามาใช้ในการพัฒนาและแก้ไขข้อบกพร่องของแอปพลิเคชันได้ คุณไม่สามารถเปิดตัวแอปพลิเคชันเมื่อลงชื่อเข้าใช้ด้วยคีย์การแก้ไขข้อบกพร่อง
  • name_unsigned.apk: ไฟล์ที่ไม่ได้ลงนามเวอร์ชันข้างต้นซึ่งลงนามด้วยคีย์รุ่นได้ก่อนที่จะเผยแพร่ต่อสาธารณะ
  • name_deploy.jar: ไฟล์เก็บถาวร Java ที่มีการปิดเป้าหมายนี้

    ขวดโหลทําให้ใช้งานได้มีคลาสทั้งหมดที่คลาสตัวโหลดจะเห็นได้

  • 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

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

แอตทริบิวต์
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

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

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

densities

List of strings; optional

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

Integer; optional; default is 1

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

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

dexopts

List of strings; optional

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

Boolean; optional; default is False

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

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

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

Integer; optional; nonconfigurable; default is -1

บังคับให้สร้างเป้าหมายโดยใช้หรือไม่ใช้การเพิ่มเพิ่มเติม ลบล้างค่าเริ่มต้น และ --incremental_dexing
instruments

Label; optional

เป้าหมาย android_binary ที่จะวัด Conversion

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

javacopts

List of strings; optional

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

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

key_rotation_min_sdk

String; optional

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

Label; optional

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

ชื่อไฟล์ Manifest ของ Android โดยปกติคือ AndroidManifest.xml ต้องกําหนดให้กับทรัพยากร Resource_files หรือชิ้นงาน
manifest_values

Dictionary: String -> String; optional

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

List of labels; optional

รายการทรัพยากรที่จะบรรจุแพ็กเกจ ซึ่งโดยปกติแล้วจะเป็น glob ของไฟล์ทั้งหมดภายใต้ไดเรกทอรี res
ไฟล์จะอ้างอิงไฟล์ที่สร้าง (จากกฎกฎ) ได้ที่นี่ ข้อจํากัดเพียงอย่างเดียวคือเอาต์พุตที่สร้างขึ้นต้องอยู่ในไดเรกทอรี "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

การนําเข้า ar

ดูแหล่งที่มาของกฎ
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"],
    )

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

แอตทริบิวต์
name

Name; required

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

aar

Label; required

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

List of labels; optional

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

Label; optional

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

คลัง Android

ดูแหล่งที่มาของกฎ
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: แพ็กเกจ "ar" ของ 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"],
)

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

แอตทริบิวต์
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 ทั้งหมดที่ใช้แอตทริบิวต์นี้ชั่วคราว เนื่องจากคอนเทนเนอร์จะรับช่วงนิพจน์การเชื่อมโยงข้อมูลของกฎผ่านการผสานทรัพยากร คุณจึงต้องสร้างการเชื่อมโยงข้อมูลเพื่อแยกวิเคราะห์นิพจน์เหล่านั้น
  2. เพิ่มรายการ deps = สําหรับไลบรารีรันไทม์การเชื่อมโยงข้อมูลไปยังเป้าหมายทั้งหมดที่กําหนดแอตทริบิวต์นี้ ตําแหน่งของคลังนี้ขึ้นอยู่กับการตั้งค่าสถานี
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_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

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

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

manifest

Label; optional

ชื่อไฟล์ Manifest ของ Android โดยปกติคือ AndroidManifest.xml ต้องกําหนดให้กับทรัพยากร Resource_files หรือชิ้นงาน

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 โดยขึ้นอยู่กับไลบรารีนี้ ไฟล์ที่รวมไว้ที่นี่ต้องมีเฉพาะกฎนิจพล เช่น -dontnote, -dontwarn,sumnoside Effects และกฎที่ขึ้นต้นด้วย -keep ตัวเลือกอื่นๆ สามารถปรากฏได้ใน proguard_spec ของ android_binary เท่านั้น เพื่อให้แน่ใจว่าการผสานรวมที่ไม่ใช่โทโพโลยี
resource_files

List of labels; optional

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

การทดสอบเครื่องมือ Android

ดูแหล่งที่มาของกฎ
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",
)

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

แอตทริบิวต์
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(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: ที่เก็บถาวรที่มีแหล่งที่มา ("โหลต้นทาง")
  • 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",
)

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

แอตทริบิวต์
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 หากยังไม่มี StarlarkListing ซูเปอร์เซ็ต
enable_data_binding

Boolean; optional; default is False

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

List of strings; optional

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

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

jvm_flags

List of strings; optional

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

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

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

manifest

Label; optional

ชื่อไฟล์ Manifest ของ Android โดยปกติคือ AndroidManifest.xml ต้องกําหนดเมื่อมีการกําหนด Resource_files หรือชิ้นงาน หรือหากไฟล์ 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 ด้วย ทรัพยากรที่ปลั๊กอินสร้างขึ้นจะรวมอยู่ในโหลโหลผลลัพธ์ของกฎนี้
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

ไลบรารีที่ต้องการทําให้ไบนารีสุดท้ายหรือทดสอบขณะรันไทม์เท่านั้น เช่นเดียวกับ 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

ดูแหล่งที่มาของกฎ
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 ที่มีอยู่แทนการกําหนดของคุณเอง

กฎนี้เป็นเป้าหมายที่เหมาะที่สุดสําหรับแฟล็ก --run_under เพื่อการทดสอบและ Bzel จะเริ่มต้นโปรแกรมจําลอง คัดลอกเป้าหมายที่กําลังทดสอบ/เรียกใช้ในโปรแกรมจําลอง และทดสอบหรือเรียกใช้ตามความเหมาะสม

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 :nexus_s -- --action=start สคริปต์จะแสดงแฟล็กต่อไปนี้

  • --adb_port: พอร์ตสําหรับแสดง adb หากต้องการออกคําสั่ง adb ให้โปรแกรมจําลอง นี่คือพอร์ตที่จะออก adb ให้เชื่อมต่อ
  • --emulator_port: พอร์ตสําหรับเปิดคอนโซลการจัดการโทรคมนาคมของ โปรแกรมจําลอง
  • --enable_display: เริ่มโปรแกรมจําลองด้วยจอแสดงผลหากเป็น "จริง" (ค่าเริ่มต้นเป็น "เท็จ")
  • --action: เริ่มหรือฆ่าก็ได้
  • --apks_to_install: รายการ APK ที่จะติดตั้งในโปรแกรมจําลอง

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

แอตทริบิวต์
name

Name; required

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

cache

Integer; required

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

Label; optional

ไฟล์พร็อพเพอร์ตี้ไฟล์เดียวเพื่อวางใน /default.pro บนโปรแกรมจําลอง ซึ่งจะช่วยให้ผู้เขียนกฎกําหนดค่าโปรแกรมจําลองให้คล้ายกับอุปกรณ์จริงได้มากขึ้น (โดยเฉพาะอย่างยิ่งการควบคุมสตริง 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.properments: ไฟล์พร็อพเพอร์ตี้ที่มีข้อมูลเกี่ยวกับรูปภาพ
ไฟล์เหล่านี้เป็นส่วนหนึ่งของ SDK ของ Android หรือให้บริการโดยบุคคลที่สาม (เช่น Intel มีรูปภาพ x86)
vertical_resolution

Integer; required

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

Integer; required

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

ที่เก็บ Android_ndk

ดูแหล่งที่มาของกฎ
android_ndk_repository(name, api_level, path, repo_mapping)

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

โปรดทราบว่าระบบจะแทนที่การติดตั้งใช้งานนี้ของ android_ndk_repository ด้วยการใช้งานใน Starlark ระบบจะใช้ NDK เวอร์ชันในอนาคต ซึ่งรวมถึงเวอร์ชัน 25 ขึ้นไปใน android_ndk_repository เวอร์ชัน Starlark ดูเวอร์ชัน lar_android_ndk สําหรับเวอร์ชัน Starlark

โปรดทราบว่าการสร้างแอปสําหรับ Android ต้องใช้กฎ android_sdk_repository ในไฟล์ WORKSPACE ของคุณด้วย

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

ตัวอย่าง

android_ndk_repository(
    name = "androidndk",
)

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

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

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

CPU

NDK สําหรับ Android มีไลบรารี 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"],
)

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

แอตทริบิวต์
name

Name; required

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

api_level

Integer; optional; nonconfigurable; default is 0

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

String; optional; nonconfigurable

เส้นทางสัมบูรณ์หรือสัมพัทธ์ไปยัง NDK ใน Android ต้องตั้งค่าแอตทริบิวต์นี้หรือตัวแปรสภาพแวดล้อม $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 เวอร์ชันที่มีเวอร์ชัน เช่น ไลบรารีการสนับสนุนและ AppCompat ซึ่งรวมอยู่ในที่เก็บ Maven ในเครื่อง android_sdk_repository สร้างเป้าหมาย Bazel สําหรับไลบรารีเหล่านี้แต่ละรายการที่สามารถใช้ในทรัพยากร Dependency ของ android_binary และเป้าหมาย android_library

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

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

แอตทริบิวต์
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 ที่ใช้งานง่ายจากภายใน Android SDK หากไม่ได้ระบุ ระบบจะใช้เครื่องมือสร้างเวอร์ชันล่าสุดที่ติดตั้ง

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") ที่ประกาศทั่วโลก