इस ट्यूटोरियल में Bazel का इस्तेमाल करके एक आसान Android ऐप्लिकेशन बनाने का तरीका बताया गया है.
Bazel, Android के नियमों का इस्तेमाल करके Android ऐप्लिकेशन बनाने की सुविधा देता है.
यह ट्यूटोरियल Windows, macOS, और Linux के उपयोगकर्ताओं के लिए है. इसे Bazel या Android ऐप्लिकेशन डेवलपमेंट का बेहतर अनुभव देने की ज़रूरत नहीं है. आपको इस ट्यूटोरियल में कोई Android कोड लिखने की ज़रूरत नहीं है.
आप इन चीज़ों के बारे में जानेंगे
इस ट्यूटोरियल में, ऐसा करने का तरीका बताया गया है:
- Bazel और Android Studio को इंस्टॉल करके, सैंपल प्रोजेक्ट डाउनलोड करके अपने एनवायरमेंट को सेट अप करें.
- एक Bazel Workspace सेट अप करें जिसमें ऐप्लिकेशन के लिए सोर्स कोड मौजूद हो. इसके अलावा, एक ऐसी
WORKSPACE
फ़ाइल सेट अप करें जिसमें वर्कस्पेस डायरेक्ट्री के टॉप लेवल की जानकारी दी गई हो. WORKSPACE
फ़ाइल अपडेट करें, ताकि इसमें Android SDK जैसे ज़रूरी बाहरी डिपेंडेंसी के रेफ़रंस शामिल किए जा सकें.BUILD
फ़ाइल बनाएं.- Bazel की मदद से ऐप्लिकेशन बनाएं.
- ऐप्लिकेशन को किसी Android एम्युलेटर या फ़िज़िकल डिवाइस पर डिप्लॉय करें और चलाएं.
शुरू करने से पहले
Bazel इंस्टॉल करें
ट्यूटोरियल शुरू करने से पहले, नीचे दिया गया सॉफ़्टवेयर इंस्टॉल करें:
- बेज़ल. इंस्टॉल करने के लिए, इंस्टॉलेशन से जुड़े निर्देशों का पालन करें.
- Android Studio. इंस्टॉल करने के लिए, Android Studio डाउनलोड करने का तरीका अपनाएं. SDK डाउनलोड करने और अपने परिवेश को कॉन्फ़िगर करने के लिए सेटअप विज़ार्ड लागू करें.
- (ज़रूरी नहीं) Git. Android ऐप्लिकेशन प्रोजेक्ट डाउनलोड करने के लिए,
git
का इस्तेमाल करें.
सैंपल प्रोजेक्ट पाएं
सैंपल प्रोजेक्ट के लिए, Bazel के उदाहरणों के डेटा स्टोर करने की जगह में किसी बुनियादी Android ऐप्लिकेशन प्रोजेक्ट का इस्तेमाल करें.
इस ऐप्लिकेशन में सिर्फ़ एक बटन है, जिस पर क्लिक करने के बाद, वेलकम मैसेज प्रिंट होता है:
पहला डायग्राम. Android ऐप्लिकेशन बटन वेलकम मैसेज.
git
के साथ रिपॉज़िटरी का क्लोन बनाएं (या ZIP फ़ाइल को सीधे डाउनलोड करें):
git clone https://github.com/bazelbuild/examples
इस ट्यूटोरियल का सैंपल प्रोजेक्ट examples/android/tutorial
में है. बाकी ट्यूटोरियल के लिए, आप इस डायरेक्ट्री में निर्देश पूरा करेंगे.
सोर्स फ़ाइलों की समीक्षा करें
ऐप्लिकेशन के लिए सोर्स फ़ाइलों पर एक नज़र डालें.
.
├── README.md
└── src
└── main
├── AndroidManifest.xml
└── java
└── com
└── example
└── bazel
├── AndroidManifest.xml
├── Greeter.java
├── MainActivity.java
└── res
├── layout
│ └── activity_main.xml
└── values
├── colors.xml
└── strings.xml
मुख्य फ़ाइलें और डायरेक्ट्री ये हैं:
नाम | जगह की जानकारी |
---|---|
Android मेनिफ़ेस्ट फ़ाइलें | src/main/AndroidManifest.xml और src/main/java/com/example/bazel/AndroidManifest.xml |
Android सोर्स फ़ाइलें | src/main/java/com/example/bazel/MainActivity.java और Greeter.java |
रिसॉर्स फ़ाइल की डायरेक्ट्री | src/main/java/com/example/bazel/res/ |
Bazel की मदद से बनाएं
फ़ाइल फ़ोल्डर सेट अप करें
फ़ाइल फ़ोल्डर एक ऐसी डायरेक्ट्री है जिसमें एक या उससे ज़्यादा सॉफ़्टवेयर प्रोजेक्ट
के लिए सोर्स फ़ाइलें मौजूद होती हैं और इसकी रूट फ़ाइल में WORKSPACE
फ़ाइल
होती है.
WORKSPACE
फ़ाइल खाली हो सकती है. इसके अलावा, यह भी हो सकता है कि इसमें बाहरी
डिपेंडेंसी के रेफ़रंस शामिल हों, जो प्रोजेक्ट बनाने के लिए ज़रूरी हों.
सबसे पहले, एक खाली WORKSPACE
फ़ाइल बनाने के लिए यह निर्देश दें:
ओएस | Command |
---|---|
Linux, macOS | touch WORKSPACE |
Windows (कमांड प्रॉम्प्ट) | type nul > WORKSPACE |
Windows (PowerShell) | New-Item WORKSPACE -ItemType file |
रनिंग बेज़ल
अब आप यह जांच सकते हैं कि Bazel कमांड के साथ ठीक से चल रहा है या नहीं:
bazel info workspace
अगर Bazel मौजूदा डायरेक्ट्री में सेव किए गए पाथ को प्रिंट कर लेता है, तो आप इसके लिए तैयार हैं! अगर
WORKSPACE
फ़ाइल मौजूद नहीं है, तो आपको गड़बड़ी का यह मैसेज दिख सकता है:
ERROR: The 'info' command is only supported from within a workspace.
Android SDK से जोड़ना
ऐप्लिकेशन बनाने के लिए, Bazel को Android SDK टूल
बिल्ड टूल
का इस्तेमाल करना होगा. इसका मतलब है कि आपको अपनी
WORKSPACE
फ़ाइल में कुछ जानकारी जोड़नी होगी, ताकि Bazel को यह पता चल सके कि उन्हें कहां खोजना है.
अपनी WORKSPACE
फ़ाइल में ये लाइन जोड़ें:
android_sdk_repository(name = "androidsdk")
इससे, ANDROID_HOME
एनवायरमेंट वैरिएबल में बताए गए पाथ पर Android SDK टूल का इस्तेमाल किया जाएगा. साथ ही, यह उस जगह पर इंस्टॉल किए गए सबसे ऊंचे एपीआई लेवल और बिल्ड टूल के नए वर्शन का अपने-आप पता लगाएगा.
ANDROID_HOME
वैरिएबल को Android SDK की जगह पर सेट किया जा सकता है. Android Studio के SDK टूल मैनेजर का इस्तेमाल करके, इंस्टॉल किए गए SDK टूल का पाथ ढूंढें.
यह मानते हुए कि SDK टूल डिफ़ॉल्ट जगहों पर इंस्टॉल है, ANDROID_HOME
कमांड सेट करने के लिए इन निर्देशों का इस्तेमाल किया जा सकता है:
ओएस | Command |
---|---|
Linux | export ANDROID_HOME=$HOME/Android/Sdk/ |
macOS | export ANDROID_HOME=$HOME/Library/Android/sdk |
Windows (कमांड प्रॉम्प्ट) | set ANDROID_HOME=%LOCALAPPDATA%\Android\Sdk |
Windows (PowerShell) | $env:ANDROID_HOME="$env:LOCALAPPDATA\Android\Sdk" |
ऊपर दिए गए निर्देश, सिर्फ़ मौजूदा शेल सेशन के लिए वैरिएबल सेट करते हैं. उन्हें स्थायी बनाने के लिए, ये निर्देश चलाएं:
ओएस | Command |
---|---|
Linux | echo "export ANDROID_HOME=$HOME/Android/Sdk/" >> ~/.bashrc |
macOS | echo "export ANDROID_HOME=$HOME/Library/Android/Sdk/" >> ~/.bashrc |
Windows (कमांड प्रॉम्प्ट) | setx ANDROID_HOME "%LOCALAPPDATA%\Android\Sdk" |
Windows (PowerShell) | [System.Environment]::SetEnvironmentVariable('ANDROID_HOME', "$env:LOCALAPPDATA\Android\Sdk", [System.EnvironmentVariableTarget]::User) |
आपके पास Android SDK टूल, एपीआई लेवल, और बिल्ड टूल के वर्शन के बारे में भी पूरी जानकारी देने का विकल्प है. इसके लिए, path
,
api_level
, और build_tools_version
एट्रिब्यूट को शामिल करें. अगर api_level
और
build_tools_version
के बारे में नहीं बताया गया है, तो android_sdk_repository
नियम,
SDK टूल में उपलब्ध सबसे नए वर्शन का इस्तेमाल करेगा. जब तक SDK टूल में मौजूद हों, तब तक इन एट्रिब्यूट के किसी भी कॉम्बिनेशन का इस्तेमाल किया जा सकता है:
android_sdk_repository(
name = "androidsdk",
path = "/path/to/Android/sdk",
api_level = 25,
build_tools_version = "30.0.3"
)
Windows पर, ध्यान दें कि path
एट्रिब्यूट को मिक्स किए गए स्टाइल का पाथ इस्तेमाल करना ज़रूरी है. इसका मतलब है कि फ़ॉरवर्ड स्लैश के साथ Windows पाथ
android_sdk_repository(
name = "androidsdk",
path = "c:/path/to/Android/sdk",
)
ज़रूरी नहीं: अगर आपको अपने Android ऐप्लिकेशन में नेटिव कोड को कंपाइल करना है, तो आपको Android
NDK भी डाउनलोड करना होगा.
साथ ही, WORKSPACE
फ़ाइल में यह लाइन जोड़कर, Bazel को खोजने की जगह की जानकारी भी देनी होगी:
android_ndk_repository(name = "androidndk")
android_sdk_repository
की तरह, Android एनडीके के पाथ का अनुमान, डिफ़ॉल्ट रूप से ANDROID_NDK_HOME
एनवायरमेंट वैरिएबल से लगाया जाता है. पाथ को android_ndk_repository
पर path
एट्रिब्यूट से, साफ़ तौर पर बताया भी जा सकता है.
ज़्यादा जानकारी के लिए, Bazel के साथ Android की नेटिव डेवलपमेंट किट का इस्तेमाल करना पढ़ें.
api_level
, Android एपीआई का वह वर्शन है जिसे SDK टूल और NDK
टारगेट करता है. उदाहरण के लिए, Android 6.0 के लिए 23 और Android 7.1 के लिए 25. अगर साफ़ तौर पर सेट नहीं किया गया है, तो api_level
डिफ़ॉल्ट रूप से android_sdk_repository
और android_ndk_repository
के लिए सबसे ज़्यादा उपलब्ध एपीआई लेवल होता है.
SDK टूल और NDK के लिए, एपीआई लेवल को एक ही वैल्यू पर सेट करना ज़रूरी नहीं है. इस पेज में, Android रिलीज़ से लेकर NDK की सुविधा वाले एपीआई लेवल तक का मैप शामिल है.
एक बिल्ड फ़ाइल बनाएं
BUILD
फ़ाइल बिल्ड आउटपुट के सेट के बीच संबंध के बारे में बताती है, जैसे कि aapt
से कंपाइल किए गए Android रिसॉर्स या javac
की क्लास फ़ाइलें और उनकी डिपेंडेंसी. ये डिपेंडेंसी आपके फ़ाइल फ़ोल्डर
या अन्य बिल्ड आउटपुट में सोर्स फ़ाइलें (Java, C++) हो सकती हैं. BUILD
फ़ाइलें
Starlark नाम की भाषा में लिखी जाती हैं.
BUILD
फ़ाइलें, बैजल में एक सिद्धांत का हिस्सा हैं, जिसे पैकेज का क्रम कहा जाता है.
पैकेज हैरारकी एक लॉजिकल स्ट्रक्चर है जो आपके फ़ाइल फ़ोल्डर में डायरेक्ट्री स्ट्रक्चर को ओवरले करता है. हर पैकेज एक ऐसी डायरेक्ट्री (और उसकी सबडायरेक्ट्री) होती है, जिसमें सोर्स फ़ाइलों का एक सेट और एक BUILD
फ़ाइल होती है. इस पैकेज में सभी सबडायरेक्ट्री भी शामिल हैं. इसमें वे डायरेक्ट्री शामिल नहीं होती हैं जिनमें BUILD
फ़ाइल होती है. पैकेज का नाम, WORKSPACE
से जुड़ी
BUILD
फ़ाइल का पाथ होता है.
ध्यान दें कि Bazel का पैकेज क्रम, सैद्धांतिक रूप से आपकी उस Android ऐप्लिकेशन डायरेक्ट्री के Java पैकेज क्रम से अलग होता है जहां BUILD
फ़ाइल मौजूद होती है. हालांकि, डायरेक्ट्री को भी एक ही तरीके से व्यवस्थित किया जा सकता है.
इस ट्यूटोरियल में सरल Android ऐप्लिकेशन के लिए, src/main/
की स्रोत फ़ाइलों में एक Bazel पैकेज होता है. ज़्यादा जटिल प्रोजेक्ट में कई नेस्ट किए गए
पैकेज हो सकते हैं.
android_library नियम जोड़ें
BUILD
फ़ाइल में Bazel के लिए कई अलग-अलग तरह के एलान होते हैं. सबसे अहम तरीका,
बिल्ड रूल है. इससे बेज़ल को फ़ाइलों के सोर्स या अन्य डिपेंडेंसी से कोई इंटरमीडिएट या फ़ाइनल सॉफ़्टवेयर आउटपुट बनाने का तरीका पता चलता है. Bazel दो बिल्ड नियम उपलब्ध कराता है,
android_library
और
android_binary
, जिनका इस्तेमाल आप एक Android ऐप्लिकेशन
बनाने के लिए कर सकते हैं.
इस ट्यूटोरियल के लिए, आपको पहले
android_library
नियम का इस्तेमाल करना होगा, ताकि ऐप्लिकेशन सोर्स कोड और रिसॉर्स फ़ाइलों से Android लाइब्रेरी
मॉड्यूल बनाने के लिए, बेज़ल को कहा जा सके. इसके बाद,
android_binary
नियम का इस्तेमाल करके, Bazel को Android ऐप्लिकेशन पैकेज बनाने का तरीका बताया जाएगा.
src/main/java/com/example/bazel
डायरेक्ट्री में नई BUILD
फ़ाइल बनाएं और
नए android_library
टारगेट का एलान करें:
src/main/java/com/example/bazel/BUILD
:
package(
default_visibility = ["//src:__subpackages__"],
)
android_library(
name = "greeter_activity",
srcs = [
"Greeter.java",
"MainActivity.java",
],
manifest = "AndroidManifest.xml",
resource_files = glob(["res/**"]),
)
android_library
बिल्ड नियम में एट्रिब्यूट का एक सेट होता है, जो सोर्स फ़ाइलों से
लाइब्रेरी मॉड्यूल बनाने के लिए ज़रूरी जानकारी को तय करता है.
यह भी ध्यान रखें कि इस नियम का नाम greeter_activity
है. android_binary
नियम में, इस नाम को डिपेंडेंसी के तौर पर इस्तेमाल करने वाले नियम की जानकारी दी जाएगी.
कोई android_binary नियम जोड़ें
android_binary
नियम आपके ऐप्लिकेशन के लिए
Android ऐप्लिकेशन पैकेज (.apk
फ़ाइल) बनाता है.
src/main/
डायरेक्ट्री में नई BUILD
फ़ाइल बनाएं और
नए android_binary
टारगेट का एलान करें:
src/main/BUILD
:
android_binary(
name = "app",
manifest = "AndroidManifest.xml",
deps = ["//src/main/java/com/example/bazel:greeter_activity"],
)
यहां, deps
एट्रिब्यूट, greeter_activity
नियम के उस आउटपुट की जानकारी देता है जो आपने ऊपर BUILD
फ़ाइल में जोड़ा है. इसका मतलब है कि जब Bazel इस नियम का आउटपुट बनाता है, तब यह जांच करता है कि greeter_activity
लाइब्रेरी के नियम का आउटपुट अप-टू-डेट है या नहीं. अगर नहीं, तो बैज़ेल इसे बनाता है
और फिर उस आउटपुट का इस्तेमाल ऐप्लिकेशन पैकेज फ़ाइल बनाने के लिए करता है.
अब, फ़ाइल को सेव करें और बंद करें.
ऐप्लिकेशन बनाएं
ऐप्लिकेशन बनाएं! android_binary
टारगेट बनाने के लिए यह कमांड चलाएं:
bazel build //src/main:app
build
सबकमांड, बेज़ल को निर्देश देता है कि वे इस टारगेट को बनाएं. टारगेट को BUILD
फ़ाइल में बिल्ड नियम के नाम के साथ-साथ, आपकी फ़ाइल फ़ोल्डर डायरेक्ट्री से संबंधित पैकेज पाथ के तौर पर बताया जाता है. उदाहरण के लिए, टारगेट app
है और पैकेज का पाथ
//src/main/
है.
ध्यान दें कि आपकी मौजूदा वर्किंग डायरेक्ट्री और टारगेट लाइन के नाम के आधार पर, आप कभी-कभी पैकेज पाथ या टारगेट के नाम को हटा सकते हैं. टारगेट लेबल और पाथ के बारे में ज़्यादा जानकारी के लिए, लेबल देखें.
Bazel ऐप्लिकेशन का नमूना बनाना शुरू कर देगा. बिल्ड की प्रोसेस के दौरान, उसका आउटपुट इन जैसा दिखेगा:
INFO: Analysed target //src/main:app (0 packages loaded, 0 targets configured).
INFO: Found 1 target...
Target //src/main:app up-to-date:
bazel-bin/src/main/app_deploy.jar
bazel-bin/src/main/app_unsigned.apk
bazel-bin/src/main/app.apk
बिल्ड आउटपुट खोजें
Bazel, हर उपयोगकर्ता के लिए हर फ़ाइल फ़ोल्डर आउटपुट आउटपुट के तौर पर, इंटरमीडिएट और फ़ाइनल बिल्ड, दोनों काम करता है. ये डायरेक्ट्री, प्रोजेक्ट डायरेक्ट्री में सबसे ऊपर के लेवल पर इन जगहों से दिखाई जाती हैं, जहां WORKSPACE
है:
bazel-bin
बाइनरी एक्ज़ीक्यूटेबल और दूसरे चलाए जा सकने वाले बिल्ड आउटपुट सेव करता हैbazel-genfiles
, इंटरमीडिएट सोर्स फ़ाइलों को स्टोर करता है जो Bazel के नियमों से जनरेट होती हैंbazel-out
अन्य तरह के बिल्ड आउटपुट सेव करता है
Bazel, android_binary
नियम की मदद से जनरेट की गई .apk
फ़ाइल को bazel-bin/src/main
डायरेक्ट्री में सेव करता है. इसमें src/main
सबडायरेक्ट्री का नाम, Bazel पैकेज के नाम से लिया जाता है.
कमांड प्रॉम्प्ट में, इस डायरेक्ट्री के कॉन्टेंट की सूची बनाएं और app.apk
फ़ाइल ढूंढें:
ओएस | Command |
---|---|
Linux, macOS | ls bazel-bin/src/main |
Windows (कमांड प्रॉम्प्ट) | dir bazel-bin\src\main |
Windows (PowerShell) | ls bazel-bin\src\main |
ऐप्लिकेशन चलाएं
अब bazel
mobile-install
निर्देश की मदद से, कमांड लाइन से ऐप्लिकेशन को कनेक्ट किए गए Android डिवाइस या एम्युलेटर पर डिप्लॉय किया जा सकता है. यह निर्देश, डिवाइस को मैसेज भेजने के लिए, Android डीबग ब्रिज (adb
) का इस्तेमाल करता है. डिप्लॉय करने से पहले, आपको Android डीबग डीबग में दिए गए निर्देशों का पालन करके, अपने डिवाइस को adb
का इस्तेमाल करने के लिए सेट अप करना होगा. आप
Android Studio में शामिल Android एम्युलेटर पर भी ऐप्लिकेशन को इंस्टॉल करने का विकल्प चुन सकते हैं. नीचे दिए गए निर्देश को चलाने से पहले पक्का करें कि एम्युलेटर चल रहा है.
नीचे दी गई चीज़ें डालें:
bazel mobile-install //src/main:app
इसके बाद, "Bazel Tutorial ऐप्लिकेशन" ढूंढें और उसे लॉन्च करें:
दूसरा डायग्राम. Bazel ट्यूटोरियल ऐप्लिकेशन.
बधाई हो! आपने अभी-अभी अपना पहला Bazel का Android ऐप्लिकेशन इंस्टॉल किया है.
ध्यान दें कि mobile-install
सबकॉमैंड, --incremental
फ़्लैग का भी इस्तेमाल करता है. इसका इस्तेमाल ऐप्लिकेशन के सिर्फ़ उन हिस्सों को डिप्लॉय करने के लिए किया जा सकता है जिन्हें पिछले डिप्लॉयमेंट के बाद से बदला गया है.
ऐप्लिकेशन इंस्टॉल करने के तुरंत बाद शुरू करने के लिए --start_app
फ़्लैग का भी
इस्तेमाल किया जा सकता है.
इसके बारे में और पढ़ें
ज़्यादा जानकारी के लिए, ये पेज देखें:
- GitHub पर खुली समस्याएं
- मोबाइल-इंस्टॉल के बारे में ज़्यादा जानकारी
- Terms_jvm_external का इस्तेमाल करके, AppCompat, Guava, और JUnit जैसे बाहरी डिपेंडेंसी को Maven का डेटा स्टोर करने की जगह के साथ इंटिग्रेट करें
- Robolectric-bazel के इंटिग्रेशन के साथ, Robolectric की जांच करें.
- Android इंस्ट्रूमेंटेशन टेस्ट की मदद से, अपने ऐप्लिकेशन की जांच करना
- NDK के साथ C और C++ कोड को अपने Android ऐप्लिकेशन के साथ इंटिग्रेट किया जा रहा है
- Bazel के और प्रोजेक्ट देखें:
बिल्डिंग की शुभकामनाएं!