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