กฎ
- 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 จะพบได้ ซึ่งค้นหา Classpath ของรันไทม์ของเป้าหมายนี้ ตั้งแต่ต้นจนจบ
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
|
จำนวนเต็ม ค่าเริ่มต้นคือ โปรดทราบว่าแต่ละ Shard จะส่งผลให้มี 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: ที่เก็บถาวรที่มี แหล่งที่มา ("source 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แอตทริบิวต์
ถือเป็นทรัพยากร Dependency โดยตรงของกฎใดก็ตามที่ขึ้นอยู่กับเป้าหมายที่มี exports โดยตรง
|
exports_manifest
|
จำนวนเต็ม ค่าเริ่มต้นคือ android_binaryเป้าหมาย
ที่ขึ้นอยู่กับเป้าหมายนี้หรือไม่ ระบบจะไม่ส่งออกแอตทริบิวต์ uses-permissions
|
idl_import_root
|
สตริง ค่าเริ่มต้นคือ ระบบจะใช้เส้นทางนี้เป็นรูทการนำเข้าเมื่อประมวลผลแหล่งที่มาของ IDL ที่ ขึ้นอยู่กับไลบรารีนี้ เมื่อระบุ ดู ตัวอย่าง |
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 หรือ assets
|
neverlink
|
บูลีน ค่าเริ่มต้นคือ neverlink ในการสร้าง .apk มีประโยชน์ในกรณีที่สภาพแวดล้อมรันไทม์จะจัดเตรียมไลบรารีในระหว่างการดำเนินการ
|
plugins
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ java_plugin ที่ระบุใน
แอตทริบิวต์ปลั๊กอินจะทำงานทุกครั้งที่
สร้างเป้าหมายนี้ ระบบจะรวมทรัพยากรที่ปลั๊กอินสร้างขึ้นไว้ในไฟล์ JAR ของผลลัพธ์ของเป้าหมาย
|
proguard_specs
|
รายการป้ายกำกับ ค่าเริ่มต้นคือ android_binary ใดก็ตามโดยขึ้นอยู่กับคลังนี้
ไฟล์ที่รวมไว้ที่นี่ต้องมีเฉพาะกฎที่ไม่มีผลข้างเคียง ได้แก่ -dontnote, -dontwarn,
assumenosideeffects และกฎที่ขึ้นต้นด้วย -keep ตัวเลือกอื่นๆ จะปรากฏได้เฉพาะใน
android_binaryproguard_specs เพื่อให้มั่นใจว่าการผสานจะไม่ซ้ำซ้อน
|
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: ที่เก็บถาวรที่มีแหล่งที่มา ("source 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 หรือชิ้นงาน หรือหากไฟล์ 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 ของเวลาคอมไพล์ การอ้างอิงที่จำเป็นเฉพาะในเวลาเรียกใช้ควร
แสดงไว้ที่นี่ เครื่องมือวิเคราะห์การขึ้นต่อกันควรละเว้นเป้าหมายที่ปรากฏทั้งใน
runtime_deps และ deps
|
stamp
|
จำนวนเต็ม ค่าเริ่มต้นคือ
ระบบจะไม่สร้างไบนารีที่ประทับเวลาใหม่ เว้นแต่ว่ามีการเปลี่ยนแปลงในส่วนที่ขึ้นต่อกัน |
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 run หรือโดยการเรียกใช้สคริปต์ที่สร้างขึ้นโดยตรง เราขอแนะนำให้ใช้กฎ 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 connect
- --emulator_port: พอร์ตที่จะเปิดเผยคอนโซลการจัดการ Telnet ของโปรแกรมจำลอง
- --enable_display: เริ่มโปรแกรมจำลองที่มีจอแสดงผลหากเป็นจริง (ค่าเริ่มต้น เป็นเท็จ)
- --action: Either start or 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 ขึ้นไป จะ
ได้รับการติดตั้งใช้งานใน Starlark เวอร์ชันของ android_ndk_repository ดู
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
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 Manager ในชื่อ "Android Support Repository"
ซึ่งเป็นชุดไลบรารี Android ทั่วไปที่มีการกำหนดเวอร์ชัน เช่น ไลบรารี Support และ AppCompat
ที่จัดแพ็กเกจเป็นที่เก็บ Maven ในเครื่อง android_sdk_repository จะสร้างเป้าหมาย Bazel
สำหรับไลบรารีแต่ละรายการที่ใช้ในทรัพยากร Dependency ของเป้าหมาย android_binary และ android_library ได้
ชื่อของเป้าหมายที่สร้างขึ้นมาจากพิกัด Maven ของไลบรารีใน
ที่เก็บ Android Support โดยจัดรูปแบบเป็น @androidsdk//${group}:${artifact}-${version}
ตัวอย่างต่อไปนี้แสดงวิธีที่ android_library สามารถขึ้นอยู่กับไลบรารี
v7 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
|
พจนานุกรม: สตริง -> สตริง ค่าเริ่มต้นคือ เช่น รายการ |