กฎ
- 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 การทำให้ใช้งานได้มีคลาสทั้งหมดที่ตัวโหลดจะค้นพบโดยคลาสพาธซึ่งค้นหาคลาสพาธรันไทม์ของเป้าหมายนี้ตั้งแต่ต้นจนจบ
name_proguard.jar
: ที่เก็บถาวรของ Java ที่มีผลลัพธ์ของการเรียกใช้ ProGuard ในname_deploy.jar
ระบบจะสร้างเอาต์พุตนี้ก็ต่อเมื่อระบุแอตทริบิวต์ proguard_specs เท่านั้นname_proguard.map
: ผลลัพธ์ไฟล์การแมปของการเรียกใช้ ProGuard ในname_deploy.jar
ระบบจะสร้างเอาต์พุตนี้ก็ต่อเมื่อมีการระบุแอตทริบิวต์ proguard_specs และตั้งค่า proguard_generate_mapping หรือ shrink_resources
ตัวอย่าง
ดูตัวอย่างกฎ Android ได้ในไดเรกทอรี examples/android
ของโครงสร้างซอร์สของ Basl
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
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 Dex ในแอปสุดท้าย ด้วยเหตุนี้ เราจึงไม่แนะนำให้ตั้งค่านี้มากกว่า 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
|
AndroidManifest.xml
ต้องระบุหากมีการกำหนด resource_files หรือ Asset
|
manifest_values
|
|
multidex
|
ค่าที่เป็นไปได้มีดังนี้
|
nocompress_extensions
|
|
package_id
|
ดูข้อมูลเพิ่มเติมได้ในอาร์กิวเมนต์ |
plugins
|
java_plugin ทั้งหมดที่ระบุในแอตทริบิวต์ปลั๊กอินเมื่อมีการสร้างเป้าหมายนี้ ทรัพยากรที่ปลั๊กอินสร้างขึ้นจะรวมอยู่ในโหลผลลัพธ์ของเป้าหมาย
|
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
: แพ็กเกจ android "aar" ที่มีที่เก็บถาวรของ Java และทรัพยากรของเป้าหมายนี้ แต่ไม่ได้มีการปิดชั่วคราว
ตัวอย่าง
ดูตัวอย่างกฎ Android ได้ในไดเรกทอรี examples/android
ของโครงสร้างซอร์สของ Basl
ตัวอย่างต่อไปนี้แสดงวิธีการตั้งค่า idl_import_root
ให้ //java/bazel/helloandroid/BUILD
ประกอบด้วย:
android_library( name = "parcelable", srcs = ["MyParcelable.java"], # bazel.helloandroid.MyParcelable # MyParcelable.aidl will be used as import for other .aidl # files that depend on it, but will not be compiled. idl_parcelables = ["MyParcelable.aidl"] # bazel.helloandroid.MyParcelable # We don't need to specify idl_import_root since the aidl file # which declares bazel.helloandroid.MyParcelable # is present at java/bazel/helloandroid/MyParcelable.aidl # underneath a java root (java/). ) android_library( name = "foreign_parcelable", srcs = ["src/android/helloandroid/OtherParcelable.java"], # android.helloandroid.OtherParcelable idl_parcelables = [ "src/android/helloandroid/OtherParcelable.aidl" # android.helloandroid.OtherParcelable ], # We need to specify idl_import_root because the aidl file which # declares android.helloandroid.OtherParcelable is not positioned # at android/helloandroid/OtherParcelable.aidl under a normal java root. # Setting idl_import_root to "src" in //java/bazel/helloandroid # adds java/bazel/helloandroid/src to the list of roots # the aidl compiler will search for imported types. idl_import_root = "src", ) # Here, OtherInterface.aidl has an "import android.helloandroid.CallbackInterface;" statement. android_library( name = "foreign_interface", idl_srcs = [ "src/android/helloandroid/OtherInterface.aidl" # android.helloandroid.OtherInterface "src/android/helloandroid/CallbackInterface.aidl" # android.helloandroid.CallbackInterface ], # As above, idl_srcs which are not correctly positioned under a java root # must have idl_import_root set. Otherwise, OtherInterface (or any other # interface in a library which depends on this one) will not be able # to find CallbackInterface when it is imported. idl_import_root = "src", ) # MyParcelable.aidl is imported by MyInterface.aidl, so the generated # MyInterface.java requires MyParcelable.class at compile time. # Depending on :parcelable ensures that aidl compilation of MyInterface.aidl # specifies the correct import roots and can access MyParcelable.aidl, and # makes MyParcelable.class available to Java compilation of MyInterface.java # as usual. android_library( name = "idl", idl_srcs = ["MyInterface.aidl"], deps = [":parcelable"], ) # Here, ServiceParcelable uses and thus depends on ParcelableService, # when it's compiled, but ParcelableService also uses ServiceParcelable, # which creates a circular dependency. # As a result, these files must be compiled together, in the same android_library. android_library( name = "circular_dependencies", srcs = ["ServiceParcelable.java"], idl_srcs = ["ParcelableService.aidl"], idl_parcelables = ["ServiceParcelable.aidl"], )
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
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
|
ระบบจะใช้เส้นทางนี้เป็นรูทการนำเข้าเมื่อประมวลผลแหล่งที่มาของ ID ที่ขึ้นอยู่กับไลบรารีนี้ เมื่อระบุ ดู ตัวอย่าง |
idl_parcelables
|
android_library ที่ขึ้นอยู่กับไลบรารีนี้โดยตรงหรือผ่านการปิดด้วยทางอ้อม แต่จะไม่มีการแปลเป็น Java หรือคอมไพล์
ควรรวมเฉพาะไฟล์ ต้องวางไฟล์เหล่านี้อย่างเหมาะสมเพื่อให้คอมไพเลอร์ Aidl สามารถค้นหาได้ ดูข้อมูลเกี่ยวกับความหมายได้ที่คำอธิบายของ idl_import_root |
idl_preprocessed
|
android_library ที่ขึ้นอยู่กับไลบรารีนี้โดยตรงหรือผ่านการปิดด้วยทางอ้อม แต่จะไม่มีการแปลเป็น Java หรือคอมไพล์
ควรรวมเฉพาะไฟล์ |
idl_srcs
|
srcs
ไฟล์เหล่านี้จะพร้อมใช้งานเป็นการนำเข้าสำหรับเป้าหมาย ต้องวางไฟล์เหล่านี้อย่างเหมาะสมเพื่อให้คอมไพเลอร์ Aidl สามารถค้นหาได้ ดูข้อมูลเกี่ยวกับความหมายได้ที่คำอธิบายของ idl_import_root |
javacopts
|
ระบบจะส่งตัวเลือกคอมไพเลอร์เหล่านี้ไปยัง javac หลังจากตัวเลือกคอมไพเลอร์ส่วนกลาง |
manifest
|
AndroidManifest.xml
ต้องระบุหากมีการกำหนด resource_files หรือ Asset
|
neverlink
|
neverlink ในการสร้าง .apk มีประโยชน์หากสภาพแวดล้อมรันไทม์จะจัดเตรียมไลบรารีไว้ให้ระหว่างการดำเนินการ
|
plugins
|
java_plugin ทั้งหมดที่ระบุในแอตทริบิวต์ปลั๊กอินเมื่อมีการสร้างเป้าหมายนี้ ทรัพยากรที่ปลั๊กอินสร้างขึ้นจะรวมอยู่ในโหลผลลัพธ์ของเป้าหมาย
|
proguard_specs
|
android_binary ใดก็ตาม ทั้งนี้ขึ้นอยู่กับไลบรารีนี้
ไฟล์ที่ระบุไว้ที่นี่ต้องมีเฉพาะกฎแบบ ID เท่านั้น ได้แก่ -dontnote, -dontwarn,
summarynosideeffects และกฎที่ขึ้นต้นด้วย -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
ภายใต้การทดสอบผ่านแอตทริบิวต์เครื่องมือ
ตัวอย่าง
# 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 ต้องระบุเป้าหมายที่กำลังทดสอบผ่านแอตทริบิวต์ instruments
|
android_local_test
android_local_test(name, deps, srcs, data, args, compatible_with, custom_package, densities, deprecation, enable_data_binding, env, env_inherit, exec_compatible_with, exec_properties, features, flaky, javacopts, jvm_flags, licenses, local, manifest, manifest_values, nocompress_extensions, plugins, resource_configuration_filters, resource_jars, resource_strip_prefix, restricted_to, runtime_deps, shard_count, size, stamp, tags, target_compatible_with, test_class, testonly, timeout, toolchains, use_launcher, visibility)
กฎนี้มีไว้สำหรับกฎ android_library
หน่วยในการทดสอบภายในเครื่อง (แทนที่จะเป็นในอุปกรณ์)
ใช้งานได้กับเฟรมเวิร์กการทดสอบ Android Robolectric
ดูรายละเอียดเกี่ยวกับการเขียนการทดสอบ Robolectric ได้ที่เว็บไซต์ Android Robolectric
เป้าหมายเอาต์พุตโดยนัย
name.jar
: ที่เก็บถาวรของ Java ของการทดสอบname-src.jar
: ที่เก็บถาวรที่มีแหล่งที่มา ("jar แหล่งที่มา")name_deploy.jar
: ที่เก็บถาวรของการทำให้ใช้งาน Java ได้เหมาะสำหรับการทำให้ใช้งานได้ (สร้างขึ้นเมื่อมีการขออย่างชัดแจ้งเท่านั้น)
ตัวอย่าง
หากต้องการใช้ Robolectric กับ android_local_test
ให้เพิ่มที่เก็บของ Robolectric ลงในไฟล์ WORKSPACE
:
http_archive( name = "robolectric", urls = ["https://github.com/robolectric/robolectric/archive/<COMMIT>.tar.gz"], strip_prefix = "robolectric-<COMMIT>", sha256 = "<HASH>", ) load("@robolectric//bazel:robolectric.bzl", "robolectric_repositories") robolectric_repositories()ซึ่งจะดึงกฎ
maven_jar
ที่จำเป็นสำหรับ Robolectric
กฎ android_local_test
แต่ละข้อควรขึ้นอยู่กับ @robolectric//bazel:robolectric
ดูตัวอย่างด้านล่าง
android_local_test( name = "SampleTest", srcs = [ "SampleTest.java", ], manifest = "LibManifest.xml", deps = [ ":sample_test_lib", "@robolectric//bazel:robolectric", ], ) android_library( name = "sample_test_lib", srcs = [ "Lib.java", ], resource_files = glob(["res/**"]), manifest = "AndroidManifest.xml", )
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
deps
|
รายการกฎที่อนุญาตใน |
srcs
|
ไฟล์ ไฟล์ ระบบจะไม่สนใจไฟล์อื่นๆ ทั้งหมด ตราบใดที่มีไฟล์บางประเภทตามที่อธิบายไว้ข้างต้นอย่างน้อย 1 ไฟล์ มิฉะนั้นระบบจะแสดงข้อผิดพลาดขึ้นมา
ต้องระบุแอตทริบิวต์ |
custom_package
|
test_class ด้วย
|
densities
|
|
enable_data_binding
|
|
javacopts
|
ระบบจะส่งตัวเลือกคอมไพเลอร์เหล่านี้ไปยัง javac หลังจากตัวเลือกคอมไพเลอร์ส่วนกลาง |
jvm_flags
|
สคริปต์ Wrapper สำหรับไบนารีของ Java มีคําจํากัดความ CLASSPATH (เพื่อค้นหา Jars ที่ขึ้นต่อกันทั้งหมด) และเรียกใช้อินเทอร์พรีเตอร์ 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 ทั่วไป แต่จะไม่ปรากฏในคลาสพาธของเวลาคอมไพล์ ไม่เหมือนกับ 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 ที่กำหนดค่าด้วยข้อกำหนดเฉพาะที่ระบุ โปรแกรมจำลองนี้อาจเริ่มต้นผ่านคำสั่งเรียกใช้เบซาลหรือโดยการเรียกใช้สคริปต์ที่สร้างโดยตรง ขอแนะนำให้ใช้กฎ android_device ที่มีอยู่แทนการกำหนดของตัวเอง
กฎนี้เหมาะสำหรับการตั้งค่าแฟล็ก --run_under เป็นการทดสอบแบบเบเซลและ Blaze โปรแกรมจะเริ่มต้นโปรแกรมจำลอง คัดลอกเป้าหมายที่ทดสอบ/เรียกใช้ไปยังโปรแกรมจำลอง และทดสอบหรือเรียกใช้ตามความเหมาะสม
android_device
รองรับการสร้างอิมเมจ KVM หาก system_image ที่สำคัญเป็นแบบ X86 และได้รับการเพิ่มประสิทธิภาพสำหรับสถาปัตยกรรม CPU ส่วนใหญ่ของ I686 หากต้องการใช้ KVM ให้เพิ่ม tags = ['requires-kvm']
ลงในกฎ android_device
เป้าหมายเอาต์พุตโดยนัย
name_images/userdata.dat
: มีไฟล์ภาพและสแนปชอตเพื่อเริ่มโปรแกรมจำลองname_images/emulator-meta-data.pb
: มีข้อมูลต่อเนื่องที่จำเป็นในการส่งต่อไปยังโปรแกรมจำลองเพื่อรีสตาร์ท
ตัวอย่าง
ตัวอย่างต่อไปนี้แสดงวิธีการใช้ android_device
//java/android/helloandroid/BUILD
มี
android_device( name = "nexus_s", cache = 32, default_properties = "nexus_s.properties", horizontal_resolution = 480, ram = 512, screen_density = 233, system_image = ":emulator_images_android_16_x86", vertical_resolution = 800, vm_heap = 32, ) filegroup( name = "emulator_images_android_16_x86", srcs = glob(["androidsdk/system-images/android-16/**"]), )
//java/android/helloandroid/nexus_s.properties
ประกอบด้วย:
ro.product.brand=google ro.product.device=crespo ro.product.manufacturer=samsung ro.product.model=Nexus S ro.product.name=soju
กฎนี้จะสร้างอิมเมจและสคริปต์เริ่มต้น คุณเริ่มโปรแกรมจำลองในเครื่องได้โดยการเรียกใช้ bazel run :nexus_s -- --action=start สคริปต์แสดงแฟล็กต่อไปนี้
- --adb_port: พอร์ตที่จะเปิด adb หากต้องการออกคำสั่ง adb ไปยังโปรแกรมจำลอง นี่คือพอร์ตที่คุณจะออก adb connect
- --emulator_port: พอร์ตที่เปิดคอนโซลการจัดการ telnet ของโปรแกรมจำลอง
- --enable_display: เริ่มต้นโปรแกรมจำลองด้วยหน้าจอแสดงผล ถ้า true (ค่าเริ่มต้นเป็น false)
- --action: เริ่มหรือฆ่า
- --apks_to_install: รายการ apk ที่จะติดตั้งในโปรแกรมจำลอง
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
cache
|
|
default_properties
|
|
horizontal_resolution
|
|
platform_apks
|
|
ram
|
|
screen_density
|
|
system_image
|
|
vertical_resolution
|
|
vm_heap
|
|
android_ndk_repository
android_ndk_repository(name, api_level, path, repo_mapping)
กำหนดค่า Bazel ให้ใช้ Android NDK เพื่อรองรับการสร้างเป้าหมาย Android ด้วยโค้ดแบบเนทีฟ
โปรดทราบว่าการสร้างแอปสำหรับ Android จำเป็นต้องมีกฎ android_sdk_repository
ในไฟล์ WORKSPACE
ด้วย
สำหรับข้อมูลเพิ่มเติม โปรดอ่าน เอกสารฉบับเต็มเกี่ยวกับการใช้ Android NDK กับ Bazel
ตัวอย่าง
android_ndk_repository( name = "androidndk", )
ตัวอย่างข้างต้นจะระบุ Android NDK จาก $ANDROID_NDK_HOME
และตรวจหาระดับ API สูงสุดที่รองรับ
android_ndk_repository( name = "androidndk", path = "./android-ndk-r20", api_level = 24, )
ตัวอย่างข้างต้นจะใช้ Android NDK ที่อยู่ในพื้นที่ทำงานของคุณใน ./android-ndk-r20
โดยจะใช้ไลบรารี API ระดับ 24 เมื่อคอมไพล์โค้ด JNI
CPU
Android NDK มีไลบรารี CPU ของฟีเจอร์ ซึ่งใช้ในการตรวจหา CPU ของอุปกรณ์ในระหว่างรันไทม์ ตัวอย่างต่อไปนี้สาธิตวิธีใช้ cpufeatures กับ Bazel
# jni.cc #include "ndk/sources/android/cpufeatures/cpu-features.h" ...
# BUILD cc_library( name = "jni", srcs = ["jni.cc"], deps = ["@androidndk//:cpufeatures"], )
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
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 Manager เป็น "Android Support Repository"
โดยเป็นชุดไลบรารี Android ทั่วไปแบบมีเวอร์ชัน เช่น ไลบรารี Support และ AppCompat ซึ่งมีแพ็กเกจเป็นที่เก็บ Maven ในเครื่อง android_sdk_repository
สร้างเป้าหมาย Bazel สำหรับไลบรารีแต่ละรายการเหล่านี้ซึ่งใช้ในทรัพยากร Dependency ของเป้าหมาย android_binary
และ android_library
ได้
ชื่อของเป้าหมายที่สร้างขึ้นจะมาจากพิกัด Maven ของไลบรารีในที่เก็บการสนับสนุนของ Android ซึ่งมีรูปแบบเป็น @androidsdk//${group}:${artifact}-${version}
ตัวอย่างต่อไปนี้แสดงให้เห็นว่า android_library
จะใช้ไลบรารี Appcompat เวอร์ชัน 25.0.0 ได้อย่างไร
android_library( name = "lib", srcs = glob(["*.java"]), manifest = "AndroidManifest.xml", resource_files = glob(["res/**"]), deps = ["@androidsdk//com.android.support:appcompat-v7-25.0.0"], )
อาร์กิวเมนต์
Attributes | |
---|---|
name |
ชื่อที่ไม่ซ้ำกันสำหรับเป้าหมายนี้ |
api_level
|
ระดับ API ที่ใช้สำหรับบิลด์หนึ่งๆ อาจลบล้างได้ด้วยแฟล็ก หากต้องการดูเป้าหมาย |
build_tools_version
|
Bazel ต้องใช้เครื่องมือสร้างเวอร์ชัน 30.0.0 ขึ้นไป |
path
|
$ANDROID_HOME
ดาวน์โหลด Android SDK ได้จากเว็บไซต์นักพัฒนาแอป Android |
repo_mapping
|
ตัวอย่างเช่น รายการ |