กฎ
- 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 ที่ลงนามด้วยคีย์แก้ไขข้อบกพร่องและ จัดแนวไฟล์ ZIP ซึ่งสามารถใช้ในการพัฒนาและแก้ไขข้อบกพร่องของแอปพลิเคชันได้ คุณไม่สามารถเผยแพร่แอปพลิเคชันเมื่อลงนามด้วยคีย์แก้ไขข้อบกพร่องname_unsigned.apk
: ไฟล์ข้างต้นเวอร์ชันที่ไม่ได้ลงนามซึ่งสามารถลงนามด้วยคีย์รุ่นก่อนที่จะเผยแพร่ต่อสาธารณะname_deploy.jar
: ที่เก็บถาวร Java ที่มี Closure แบบทรานซิทีฟของเป้าหมายนี้JAR ที่ใช้ติดตั้งประกอบด้วยคลาสทั้งหมดที่ Class Loader จะพบเมื่อค้นหา Classpath รันไทม์ของเป้าหมายนี้ตั้งแต่ต้นจนจบ
name_proguard.jar
: ไฟล์เก็บถาวร Java ที่มีผลการเรียกใช้ ProGuard ในname_deploy.jar
ระบบจะสร้างเอาต์พุตนี้เฉพาะในกรณีที่ระบุแอตทริบิวต์ proguard_specsname_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
|
จำนวนเต็ม ไม่สามารถกำหนดค่าได้ ค่าเริ่มต้นคือ |
instruments
|
ป้ายกํากับ ค่าเริ่มต้นคือ เป้าหมาย หากตั้งค่าแอตทริบิวต์นี้ ระบบจะถือว่า |
javacopts
|
รายการสตริง ค่าเริ่มต้นคือ ระบบจะส่งตัวเลือกคอมไพเลอร์เหล่านี้ไปยัง javac หลังจากตัวเลือกคอมไพเลอร์ส่วนกลาง |
key_rotation_min_sdk
|
สตริง ค่าเริ่มต้นคือ |
main_dex_list
|
ป้ายกํากับ ค่าเริ่มต้นคือ android/support/multidex/MultiDex$V19.class android/support/multidex/MultiDex.class android/support/multidex/MultiDexApplication.class com/google/common/base/Objects.class multidex="manual_main_dex"
|
main_dex_list_opts
|
รายการสตริง ค่าเริ่มต้นคือ |
main_dex_proguard_specs
|
รายการป้ายกํากับ ค่าเริ่มต้นคือ multidex เป็น legacy
|
manifest
|
ป้ายกำกับ (ต้องระบุ) ชื่อไฟล์ Manifest ของ Android ซึ่งปกติจะเป็นAndroidManifest.xml
ต้องกําหนดหากมีการกําหนด resource_files หรือ assets
|
manifest_values
|
พจนานุกรม: สตริง -> สตริง ค่าเริ่มต้นคือ
ระบบจะแทนที่อินสแตนซ์
ระบบจะไม่สนใจ
เมื่อตั้งค่า |
multidex
|
สตริง ค่าเริ่มต้นคือ ค่าที่เป็นไปได้มีดังนี้
|
nocompress_extensions
|
รายการสตริง ค่าเริ่มต้นคือ |
package_id
|
จํานวนเต็ม ค่าเริ่มต้นคือ ดูข้อมูลเพิ่มเติมได้ที่อาร์กิวเมนต์ |
plugins
|
รายการป้ายกํากับ ค่าเริ่มต้นคือ java_plugin ทั้งหมดที่ระบุไว้ในแอตทริบิวต์ปลั๊กอินทุกครั้งที่สร้างเป้าหมายนี้ ทรัพยากรที่ปลั๊กอินสร้างขึ้นจะรวมอยู่ในไฟล์ jar ผลลัพธ์ของเป้าหมาย
|
proguard_apply_dictionary
|
ป้ายกํากับ ค่าเริ่มต้นคือ |
proguard_apply_mapping
|
ป้ายกํากับ ค่าเริ่มต้นคือ proguard_generate_mapping สร้างขึ้นเพื่อใช้ซ้ำเพื่อใช้การแมปเดียวกันกับบิลด์ใหม่
|
proguard_generate_mapping
|
บูลีน ไม่สามารถกําหนดค่าได้ ค่าเริ่มต้นคือ proguard_specs เท่านั้น ไฟล์นี้จะแสดงการแมประหว่างชื่อคลาส เมธอด และช่องของต้นฉบับกับชื่อที่สร้างความสับสน
คำเตือน: หากใช้แอตทริบิวต์นี้ ข้อกำหนดของ Proguard ไม่ควรมี |
proguard_specs
|
รายการป้ายกํากับ ค่าเริ่มต้นคือ |
resource_configuration_filters
|
รายการสตริง ค่าเริ่มต้นคือ en_XA และ/หรือ ar_XB
|
resource_files
|
รายการป้ายกํากับ ค่าเริ่มต้นคือ glob ของไฟล์ทั้งหมดในไดเรกทอรี res
ไฟล์ที่สร้างขึ้น (จาก genrules) อ้างอิงได้ด้วยป้ายกํากับที่นี่เช่นกัน ข้อจำกัดเพียงอย่างเดียวคือเอาต์พุตที่สร้างขึ้นต้องอยู่ในไดเรกทอรี " res " เดียวกันกับไฟล์ทรัพยากรอื่นๆ ที่รวมอยู่ด้วย
|
shrink_resources
|
จํานวนเต็ม ค่าเริ่มต้นคือ manifest และ resource_files ) และต้องอาศัย ProGuard
โดยทำงานในลักษณะเดียวกับเครื่องมือบีบอัดทรัพยากรของ Gradle ส่วนใหญ่ (https://developer.android.com/studio/build/shrink-code.html#shrink-resources)
ความแตกต่างที่เห็นได้ชัด
name_files/resource_shrinker.log
ด้วย ซึ่งจะแสดงรายละเอียดการวิเคราะห์และการลบที่ดำเนินการ
ค่าที่เป็นไปได้มีดังนี้
|
aar_import
ดูแหล่งที่มาของกฎaar_import(name, deps, data, aar, compatible_with, deprecation, distribs, exec_compatible_with, exec_properties, exports, features, licenses, restricted_to, srcjar, tags, target_compatible_with, testonly, visibility)
กฎนี้อนุญาตให้ใช้ไฟล์ .aar
เป็นไลบรารีสําหรับกฎ android_library
และ android_binary
ตัวอย่าง
aar_import( name = "google-vr-sdk", aar = "gvr-android-sdk/libraries/sdk-common-1.10.0.aar", ) android_binary( name = "app", manifest = "AndroidManifest.xml", srcs = glob(["**.java"]), deps = [":google-vr-sdk"], )
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
aar
|
ป้ายกำกับ (ต้องระบุ) ไฟล์.aar ที่จะส่งไปยังเป้าหมาย Android ที่ใช้เป้าหมายนี้
|
exports
|
รายการป้ายกํากับ ค่าเริ่มต้นคือ |
srcjar
|
ป้ายกํากับ ค่าเริ่มต้นคือ |
android_library
ดูแหล่งที่มาของกฎandroid_library(name, deps, srcs, data, assets, assets_dir, compatible_with, custom_package, deprecation, distribs, enable_data_binding, exec_compatible_with, exec_properties, exported_plugins, exports, exports_manifest, features, idl_import_root, idl_parcelables, idl_preprocessed, idl_srcs, javacopts, licenses, manifest, neverlink, plugins, proguard_specs, resource_files, restricted_to, tags, target_compatible_with, testonly, visibility)
กฎนี้จะคอมไพล์และเก็บแหล่งที่มาไว้ในไฟล์ .jar
ระบบจะใส่ไลบรารีรันไทม์ Android android.jar
ไว้ในเส้นทางคลาสการคอมไพล์โดยปริยาย
เป้าหมายเอาต์พุตโดยนัย
libname.jar
: ที่เก็บ Javalibname-src.jar
: ไฟล์เก็บถาวรที่มีแหล่งที่มา ("ไฟล์ jar ของแหล่งที่มา")name.aar
: แพ็กเกจ "aar" ของ Android ที่มีไฟล์เก็บถาวร Java และทรัพยากรของเป้าหมายนี้ แต่ไม่รวมการปิดเชิงสื่อกลาง
ตัวอย่าง
ดูตัวอย่างกฎ Android ได้ในไดเรกทอรี examples/android
ของต้นไม้ซอร์สโค้ด Bazel
ตัวอย่างต่อไปนี้แสดงวิธีตั้งค่า idl_import_root
อนุญาตให้ //java/bazel/helloandroid/BUILD
มีข้อมูลต่อไปนี้
android_library( name = "parcelable", srcs = ["MyParcelable.java"], # bazel.helloandroid.MyParcelable # MyParcelable.aidl will be used as import for other .aidl # files that depend on it, but will not be compiled. idl_parcelables = ["MyParcelable.aidl"] # bazel.helloandroid.MyParcelable # We don't need to specify idl_import_root since the aidl file # which declares bazel.helloandroid.MyParcelable # is present at java/bazel/helloandroid/MyParcelable.aidl # underneath a java root (java/). ) android_library( name = "foreign_parcelable", srcs = ["src/android/helloandroid/OtherParcelable.java"], # android.helloandroid.OtherParcelable idl_parcelables = [ "src/android/helloandroid/OtherParcelable.aidl" # android.helloandroid.OtherParcelable ], # We need to specify idl_import_root because the aidl file which # declares android.helloandroid.OtherParcelable is not positioned # at android/helloandroid/OtherParcelable.aidl under a normal java root. # Setting idl_import_root to "src" in //java/bazel/helloandroid # adds java/bazel/helloandroid/src to the list of roots # the aidl compiler will search for imported types. idl_import_root = "src", ) # Here, OtherInterface.aidl has an "import android.helloandroid.CallbackInterface;" statement. android_library( name = "foreign_interface", idl_srcs = [ "src/android/helloandroid/OtherInterface.aidl" # android.helloandroid.OtherInterface "src/android/helloandroid/CallbackInterface.aidl" # android.helloandroid.CallbackInterface ], # As above, idl_srcs which are not correctly positioned under a java root # must have idl_import_root set. Otherwise, OtherInterface (or any other # interface in a library which depends on this one) will not be able # to find CallbackInterface when it is imported. idl_import_root = "src", ) # MyParcelable.aidl is imported by MyInterface.aidl, so the generated # MyInterface.java requires MyParcelable.class at compile time. # Depending on :parcelable ensures that aidl compilation of MyInterface.aidl # specifies the correct import roots and can access MyParcelable.aidl, and # makes MyParcelable.class available to Java compilation of MyInterface.java # as usual. android_library( name = "idl", idl_srcs = ["MyInterface.aidl"], deps = [":parcelable"], ) # Here, ServiceParcelable uses and thus depends on ParcelableService, # when it's compiled, but ParcelableService also uses ServiceParcelable, # which creates a circular dependency. # As a result, these files must be compiled together, in the same android_library. android_library( name = "circular_dependencies", srcs = ["ServiceParcelable.java"], idl_srcs = ["ParcelableService.aidl"], idl_parcelables = ["ServiceParcelable.aidl"], )
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
deps
|
รายการป้ายกํากับ ค่าเริ่มต้นคือ android_library ,
java_library ที่มีข้อจำกัด android และ
cc_library การรวมหรือสร้างไลบรารีเนทีฟ .so
สำหรับแพลตฟอร์มเป้าหมาย Android
|
srcs
|
รายการป้ายกํากับ ค่าเริ่มต้นคือ .java หรือ .srcjar ที่ประมวลผลเพื่อสร้างเป้าหมาย
คอมไพล์ไฟล์ ระบบจะแตกไฟล์ หากไม่ใส่ |
assets
|
รายการป้ายกํากับ ค่าเริ่มต้นคือ glob ของไฟล์ทั้งหมดในไดเรกทอรี assets นอกจากนี้ คุณยังอ้างอิงกฎอื่นๆ (กฎที่สร้างไฟล์) หรือไฟล์ที่ส่งออกในแพ็กเกจอื่นๆ ได้ด้วย ตราบใดที่ไฟล์ทั้งหมดอยู่ภายใต้ไดเรกทอรี assets_dir ในแพ็กเกจที่เกี่ยวข้อง
|
assets_dir
|
สตริง ค่าเริ่มต้นคือ assets
คู่ assets และ assets_dir จะอธิบายเนื้อหาที่แพ็กเกจไว้ และคุณควรระบุแอตทริบิวต์ทั้ง 2 รายการหรือจะระบุหรือไม่ก็ได้
|
custom_package
|
สตริง ค่าเริ่มต้นคือ |
enable_data_binding
|
บูลีน ค่าเริ่มต้นคือ หากต้องการสร้างแอป Android ด้วยการเชื่อมโยงข้อมูล คุณต้องทําดังนี้ด้วย
|
exported_plugins
|
รายการป้ายกํากับ ค่าเริ่มต้นคือ java_plugin (เช่น โปรแกรมประมวลผลคำอธิบายประกอบ) เพื่อส่งออกไปยังไลบรารีที่ขึ้นต่อกันกับไลบรารีนี้โดยตรง
รายการ |
exports
|
รายการป้ายกํากับ ค่าเริ่มต้นคือ exports จะถือว่าเป็นการพึ่งพาโดยตรงของกฎที่ขึ้นอยู่กับเป้าหมายที่มี exports โดยตรง
|
exports_manifest
|
จํานวนเต็ม ค่าเริ่มต้นคือ android_binary ที่ขึ้นอยู่กับเป้าหมายนี้ ระบบจะไม่ส่งออกแอตทริบิวต์ uses-permissions
|
idl_import_root
|
สตริง ค่าเริ่มต้นคือ ระบบจะใช้เส้นทางนี้เป็นรูทการนําเข้าเมื่อประมวลผลแหล่งที่มา idl ที่ขึ้นอยู่กับไลบรารีนี้ เมื่อระบุ ดู ตัวอย่าง |
idl_parcelables
|
รายการป้ายกํากับ ค่าเริ่มต้นคือ android_library ใดก็ตามที่ขึ้นอยู่กับไลบรารีนี้โดยตรงหรือผ่าน Closure แบบโอนไม่ได้ แต่จะไม่มีการแปลเป็น Java หรือคอมไพล์
ควรรวมเฉพาะไฟล์ ไฟล์เหล่านี้ต้องอยู่ในตำแหน่งที่เหมาะสมเพื่อให้คอมไพเลอร์ aidl พบ ดูข้อมูลเกี่ยวกับความหมายของค่านี้ได้จากคำอธิบายของ idl_import_root |
idl_preprocessed
|
รายการป้ายกํากับ ค่าเริ่มต้นคือ android_library ใดก็ตามที่ขึ้นอยู่กับไลบรารีนี้โดยตรงหรือผ่าน Closure แบบโอนไม่ได้ แต่จะไม่มีการแปลเป็น Java หรือคอมไพล์
ควรรวมเฉพาะไฟล์ |
idl_srcs
|
รายการป้ายกํากับ ค่าเริ่มต้นคือ srcs
ไฟล์เหล่านี้จะพร้อมใช้งานสำหรับการนําเข้าสําหรับ ไฟล์เหล่านี้ต้องอยู่ในตำแหน่งที่เหมาะสมเพื่อให้คอมไพเลอร์ aidl พบ ดูข้อมูลเกี่ยวกับความหมายของค่านี้ได้จากคำอธิบายของ idl_import_root |
javacopts
|
รายการสตริง ค่าเริ่มต้นคือ ระบบจะส่งตัวเลือกคอมไพเลอร์เหล่านี้ไปยัง javac หลังจากตัวเลือกคอมไพเลอร์ส่วนกลาง |
manifest
|
ป้ายกํากับ ค่าเริ่มต้นคือ AndroidManifest.xml
ต้องกําหนดหากมีการกําหนด resource_files หรือ assets
|
neverlink
|
บูลีน ค่าเริ่มต้นคือ neverlink ในการสร้าง .apk มีประโยชน์ในกรณีที่สภาพแวดล้อมรันไทม์จะจัดหาไลบรารีระหว่างการดำเนินการ
|
plugins
|
รายการป้ายกํากับ ค่าเริ่มต้นคือ java_plugin ทั้งหมดที่ระบุไว้ในแอตทริบิวต์ปลั๊กอินทุกครั้งที่สร้างเป้าหมายนี้ ทรัพยากรที่ปลั๊กอินสร้างขึ้นจะรวมอยู่ในไฟล์ jar ผลลัพธ์ของเป้าหมาย
|
proguard_specs
|
รายการป้ายกํากับ ค่าเริ่มต้นคือ android_binary ใดก็ได้โดยขึ้นอยู่กับคลังนี้
ไฟล์ที่รวมอยู่ที่นี่ต้องมีกฎแบบ idempotent เท่านั้น ได้แก่ -dontnote, -dontwarn, assumenosideeffects และกฎที่ขึ้นต้นด้วย -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)
กฎนี้มีไว้สําหรับการทดสอบ 1 หน่วยของกฎ android_library
ในเครื่อง (ไม่ใช่ในอุปกรณ์)
โดยทำงานร่วมกับเฟรมเวิร์กการทดสอบ Robolectric ของ Android
ดูรายละเอียดเกี่ยวกับการเขียนการทดสอบ Robolectric ได้ที่เว็บไซต์ Android Robolectric
เป้าหมายเอาต์พุตโดยนัย
name.jar
: ที่เก็บ Java ของการทดสอบname-src.jar
: ไฟล์เก็บถาวรที่มีแหล่งที่มา ("ไฟล์ jar ของแหล่งที่มา")name_deploy.jar
: ไฟล์เก็บถาวรสำหรับติดตั้งใช้งาน Java ที่เหมาะสมสําหรับการติดตั้งใช้งาน (จะสร้างขึ้นก็ต่อเมื่อมีการขออย่างชัดแจ้งเท่านั้น)
ตัวอย่าง
หากต้องการใช้ Robolectric กับ android_local_test
ให้เพิ่มที่เก็บข้อมูลของ Robolectric ลงในไฟล์ WORKSPACE
ดังนี้
http_archive( name = "robolectric", urls = ["https://github.com/robolectric/robolectric-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 หรือ assets หรือหากไฟล์ Manifest จากไลบรารีที่ทดสอบมีแท็ก minSdkVersion
|
manifest_values
|
พจนานุกรม: สตริง -> สตริง ค่าเริ่มต้นคือ applicationId , versionCode , versionName ,
minSdkVersion , targetSdkVersion และ
maxSdkVersion จะลบล้างแอตทริบิวต์ที่เกี่ยวข้องของไฟล์ Manifest และแท็ก uses-sdk ด้วย ระบบจะไม่สนใจ packageName และจะตั้งค่าจาก applicationId หากระบุไว้ หรือจากแพ็กเกจในไฟล์ Manifest
คุณไม่จำเป็นต้องมีไฟล์ Manifest ในกฎเพื่อใช้ manifest_values
|
nocompress_extensions
|
รายการสตริง ค่าเริ่มต้นคือ |
plugins
|
รายการป้ายกํากับ ค่าเริ่มต้นคือ java_plugin ทั้งหมดที่ระบุในแอตทริบิวต์นี้จะทำงานทุกครั้งที่สร้างกฎนี้ ไลบรารียังรับช่วงปลั๊กอินจาก Dependency ที่ใช้ exported_plugins ได้ด้วย ทรัพยากรที่ปลั๊กอินสร้างขึ้นจะรวมอยู่ในไฟล์ jar ของกฎนี้
|
resource_configuration_filters
|
รายการสตริง ค่าเริ่มต้นคือ |
resource_jars
|
รายการป้ายกํากับ ค่าเริ่มต้นคือ |
resource_strip_prefix
|
สตริง ค่าเริ่มต้นคือ
หากระบุไว้ ระบบจะนำคำนำหน้าเส้นทางนี้ออกจากทุกไฟล์ในแอตทริบิวต์ |
runtime_deps
|
รายการป้ายกํากับ ค่าเริ่มต้นคือ deps ทั่วไป รายการเหล่านี้จะปรากฏใน classpath รันไทม์ แต่จะไม่ปรากฏใน classpath ขณะคอมไพล์ รายการต่อไปนี้ควรระบุไว้สำหรับทรัพยากร Dependencies ที่จำเป็นเฉพาะในรันไทม์ เครื่องมือวิเคราะห์ Dependency ควรละเว้นเป้าหมายที่ปรากฏทั้งใน runtime_deps และ deps
|
stamp
|
จํานวนเต็ม ค่าเริ่มต้นคือ
ระบบจะไม่สร้างไฟล์ไบนารีที่มีตราประทับอีกครั้ง เว้นแต่จะมีการเปลี่ยนแปลงทรัพยากร Dependency |
test_class
|
สตริง ค่าเริ่มต้นคือ
แอตทริบิวต์นี้ระบุชื่อคลาส Java ที่การทดสอบนี้จะเรียกใช้ คุณไม่จำเป็นต้องตั้งค่านี้บ่อยนัก หากไม่ใส่อาร์กิวเมนต์นี้ ระบบจะใช้คลาส Java ที่มีชื่อตรงกับ |
use_launcher
|
บูลีน ค่าเริ่มต้นคือ หากตั้งค่าแอตทริบิวต์นี้เป็น "เท็จ" ระบบจะละเว้นแอตทริบิวต์ launcher และ Flag |
android_device
ดูแหล่งที่มาของกฎandroid_device(name, cache, compatible_with, default_properties, deprecation, distribs, exec_compatible_with, exec_properties, features, horizontal_resolution, licenses, platform_apks, ram, restricted_to, screen_density, system_image, tags, target_compatible_with, testonly, vertical_resolution, visibility, vm_heap)
กฎนี้จะสร้างโปรแกรมจำลอง Android ที่กําหนดค่าตามข้อกําหนด คุณอาจเริ่มโปรแกรมจำลองนี้ผ่านคำสั่ง bazel run หรือเรียกใช้สคริปต์ที่สร้างขึ้นโดยตรง เราขอแนะนำให้ใช้กฎ android_device ที่มีอยู่แทนการกำหนดกฎของคุณเอง
กฎนี้เป็นเป้าหมายที่เหมาะสมสำหรับ 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
กฎนี้จะสร้างรูปภาพและสคริปต์เริ่มต้น คุณเริ่มโปรแกรมจำลองในเครื่องได้โดยการเรียกใช้ bazel run :nexus_s -- --action=start สคริปต์จะแสดง Flag ต่อไปนี้
- --adb_port: พอร์ตที่จะแสดง adb หากต้องการออกคำสั่ง adb ไปยังโปรแกรมจำลอง คุณจะต้องออกคำสั่ง adb connect ไปยังพอร์ตนี้
- --emulator_port: พอร์ตที่จะแสดงคอนโซลการจัดการ Telnet ของโปรแกรมจำลอง
- --enable_display: เริ่มโปรแกรมจำลองด้วยจอแสดงผลหากเป็นจริง (ค่าเริ่มต้นเป็นเท็จ)
- --action: start หรือ kill
- --apks_to_install: รายการ apk ที่จะติดตั้งในโปรแกรมจำลอง
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
cache
|
จำนวนเต็ม ต้องระบุ ขนาดพาร์ติชันแคชของโปรแกรมจำลองเป็นเมกะไบต์ ค่าต่ำสุดคือ 16 เมกะไบต์ |
default_properties
|
ป้ายกํากับ ค่าเริ่มต้นคือ |
horizontal_resolution
|
จำนวนเต็ม ต้องระบุ ความละเอียดของหน้าจอแนวนอนเป็นพิกเซลที่จะจําลอง ค่าต่ำสุดคือ 240 |
platform_apks
|
รายการป้ายกํากับ ค่าเริ่มต้นคือ |
ram
|
จำนวนเต็ม ต้องระบุ จำนวน RAM เป็นเมกะไบต์ที่จะจําลองสําหรับอุปกรณ์ ซึ่งมีผลกับทั้งอุปกรณ์ ไม่ใช่แค่แอปที่ติดตั้งในอุปกรณ์ ค่าต่ำสุดคือ 64 เมกะไบต์ |
screen_density
|
จำนวนเต็ม ต้องระบุ ความหนาแน่นของหน้าจอจำลองเป็นพิกเซลต่อนิ้ว ค่าต่ำสุดคือ 30 ppi |
system_image
|
ป้ายกำกับ (ต้องระบุ) กลุ่มไฟล์ที่มีไฟล์ต่อไปนี้
|
vertical_resolution
|
จำนวนเต็ม ต้องระบุ ความละเอียดของหน้าจอแนวตั้งเป็นพิกเซลที่จะจําลอง ค่าต่ำสุดคือ 240 |
vm_heap
|
จำนวนเต็ม ต้องระบุ ขนาดของกองขยะเครื่องเสมือน (เมกะไบต์) ที่ Android จะใช้สำหรับแต่ละกระบวนการ ค่าต่ำสุดคือ 16 เมกะไบต์ |
android_ndk_repository
ดูแหล่งที่มาของกฎandroid_ndk_repository(name, api_level, path, repo_mapping)
กําหนดค่า Bazel ให้ใช้ Android NDK เพื่อรองรับการสร้างเป้าหมาย Android ด้วยโค้ดเนทีฟ
โปรดทราบว่าการใช้งาน android_ndk_repository
นี้จะแทนที่ด้วยการใช้งานใน Starlark เราจะรองรับ NDK เวอร์ชันในอนาคต ซึ่งรวมถึงเวอร์ชัน 25 ขึ้นไปใน android_ndk_repository
เวอร์ชัน Starlark ดูเวอร์ชัน Starlark ได้ที่ rules_android_ndk
โปรดทราบว่าการสร้างสำหรับ Android ต้องใช้กฎ android_sdk_repository
ในไฟล์ WORKSPACE
ด้วย
อ่านข้อมูลเพิ่มเติมได้ที่ เอกสารประกอบฉบับเต็มเกี่ยวกับการใช้ Android NDK กับ Bazel
ตัวอย่าง
android_ndk_repository( name = "androidndk", )
ตัวอย่างข้างต้นจะค้นหา Android NDK จาก $ANDROID_NDK_HOME
และตรวจหาระดับ API สูงสุดที่รองรับ
android_ndk_repository( name = "androidndk", path = "./android-ndk-r20", api_level = 24, )
ตัวอย่างข้างต้นจะใช้ Android NDK ที่อยู่ในพื้นที่ทํางานใน ./android-ndk-r20
เครื่องมือนี้จะใช้ไลบรารี API ระดับ 24 เมื่อคอมไพล์โค้ด JNI
cpufeatures
Android NDK มีไลบรารี cpufeatures ซึ่งสามารถใช้ตรวจหา CPU ของอุปกรณ์ขณะรันไทม์ ตัวอย่างต่อไปนี้แสดงวิธีใช้ cpufeatures กับ Bazel
# jni.cc #include "ndk/sources/android/cpufeatures/cpu-features.h" ...
# BUILD cc_library( name = "jni", srcs = ["jni.cc"], deps = ["@androidndk//:cpufeatures"], )
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
api_level
|
จำนวนเต็ม ไม่สามารถกำหนดค่าได้ ค่าเริ่มต้นคือ |
path
|
สตริง ไม่สามารถกําหนดค่าได้ ค่าเริ่มต้นคือ $ANDROID_NDK_HOME
คุณดาวน์โหลด Android NDK ได้จากเว็บไซต์ของนักพัฒนาแอป Android |
repo_mapping
|
พจนานุกรม: สตริง -> สตริง ค่าเริ่มต้นคือ ตัวอย่างเช่น รายการ |
android_sdk_repository
ดูแหล่งที่มาของกฎandroid_sdk_repository(name, api_level, build_tools_version, path, repo_mapping)
กำหนดค่า Bazel ให้ใช้ Android SDK ในเครื่องเพื่อรองรับการสร้างเป้าหมาย Android
ตัวอย่าง
การตั้งค่า Android SDK สําหรับ Bazel ขั้นต่ำคือใส่กฎandroid_sdk_repository
ที่มีชื่อว่า "androidsdk" ในไฟล์ WORKSPACE
และตั้งค่าตัวแปรสภาพแวดล้อม $ANDROID_HOME
เป็นเส้นทางของ Android SDK Bazel จะใช้ Android API ระดับสูงสุดและเครื่องมือสร้างเวอร์ชันที่ติดตั้งใน Android SDK โดยค่าเริ่มต้น
android_sdk_repository( name = "androidsdk", )
คุณสามารถตั้งค่าแอตทริบิวต์ path
, api_level
และ build_tools_version
เป็นค่าที่เฉพาะเจาะจงเพื่อให้มั่นใจว่าบิลด์จะซ้ำกันได้ การสร้างจะดำเนินการไม่สำเร็จหาก Android SDK ไม่ได้ติดตั้งระดับ API หรือเครื่องมือสร้างเวอร์ชันที่ระบุไว้
android_sdk_repository( name = "androidsdk", path = "./sdk", api_level = 19, build_tools_version = "25.0.0", )
ตัวอย่างข้างต้นยังแสดงการใช้เส้นทางแบบสัมพัทธ์กับเวิร์กสเปซไปยัง Android SDK ด้วย ซึ่งจะมีประโยชน์หาก Android SDK เป็นส่วนหนึ่งของเวิร์กสเปซ Bazel (เช่น หากมีการเช็คอินไว้ในการควบคุมเวอร์ชัน)
ไลบรารีการสนับสนุน
ไลบรารีการสนับสนุนมีอยู่ในเครื่องมือจัดการ Android SDK ภายใต้ "ที่เก็บข้อมูลการสนับสนุนของ Android"
ซึ่งเป็นชุดไลบรารี Android ทั่วไปที่มีเวอร์ชัน เช่น ไลบรารี Support และ AppCompat ที่แพ็กเกจไว้เป็นที่เก็บ Maven ในพื้นที่ android_sdk_repository
จะสร้างเป้าหมาย Bazel สำหรับไลบรารีแต่ละรายการเหล่านี้ ซึ่งสามารถใช้ในข้อกำหนดของเป้าหมาย android_binary
และ android_library
ชื่อของเป้าหมายที่สร้างขึ้นจะมาจากพิกัด Maven ของไลบรารีในที่เก็บการสนับสนุน Android โดยอยู่ในรูปแบบ @androidsdk//${group}:${artifact}-${version}
ตัวอย่างต่อไปนี้แสดงวิธีที่ android_library
สามารถใช้ไลบรารี AppCompat เวอร์ชัน 25.0.0 ของ 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 |
ชื่อ ต้องระบุ ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
api_level
|
จำนวนเต็ม ไม่สามารถกำหนดค่าได้ ค่าเริ่มต้นคือ คุณสามารถลบล้างระดับ API ที่ใช้กับบิลด์หนึ่งๆ ได้ด้วย Flag หากต้องการดูเป้าหมาย |
build_tools_version
|
สตริง ไม่สามารถกําหนดค่าได้ ค่าเริ่มต้นคือ Bazel ต้องใช้เครื่องมือสร้างเวอร์ชัน 30.0.0 ขึ้นไป |
path
|
สตริง ไม่สามารถกําหนดค่าได้ ค่าเริ่มต้นคือ $ANDROID_HOME
คุณดาวน์โหลด Android SDK ได้จากเว็บไซต์ของนักพัฒนาแอป Android |
repo_mapping
|
พจนานุกรม: สตริง -> สตริง ค่าเริ่มต้นคือ ตัวอย่างเช่น รายการ |