नियम
- 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 संग्रह है. इसमें इस टारगेट का ट्रांज़िटिव क्लोज़र शामिल होता है.डिप्लॉय जार में वे सभी क्लास शामिल होती हैं जिन्हें क्लासलोडर ढूंढ सकता है. यह क्लासलोडर, इस टारगेट के रनटाइम क्लासपाथ को शुरू से आखिर तक खोजता है.
name_proguard.jar: यह एक Java संग्रह है. इसमेंname_deploy.jarपर ProGuard चलाने का नतीजा शामिल होता है. यह आउटपुट सिर्फ़ तब जनरेट होता है, जब proguard_specs एट्रिब्यूट की वैल्यू दी गई हो.name_proguard.map: यहname_deploy.jarपर ProGuard चलाने के बाद मिली मैपिंग फ़ाइल का नतीजा है. यह आउटपुट सिर्फ़ तब जनरेट होता है, जब proguard_specs एट्रिब्यूट की वैल्यू दी गई हो और proguard_generate_mapping या shrink_resources एट्रिब्यूट की वैल्यू सेट की गई हो.
उदाहरण
Android के नियमों के उदाहरण, Bazel के सोर्स ट्री की examples/android डायरेक्ट्री में देखे जा सकते हैं.
तर्क
| विशेषताएं | |
|---|---|
name |
नाम; ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
deps
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू android_library,
java_library में android की पाबंदी है और
cc_library, Android टारगेट प्लैटफ़ॉर्म के लिए .so नेटिव लाइब्रेरी रैप या जनरेट करती हैं.
|
srcs
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू
|
assets
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू assets डायरेक्ट्री में मौजूद सभी फ़ाइलों का glob होता है. आपके पास अन्य नियमों (ऐसे नियम जिनसे फ़ाइलें बनती हैं) या अन्य पैकेज में एक्सपोर्ट की गई फ़ाइलों का रेफ़रंस देने का विकल्प भी होता है. हालांकि, यह ज़रूरी है कि वे सभी फ़ाइलें, संबंधित पैकेज में मौजूद assets_dir डायरेक्ट्री में हों.
|
assets_dir
|
स्ट्रिंग; डिफ़ॉल्ट वैल्यू assets में मौजूद फ़ाइलों का पाथ देने वाली स्ट्रिंग.
assets और assets_dir एट्रिब्यूट की जोड़ी से, पैकेज की गई ऐसेट के बारे में जानकारी मिलती है. इन दोनों एट्रिब्यूट की वैल्यू या तो एक साथ दी जानी चाहिए या इनमें से एक भी एट्रिब्यूट की वैल्यू नहीं दी जानी चाहिए.
|
crunch_png
|
बूलियन; डिफ़ॉल्ट वैल्यू |
custom_package
|
स्ट्रिंग; डिफ़ॉल्ट वैल्यू |
debug_key
|
लेबल; डिफ़ॉल्ट वैल्यू चेतावनी: प्रोडक्शन की कुंजियों का इस्तेमाल न करें. इन्हें सुरक्षित रखना चाहिए और सोर्स ट्री में नहीं रखना चाहिए. |
debug_signing_keys
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू चेतावनी: प्रोडक्शन की कुंजियों का इस्तेमाल न करें. इन्हें सुरक्षित रखना चाहिए और सोर्स ट्री में नहीं रखना चाहिए. |
debug_signing_lineage_file
|
लेबल; डिफ़ॉल्ट वैल्यू चेतावनी: प्रोडक्शन की कुंजियों का इस्तेमाल न करें. इन्हें सुरक्षित रखना चाहिए और सोर्स ट्री में नहीं रखना चाहिए. |
densities
|
स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू |
dex_shards
|
पूर्णांक; डिफ़ॉल्ट वैल्यू ध्यान दें कि हर शार्ड से, फ़ाइनल ऐप्लिकेशन में कम से कम एक डेक्स बनेगा. इस वजह से, रिलीज़ बाइनरी के लिए इसे 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
|
लेबल; ज़रूरी है Android मेनिफ़ेस्ट फ़ाइल का नाम. आम तौर पर, यहAndroidManifest.xml होता है.
अगर resource_files या assets तय की गई हैं, तो इसे तय करना ज़रूरी है.
|
manifest_values
|
डिक्शनरी: स्ट्रिंग -> स्ट्रिंग; डिफ़ॉल्ट वैल्यू
मेनिफ़ेस्ट में मौजूद
|
multidex
|
स्ट्रिंग; डिफ़ॉल्ट वैल्यू इन वैल्यू का इस्तेमाल किया जा सकता है:
|
nocompress_extensions
|
स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू |
package_id
|
पूर्णांक; डिफ़ॉल्ट वैल्यू ज़्यादा जानकारी के लिए, AAPT2 के |
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
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू res डायरेक्ट्री में मौजूद सभी फ़ाइलों का glob होता है.
जनरेट की गई फ़ाइलों (genrules से) को यहां भी Label से रेफ़रंस किया जा सकता है. इसकी सिर्फ़ एक शर्त है. जनरेट किए गए आउटपुट, " 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"],
)
तर्क
| विशेषताएं | |
|---|---|
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: यह एक Java संग्रह है.libname-src.jar: यह एक ऐसा संग्रह है जिसमें सोर्स ("सोर्स जार") शामिल होते हैं.name.aar: यह Android 'aar' बंडल है. इसमें इस टारगेट का Java संग्रह और संसाधन शामिल होते हैं. इसमें ट्रांज़िटिव क्लोज़र शामिल नहीं होता.
उदाहरण
Android के नियमों के उदाहरण, Bazel के सोर्स ट्री की examples/android डायरेक्ट्री में देखे जा सकते हैं.
यहां दिए गए उदाहरण में, idl_import_root को सेट करने का तरीका बताया गया है.
//java/bazel/helloandroid/BUILD में ये शामिल हो सकते हैं:
android_library(
name = "parcelable",
srcs = ["MyParcelable.java"], # bazel.helloandroid.MyParcelable
# MyParcelable.aidl will be used as import for other .aidl
# files that depend on it, but will not be compiled.
idl_parcelables = ["MyParcelable.aidl"] # bazel.helloandroid.MyParcelable
# We don't need to specify idl_import_root since the aidl file
# which declares bazel.helloandroid.MyParcelable
# is present at java/bazel/helloandroid/MyParcelable.aidl
# underneath a java root (java/).
)
android_library(
name = "foreign_parcelable",
srcs = ["src/android/helloandroid/OtherParcelable.java"], # android.helloandroid.OtherParcelable
idl_parcelables = [
"src/android/helloandroid/OtherParcelable.aidl" # android.helloandroid.OtherParcelable
],
# We need to specify idl_import_root because the aidl file which
# declares android.helloandroid.OtherParcelable is not positioned
# at android/helloandroid/OtherParcelable.aidl under a normal java root.
# Setting idl_import_root to "src" in //java/bazel/helloandroid
# adds java/bazel/helloandroid/src to the list of roots
# the aidl compiler will search for imported types.
idl_import_root = "src",
)
# Here, OtherInterface.aidl has an "import android.helloandroid.CallbackInterface;" statement.
android_library(
name = "foreign_interface",
idl_srcs = [
"src/android/helloandroid/OtherInterface.aidl" # android.helloandroid.OtherInterface
"src/android/helloandroid/CallbackInterface.aidl" # android.helloandroid.CallbackInterface
],
# As above, idl_srcs which are not correctly positioned under a java root
# must have idl_import_root set. Otherwise, OtherInterface (or any other
# interface in a library which depends on this one) will not be able
# to find CallbackInterface when it is imported.
idl_import_root = "src",
)
# MyParcelable.aidl is imported by MyInterface.aidl, so the generated
# MyInterface.java requires MyParcelable.class at compile time.
# Depending on :parcelable ensures that aidl compilation of MyInterface.aidl
# specifies the correct import roots and can access MyParcelable.aidl, and
# makes MyParcelable.class available to Java compilation of MyInterface.java
# as usual.
android_library(
name = "idl",
idl_srcs = ["MyInterface.aidl"],
deps = [":parcelable"],
)
# Here, ServiceParcelable uses and thus depends on ParcelableService,
# when it's compiled, but ParcelableService also uses ServiceParcelable,
# which creates a circular dependency.
# As a result, these files must be compiled together, in the same android_library.
android_library(
name = "circular_dependencies",
srcs = ["ServiceParcelable.java"],
idl_srcs = ["ParcelableService.aidl"],
idl_parcelables = ["ServiceParcelable.aidl"],
)
तर्क
| विशेषताएं | |
|---|---|
name |
नाम; ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
deps
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू android_library,
java_library में android की पाबंदी हो और
cc_library रैप या .so नेटिव लाइब्रेरी जनरेट करती हो
Android टारगेट प्लैटफ़ॉर्म के लिए.
|
srcs
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू .java या .srcjar फ़ाइलों की सूची, जिन्हें टारगेट बनाने के लिए प्रोसेस किया जाता है.
अगर |
assets
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू assets डायरेक्ट्री में मौजूद सभी फ़ाइलों का glob होता है. आपके पास अन्य नियमों (ऐसे नियम जिनसे फ़ाइलें बनती हैं) या अन्य पैकेज में एक्सपोर्ट की गई फ़ाइलों का रेफ़रंस देने का विकल्प भी होता है. हालांकि, यह ज़रूरी है कि वे सभी फ़ाइलें, संबंधित पैकेज में मौजूद assets_dir डायरेक्ट्री में हों.
|
assets_dir
|
स्ट्रिंग; डिफ़ॉल्ट वैल्यू assets में मौजूद फ़ाइलों का पाथ देने वाली स्ट्रिंग.
assets और assets_dir एट्रिब्यूट की जोड़ी से, पैकेज की गई ऐसेट के बारे में जानकारी मिलती है. इन दोनों एट्रिब्यूट की वैल्यू या तो एक साथ दी जानी चाहिए या इनमें से एक भी एट्रिब्यूट की वैल्यू नहीं दी जानी चाहिए.
|
custom_package
|
स्ट्रिंग; डिफ़ॉल्ट वैल्यू |
enable_data_binding
|
बूलियन; डिफ़ॉल्ट वैल्यू डेटा बाइंडिंग की सुविधा वाला Android ऐप्लिकेशन बनाने के लिए, आपको ये काम भी करने होंगे:
|
exported_plugins
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू java_plugin की सूची (जैसे, एनोटेशन
प्रोसेसर). इन्हें उन लाइब्रेरी में एक्सपोर्ट किया जाता है जो सीधे तौर पर इस लाइब्रेरी पर निर्भर करती हैं.
|
exports
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू exports एट्रिब्यूट के ज़रिए लागू होने वाले सभी नियमों को, ऐसे किसी भी नियम की सीधी डिपेंडेंसी माना जाता है जो exports एट्रिब्यूट वाले टारगेट पर सीधे तौर पर निर्भर करता है.
|
exports_manifest
|
पूर्णांक; डिफ़ॉल्ट वैल्यू android_binary टारगेट में मेनिफ़ेस्ट एंट्री एक्सपोर्ट करनी हैं या नहीं. uses-permissions एट्रिब्यूट कभी एक्सपोर्ट नहीं किए जाते.
|
idl_import_root
|
स्ट्रिंग; डिफ़ॉल्ट वैल्यू इस पाथ का इस्तेमाल, इंपोर्ट रूट के तौर पर किया जाएगा. ऐसा उन आईडीएल सोर्स को प्रोसेस करते समय किया जाएगा जो इस लाइब्रेरी पर निर्भर करते हैं.
उदाहरण देखें. |
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 को तब चलाया जाएगा, जब इस टारगेट को बनाया जाएगा. प्लगिन से जनरेट किए गए संसाधन, टारगेट के नतीजे वाले जार में शामिल किए जाएंगे.
|
proguard_specs
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू android_binary टारगेट में जोड़ दिया जाएगा.
यहां शामिल की गई फ़ाइलों में सिर्फ़ आइडमपोटेंट नियम होने चाहिए. जैसे, -dontnote, -dontwarn,
assumenosideeffects, और -keep से शुरू होने वाले नियम. अन्य विकल्प सिर्फ़ android_binary के proguard_specs में दिख सकते हैं, ताकि यह पक्का किया जा सके कि मर्ज किए गए विकल्प एक-दूसरे से अलग हों.
|
resource_files
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू res डायरेक्ट्री में मौजूद सभी फ़ाइलों का glob होता है.
जनरेट की गई फ़ाइलों (genrules से) को यहां भी Label से रेफ़रंस किया जा सकता है. इसकी सिर्फ़ एक शर्त है. जनरेट किए गए आउटपुट, " 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, instruments एट्रिब्यूट के ज़रिए, टेस्ट किए जा रहे android_binary ऐप्लिकेशन के बारे में बताता है.
उदाहरण
# java/com/samples/hello_world/BUILD
android_library(
name = "hello_world_lib",
srcs = ["Lib.java"],
manifest = "LibraryManifest.xml",
resource_files = glob(["res/**"]),
)
# The app under test
android_binary(
name = "hello_world_app",
manifest = "AndroidManifest.xml",
deps = [":hello_world_lib"],
)
# javatests/com/samples/hello_world/BUILD
android_library(
name = "hello_world_test_lib",
srcs = ["Tests.java"],
deps = [
"//java/com/samples/hello_world:hello_world_lib",
... # test dependencies such as Espresso and Mockito
],
)
# The test app
android_binary(
name = "hello_world_test_app",
instruments = "//java/com/samples/hello_world:hello_world_app",
manifest = "AndroidManifest.xml",
deps = [":hello_world_test_lib"],
)
android_instrumentation_test(
name = "hello_world_uiinstrumentation_tests",
target_device = ":some_target_device",
test_app = ":hello_world_test_app",
)
तर्क
| विशेषताएं | |
|---|---|
name |
नाम; ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
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 नियमों की जांच स्थानीय तौर पर की जाती है, न कि किसी डिवाइस पर.
यह Android के Robolectric टेस्टिंग फ़्रेमवर्क के साथ काम करता है.
Robolectric टेस्ट लिखने के बारे में जानकारी के लिए, Android Robolectric साइट पर जाएं.
इंप्लिसिट आउटपुट टारगेट
name.jar: टेस्ट का Java संग्रह.name-src.jar: यह एक ऐसा संग्रह है जिसमें सोर्स ("सोर्स जार") शामिल होते हैं.name_deploy.jar: डिप्लॉयमेंट के लिए सही Java डिप्लॉयमेंट आर्काइव. इसे सिर्फ़ तब बनाया जाता है, जब इसके लिए साफ़ तौर पर अनुरोध किया जाता है.
उदाहरण
android_local_test के साथ Robolectric का इस्तेमाल करने के लिए, अपनी WORKSPACE फ़ाइल में Robolectric की रिपॉज़िटरी जोड़ें:
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 नियम लागू होते हैं.
इसके बाद, हर android_local_test नियम, @robolectric//bazel:robolectric पर निर्भर होना चाहिए. नीचे उदाहरण देखें।
android_local_test(
name = "SampleTest",
srcs = [
"SampleTest.java",
],
manifest = "LibManifest.xml",
deps = [
":sample_test_lib",
"@robolectric//bazel:android-all",
],
)
android_library(
name = "sample_test_lib",
srcs = [
"Lib.java",
],
resource_files = glob(["res/**"]),
manifest = "AndroidManifest.xml",
)
तर्क
| विशेषताएं | |
|---|---|
name |
नाम; ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
deps
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू
|
srcs
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू
अगर ऊपर बताए गए फ़ाइल टाइप की कम से कम एक फ़ाइल मौजूद है, तो अन्य सभी फ़ाइलों को अनदेखा कर दिया जाता है. ऐसा न होने पर, गड़बड़ी का मैसेज दिखता है.
|
custom_package
|
स्ट्रिंग; डिफ़ॉल्ट वैल्यू test_class का भी इस्तेमाल करना पड़ सकता है.
|
densities
|
स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू |
enable_data_binding
|
बूलियन; डिफ़ॉल्ट वैल्यू |
javacopts
|
स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू कंपाइलर के इन विकल्पों को, ग्लोबल कंपाइलर के विकल्पों के बाद javac को पास किया जाता है. |
jvm_flags
|
स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू Java बाइनरी के लिए रैपर स्क्रिप्ट में CLASSPATH की परिभाषा शामिल होती है. इससे सभी डिपेंडेंट जार फ़ाइलें मिलती हैं. साथ ही, यह सही Java इंटरप्रेटर को शुरू करती है.
रैपर स्क्रिप्ट से जनरेट की गई कमांड लाइन में, मुख्य क्लास का नाम शामिल होता है. इसके बाद, ध्यान दें कि इस एट्रिब्यूट का |
manifest
|
लेबल; डिफ़ॉल्ट वैल्यू AndroidManifest.xml होता है.
अगर resource_files या ऐसेट तय की गई हैं या जांच की जा रही लाइब्रेरी के किसी भी मेनिफ़ेस्ट में minSdkVersion टैग है, तो इसे तय किया जाना चाहिए.
|
manifest_values
|
डिक्शनरी: स्ट्रिंग -> स्ट्रिंग; डिफ़ॉल्ट वैल्यू applicationId, versionCode, versionName, minSdkVersion, targetSdkVersion, और maxSdkVersion, मेनिफ़ेस्ट और uses-sdk टैग के संबंधित एट्रिब्यूट को भी बदल देंगे. packageName को अनदेखा कर दिया जाएगा. इसे applicationId से सेट किया जाएगा. अगर यह जानकारी दी गई है, तो इसे मेनिफ़ेस्ट में मौजूद पैकेज से सेट किया जाएगा.
manifest_values का इस्तेमाल करने के लिए, नियम में मेनिफ़ेस्ट होना ज़रूरी नहीं है.
|
nocompress_extensions
|
स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू |
plugins
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू java_plugin को तब चलाया जाएगा, जब यह नियम बनाया जाएगा. लाइब्रेरी को उन डिपेंडेंसी से भी प्लगिन मिल सकते हैं जो exported_plugins का इस्तेमाल करती हैं. इस नियम के नतीजे के तौर पर मिले जार में, प्लगिन से जनरेट किए गए संसाधन शामिल होंगे.
|
resource_configuration_filters
|
स्ट्रिंग की सूची; डिफ़ॉल्ट वैल्यू |
resource_jars
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू |
resource_strip_prefix
|
स्ट्रिंग; डिफ़ॉल्ट वैल्यू
अगर यह विकल्प चुना जाता है, तो इस पाथ प्रीफ़िक्स को |
runtime_deps
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू deps की तरह, ये रनटाइम क्लासपाथ पर दिखेंगे. हालांकि, उनसे अलग, ये कंपाइल-टाइम क्लासपाथ पर नहीं दिखेंगे. सिर्फ़ रनटाइम पर ज़रूरी डिपेंडेंसी यहां दी जानी चाहिए. डिपेंडेंसी का विश्लेषण करने वाले टूल को उन टारगेट को अनदेखा करना चाहिए जो 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 नियमों का इस्तेमाल करें.
यह नियम, Bazel टेस्ट और Blaze रन के लिए --run_under फ़्लैग का सही टारगेट है. यह एक एम्युलेटर शुरू करता है. साथ ही, जिस टारगेट की जांच की जा रही है/चलाया जा रहा है उसे एम्युलेटर पर कॉपी करता है. इसके बाद, टारगेट की जांच करता है या उसे ज़रूरत के हिसाब से चलाता है.
android_device, KVM इमेज बनाने की सुविधा देता है. हालांकि, इसके लिए ज़रूरी है कि system_image X86 पर आधारित हो और इसे ज़्यादा से ज़्यादा 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: यह विकल्प, एम्युलेटर के टेलनेट मैनेजमेंट कंसोल को दिखाने के लिए पोर्ट सेट करता है.
- --enable_display: अगर यह विकल्प सही है, तो डिसप्ले के साथ एम्युलेटर शुरू करता है (डिफ़ॉल्ट रूप से यह गलत होता है).
- --action: Either start or kill.
- --apks_to_install: एम्युलेटर पर इंस्टॉल किए जाने वाले APK की सूची.
तर्क
| विशेषताएं | |
|---|---|
name |
नाम; ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
cache
|
पूर्णांक; ज़रूरी है एम्युलेटर के कैश पार्टीशन का साइज़, मेगाबाइट में. इसकी कम से कम वैल्यू 16 मेगाबाइट है. |
default_properties
|
लेबल; डिफ़ॉल्ट वैल्यू |
horizontal_resolution
|
पूर्णांक; ज़रूरी है स्क्रीन का हॉरिज़ॉन्टल रिज़ॉल्यूशन, जिसे पिक्सल में दिखाया जाता है. कम से कम वैल्यू 240 होनी चाहिए. |
platform_apks
|
लेबल की सूची; डिफ़ॉल्ट वैल्यू |
ram
|
पूर्णांक; ज़रूरी है डिवाइस के लिए, मेगाबाइट में रैम की वह मात्रा जिसे इम्यूलेट करना है. यह सेटिंग पूरे डिवाइस के लिए होती है, न कि सिर्फ़ डिवाइस पर इंस्टॉल किए गए किसी ऐप्लिकेशन के लिए. कम से कम वैल्यू 64 मेगाबाइट होनी चाहिए. |
screen_density
|
पूर्णांक; ज़रूरी है पिक्सल प्रति इंच में, सिम्युलेट की गई स्क्रीन की डेंसिटी. इसकी कम से कम वैल्यू 30 पीपीआई है. |
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 में लागू किए गए वर्शन से बदला जा रहा है. एनडीके के आने वाले वर्शन के लिए सहायता, android_ndk_repository के Starlark वर्शन में लागू की जाएगी. इसमें वर्शन 25 और इसके बाद के वर्शन शामिल हैं. Starlark वर्शन के लिए, rules_android_ndk देखें.
ध्यान दें कि Android के लिए ऐप्लिकेशन बनाने के लिए, आपकी WORKSPACE फ़ाइल में android_sdk_repository नियम होना भी ज़रूरी है.
ज़्यादा जानकारी के लिए, Bazel के साथ Android NDK का इस्तेमाल करने से जुड़ा पूरा दस्तावेज़ पढ़ें.
उदाहरण
android_ndk_repository(
name = "androidndk",
)
ऊपर दिए गए उदाहरण में, आपके Android NDK को $ANDROID_NDK_HOME से खोजा जाएगा. साथ ही, यह पता लगाया जाएगा कि यह सबसे ज़्यादा किस एपीआई लेवल के साथ काम करता है.
android_ndk_repository(
name = "androidndk",
path = "./android-ndk-r20",
api_level = 24,
)
ऊपर दिए गए उदाहरण में, आपके फ़ाइल फ़ोल्डर में मौजूद Android NDK का इस्तेमाल किया जाएगा. यह ./android-ndk-r20 में मौजूद है. यह आपके JNI कोड को कंपाइल करते समय, एपीआई लेवल 24 की लाइब्रेरी का इस्तेमाल करेगा.
cpufeatures
Android NDK में cpufeatures लाइब्रेरी होती है. इसका इस्तेमाल, रनटाइम के दौरान किसी डिवाइस के सीपीयू का पता लगाने के लिए किया जा सकता है. यहां दिए गए उदाहरण में, Bazel के साथ cpufeatures का इस्तेमाल करने का तरीका बताया गया है.
# jni.cc #include "ndk/sources/android/cpufeatures/cpu-features.h" ...
# BUILD
cc_library(
name = "jni",
srcs = ["jni.cc"],
deps = ["@androidndk//:cpufeatures"],
)
तर्क
| विशेषताएं | |
|---|---|
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 टारगेट बनाए जा सकें.
उदाहरण
Bazel के लिए Android SDK सेट अप करने के लिए, आपको अपनीWORKSPACE फ़ाइल में "androidsdk" नाम का android_sdk_repository नियम रखना होगा. साथ ही, $ANDROID_HOME एनवायरमेंट वैरिएबल को अपने Android SDK के पाथ पर सेट करना होगा. Bazel, Android SDK में इंस्टॉल किए गए Android API लेवल और बिल्ड टूल के सबसे नए वर्शन का इस्तेमाल डिफ़ॉल्ट रूप से करेगा.
android_sdk_repository(
name = "androidsdk",
)
यह पक्का करने के लिए कि बिल्ड को फिर से बनाया जा सकता है, path, api_level, और build_tools_version एट्रिब्यूट को खास वैल्यू पर सेट किया जा सकता है. अगर Android SDK में, तय किया गया एपीआई लेवल या बिल्ड टूल का वर्शन इंस्टॉल नहीं है, तो बिल्ड नहीं हो पाएगा.
android_sdk_repository(
name = "androidsdk",
path = "./sdk",
api_level = 19,
build_tools_version = "25.0.0",
)
ऊपर दिए गए उदाहरण में, Android SDK के लिए वर्कस्पेस के हिसाब से पाथ का इस्तेमाल करने का तरीका भी दिखाया गया है. अगर Android SDK टूल आपके Bazel वर्कस्पेस का हिस्सा है, तो यह विकल्प काम का है. उदाहरण के लिए, अगर इसे वर्शन कंट्रोल में शामिल किया गया है.
सपोर्ट लाइब्रेरी
Support Libraries, Android SDK Manager में "Android Support Repository" के तौर पर उपलब्ध हैं.
यह Android की सामान्य लाइब्रेरी का वर्शन किया गया सेट है. जैसे, Support और AppCompat लाइब्रेरी. इसे लोकल मेवन रिपॉज़िटरी के तौर पर पैकेज किया जाता है. android_sdk_repository इन लाइब्रेरी में से हर एक के लिए Bazel टारगेट जनरेट करता है. इनका इस्तेमाल android_binary और android_library टारगेट की डिपेंडेंसी में किया जा सकता है.
जनरेट किए गए टारगेट के नाम, Android Support Repository में मौजूद लाइब्रेरी के मेवन कोऑर्डिनेट से लिए जाते हैं. इन्हें @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"],
)
तर्क
| विशेषताएं | |
|---|---|
name |
नाम; ज़रूरी है इस टारगेट के लिए यूनीक नाम. |
api_level
|
पूर्णांक; बदला नहीं जा सकता; डिफ़ॉल्ट वैल्यू किसी बिल्ड के लिए इस्तेमाल किए गए एपीआई लेवल को
|
build_tools_version
|
स्ट्रिंग; बदला नहीं जा सकता; डिफ़ॉल्ट वैल्यू Bazel के लिए, बिल्ड टूल का वर्शन 30.0.0 या इसके बाद का वर्शन ज़रूरी है. |
path
|
स्ट्रिंग; बदला नहीं जा सकता; डिफ़ॉल्ट वैल्यू $ANDROID_HOME एनवायरमेंट वैरिएबल में से किसी एक को सेट करना ज़रूरी है.
Android SDK को Android डेवलपर साइट से डाउनलोड किया जा सकता है. |
repo_mapping
|
डिक्शनरी: स्ट्रिंग -> स्ट्रिंग; डिफ़ॉल्ट वैल्यू उदाहरण के लिए, |