इस ट्यूटोरियल में, Bazel का इस्तेमाल करके, Android का आसान ऐप्लिकेशन बनाने का तरीका बताया गया है.
Bazel, Android के नियमों का इस्तेमाल करके, Android ऐप्लिकेशन बनाने की सुविधा देता है.
यह ट्यूटोरियल, Windows, macOS, और Linux इस्तेमाल करने वाले लोगों के लिए है. इसके लिए, Bazel या Android ऐप्लिकेशन डेवलपमेंट का अनुभव होना ज़रूरी नहीं है. इस ट्यूटोरियल में, आपको Android का कोई कोड लिखने की ज़रूरत नहीं है.
आपको क्या सीखने को मिलेगा
इस ट्यूटोरियल में, आपको ये काम करने का तरीका बताया जाएगा:
- Bazel और Android Studio इंस्टॉल करके, सैंपल प्रोजेक्ट डाउनलोड करके, अपना एनवायरमेंट सेट अप करना.
- Bazel का वर्कस्पेस सेट अप करना. इसमें ऐप्लिकेशन का सोर्स कोड और
MODULE.bazelफ़ाइल शामिल होती है. यह फ़ाइल, वर्कस्पेस डायरेक्ट्री के टॉप लेवल की पहचान करती है. MODULE.bazelफ़ाइल को अपडेट करना, ताकि इसमें Android SDK जैसे ज़रूरी बाहरी डिपेंडेंसी के रेफ़रंस शामिल किए जा सकें.BUILDफ़ाइल बनाना.- Bazel की मदद से ऐप्लिकेशन बनाना.
- Android एम्युलेटर या फ़िज़िकल डिवाइस पर ऐप्लिकेशन डिप्लॉय और रन करना.
शुरू करने से पहले
Bazel इंस्टॉल करना
ट्यूटोरियल शुरू करने से पहले, यह सॉफ़्टवेयर इंस्टॉल करें:
- Bazel. इसे इंस्टॉल करने के लिए, इंस्टॉलेशन के निर्देश देखें.
- Android Studio. इसे इंस्टॉल करने के लिए, Android Studio डाउनलोड करने का तरीका अपनाएं. एसडीके टूल डाउनलोड करने और अपना एनवायरमेंट कॉन्फ़िगर करने के लिए, सेटअप विज़र्ड चलाएं.
- (ज़रूरी नहीं) Git. Android ऐप्लिकेशन प्रोजेक्ट डाउनलोड करने के लिए,
gitका इस्तेमाल करें.
सैंपल प्रोजेक्ट पाना
इस ऐप्लिकेशन में एक बटन होता है. इस पर क्लिक करने पर, बधाई मैसेज दिखता है:

पहली इमेज. 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 का इस्तेमाल करके बनाना
वर्कस्पेस सेट अप करना
एक वर्कस्पेस एक डायरेक्ट्री होती है. इसमें एक या एक से ज़्यादा सॉफ़्टवेयर प्रोजेक्ट की
सोर्स फ़ाइलें होती हैं. साथ ही, इसके रूट में एक MODULE.bazel फ़ाइल होती है.
MODULE.bazel फ़ाइल खाली हो सकती है या इसमें आपके प्रोजेक्ट को बनाने के लिए ज़रूरी बाहरी
डिपेंडेंसी के रेफ़रंस शामिल हो सकते हैं.
सबसे पहले, खाली MODULE.bazel फ़ाइल बनाने के लिए, यह कमांड चलाएं:
| ओएस | निर्देश |
|---|---|
| Linux, macOS | touch MODULE.bazel |
| Windows (कमांड प्रॉम्प्ट) | type nul > MODULE.bazel |
| Windows (PowerShell) | New-Item MODULE.bazel -ItemType file |
Bazel चलाना
अब यह देखा जा सकता है कि Bazel, इस कमांड की मदद से सही तरीके से चल रहा है या नहीं:
bazel info workspaceअगर Bazel, मौजूदा डायरेक्ट्री का पाथ दिखाता है, तो इसका मतलब है कि यह सही तरीके से काम कर रहा है! अगर MODULE.bazel फ़ाइल मौजूद नहीं है, तो आपको यह गड़बड़ी का मैसेज दिख सकता है:
ERROR: The 'info' command is only supported from within a workspace.
Android SDK के साथ इंटिग्रेट करना
ऐप्लिकेशन बनाने के लिए, Bazel को Android SDK
बिल्ड टूल
चलाने की ज़रूरत होती है. इसका मतलब है कि आपको अपनी
MODULE.bazel फ़ाइल में कुछ जानकारी जोड़नी होगी, ताकि Bazel को पता चल सके कि उन्हें कहां ढूंढना है.
अपनी MODULE.bazel फ़ाइल में यह लाइन जोड़ें:
bazel_dep(name = "rules_android", version = "0.6.6")
remote_android_extensions = use_extension(
"@rules_android//bzlmod_extensions:android_extensions.bzl",
"remote_android_tools_extensions")
use_repo(remote_android_extensions, "android_tools")
android_sdk_repository_extension = use_extension("@rules_android//rules/android_sdk_repository:rule.bzl", "android_sdk_repository_extension")
use_repo(android_sdk_repository_extension, "androidsdk")
इससे, ANDROID_HOME एनवायरमेंट वैरिएबल से रेफ़रंस किए गए पाथ पर मौजूद Android SDK का इस्तेमाल किया जाएगा. साथ ही, उस जगह पर इंस्टॉल किए गए बिल्ड टूल के सबसे नए वर्शन और सबसे अच्छे एपीआई लेवल का पता अपने-आप लग जाएगा.
ANDROID_HOME वैरिएबल को Android SDK की जगह पर सेट किया जा सकता है. Android Studio के एसडीके
मैनेजर का इस्तेमाल करके, इंस्टॉल किए गए एसडीके टूल का पाथ ढूंढें.
मान लें कि एसडीके टूल डिफ़ॉल्ट जगहों पर इंस्टॉल किया गया है. ऐसे में, ANDROID_HOME वैरिएबल सेट करने के लिए, इन कमांड का इस्तेमाल किया जा सकता है:
| ओएस | निर्देश |
|---|---|
| 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" |
ऊपर दिए गए कमांड, वैरिएबल को सिर्फ़ मौजूदा शेल सेशन के लिए सेट करते हैं. इन्हें हमेशा के लिए सेट करने के लिए, ये कमांड चलाएं:
| ओएस | निर्देश |
|---|---|
| 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 ऐप्लिकेशन में नेटिव कोड कंपाइल करना है, तो आपको
Android
NDK भी डाउनलोड करना होगा.
साथ ही, अपनी MODULE.bazel फ़ाइल में यह लाइन जोड़कर, rules_android_ndk का इस्तेमाल करना होगा:
bazel_dep(name = "rules_android_ndk", version = "0.1.3")
ज़्यादा जानकारी के लिए, Bazel के साथ Android नेटिव डेवलपमेंट किट का इस्तेमाल करना लेख पढ़ें.
एसडीके टूल और एनडीके के लिए, एपीआई लेवल को एक ही वैल्यू पर सेट करना ज़रूरी नहीं है. इस पेज पर, Android के वर्शन के हिसाब से, एनडीके के साथ काम करने वाले एपीआई लेवल की जानकारी दी गई है.
BUILD फ़ाइल बनाना
BUILD फ़ाइल में, बिल्ड के आउटपुट के सेट और उनकी डिपेंडेंसी के बीच के संबंध के बारे में बताया जाता है.
जैसे, aapt से कंपाइल किए गए Android रिसॉर्स या
javac से कंपाइल की गई क्लास फ़ाइलें. ये डिपेंडेंसी, आपके वर्कस्पेस में मौजूद सोर्स फ़ाइलें (Java, C++) या बिल्ड के अन्य आउटपुट हो सकते हैं. BUILD फ़ाइलें, Starlark नाम की भाषा में लिखी जाती हैं.
BUILD फ़ाइलें, Bazel में पैकेज हाइरार्की के तौर पर जानी जाती हैं.
पैकेज हाइरार्की एक लॉजिकल स्ट्रक्चर होता है, जो आपके वर्कस्पेस में डायरेक्ट्री स्ट्रक्चर पर ओवरले होता है. हर पैकेज एक
डायरेक्ट्री (और उसकी सबडायरेक्ट्री) होती है. इसमें सोर्स फ़ाइलों का एक सेट
और एक BUILD फ़ाइल शामिल होती है. पैकेज में सभी सबडायरेक्ट्री शामिल होती हैं. हालांकि, वे सबडायरेक्ट्री शामिल नहीं होतीं जिनमें अपनी BUILD फ़ाइल होती है. पैकेज का नाम, MODULE.bazel फ़ाइल के मुकाबले, BUILD फ़ाइल का पाथ होता है.
ध्यान दें कि Bazel की पैकेज हाइरार्की, आपके Android ऐप्लिकेशन की डायरेक्ट्री की Java पैकेज हाइरार्की से अलग होती है. हालांकि, डायरेक्ट्री को एक ही तरीके से व्यवस्थित किया जा सकता है. Android ऐप्लिकेशन की डायरेक्ट्री में BUILD फ़ाइल मौजूद होती है.
इस ट्यूटोरियल में दिए गए Android के आसान ऐप्लिकेशन के लिए, src/main/ में मौजूद सोर्स फ़ाइलें, Bazel का एक पैकेज बनाती हैं. ज़्यादा जटिल प्रोजेक्ट में, कई नेस्टेड पैकेज हो सकते हैं.
android_library नियम जोड़ना
BUILD फ़ाइल में, Bazel के लिए कई तरह के एलान शामिल होते हैं. सबसे
अहम टाइप,
बिल्ड का नियमहोता है. इससे
Bazel को पता चलता है कि सोर्स
फ़ाइलों या अन्य डिपेंडेंसी के सेट से, इंटरमीडिएट या फ़ाइनल सॉफ़्टवेयर आउटपुट कैसे बनाया जाए. Bazel,
android_library और
android_binary नाम के दो बिल्ड नियम उपलब्ध कराता है. इनका इस्तेमाल, Android ऐप्लिकेशन बनाने के लिए किया जा सकता है.
इस ट्यूटोरियल के लिए, सबसे पहले
android_library नियम का इस्तेमाल किया जाएगा. इससे Bazel को ऐप्लिकेशन के सोर्स कोड और रिसॉर्स फ़ाइलों से, Android लाइब्रेरी
मॉड्यूल बनाने के लिए कहा जाएगा. इसके बाद, android_binary नियम का इस्तेमाल किया जाएगा. इससे Bazel को Android ऐप्लिकेशन पैकेज बनाने का तरीका बताया जाएगा.
src/main/java/com/example/bazel डायरेक्ट्री में एक नई BUILD फ़ाइल बनाएं. साथ ही, नया android_library टारगेट एलान करें:
src/main/java/com/example/bazel/BUILD:
load("@rules_android//rules:rules.bzl", "android_library")
package(
default_visibility = ["//src:__subpackages__"],
)
android_library(
name = "greeter_activity",
srcs = [
"Greeter.java",
"MainActivity.java",
],
manifest = "AndroidManifest.xml",
resource_files = glob(["res/**"]),
)
android_library बिल्ड नियम में, एट्रिब्यूट का एक सेट शामिल होता है. इसमें ऐसी जानकारी दी जाती है जिसकी मदद से Bazel, सोर्स फ़ाइलों से लाइब्रेरी मॉड्यूल बना सकता है.
यह भी ध्यान रखें कि नियम का नाम greeter_activity है. android_binary नियम में, इस नाम का इस्तेमाल डिपेंडेंसी के तौर पर किया जाएगा.
android_binary नियम जोड़ना
android_binary नियम, आपके ऐप्लिकेशन के लिए Android ऐप्लिकेशन पैकेज (.apk फ़ाइल) बनाता है.
src/main/ डायरेक्ट्री में एक नई BUILD फ़ाइल बनाएं. साथ ही, नया android_binary टारगेट एलान करें:
src/main/BUILD:
load("@rules_android//rules:rules.bzl", "android_binary")
android_binary(
name = "app",
manifest = "//src/main/java/com/example/bazel:AndroidManifest.xml",
deps = ["//src/main/java/com/example/bazel:greeter_activity"],
)
यहां, deps एट्रिब्यूट, ऊपर जोड़ी गई BUILD फ़ाइल में मौजूद greeter_activity नियम के आउटपुट को रेफ़रंस करता है. इसका मतलब है कि जब Bazel, इस नियम का आउटपुट बनाता है, तो वह सबसे पहले यह देखता है कि greeter_activity लाइब्रेरी नियम का आउटपुट बना है या नहीं और वह अप-टू-डेट है या नहीं. अगर ऐसा नहीं है, तो Bazel उसे बनाता है. इसके बाद, ऐप्लिकेशन पैकेज फ़ाइल बनाने के लिए, उस आउटपुट का इस्तेमाल करता है.
अब फ़ाइल सेव करें और बंद करें.
ऐप्लिकेशन बनाना
ऐप्लिकेशन बनाने की कोशिश करें! android_binary टारगेट बनाने के लिए, यह कमांड चलाएं:
bazel build //src/main:appbuild सब-कमांड, Bazel को इसके बाद आने वाले
टारगेट को बनाने का निर्देश देता है. टारगेट को, 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, इंटरमीडिएट और फ़ाइनल, दोनों तरह के बिल्ड ऑपरेशन के आउटपुट को, हर उपयोगकर्ता और हर वर्कस्पेस के हिसाब से आउटपुट डायरेक्ट्री के सेट में रखता है. इन डायरेक्ट्री को, प्रोजेक्ट डायरेक्ट्री के टॉप-लेवल पर मौजूद इन जगहों से सिमलिंक किया जाता है. यहां MODULE.bazel फ़ाइल मौजूद होती है:
bazel-binमें, बाइनरी एक्ज़ीक्यूटेबल और बिल्ड के अन्य रन किए जा सकने वाले आउटपुट सेव होते हैंbazel-genfilesमें, इंटरमीडियरी सोर्स फ़ाइलें सेव होती हैं. इन्हें Bazel के नियमों से जनरेट किया जाता हैbazel-outमें, बिल्ड के अन्य टाइप के आउटपुट सेव होते हैं
Bazel, Android .apk फ़ाइल को, android_binary नियम का इस्तेमाल करके जनरेट की गई फ़ाइल को
bazel-bin/src/main डायरेक्ट्री में सेव करता है. यहां सबडायरेक्ट्री का नाम src/main, Bazel पैकेज के नाम से लिया गया है.
कमांड प्रॉम्प्ट पर, इस डायरेक्ट्री का कॉन्टेंट देखें और app.apk फ़ाइल ढूंढें:
| ओएस | निर्देश |
|---|---|
| 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 Debug Bridge (adb) का इस्तेमाल करता है. डिप्लॉयमेंट से पहले,
Android Debug Bridge
में दिए गए निर्देशों के मुताबिक, आपको अपने डिवाइस को adb का इस्तेमाल करने के लिए सेट अप करना होगा. आपके पास Android Studio में शामिल Android एम्युलेटर पर ऐप्लिकेशन इंस्टॉल करने का विकल्प भी होता है. नीचे दिया गया कमांड चलाने से पहले, पक्का करें कि एम्युलेटर चल रहा हो.
यह डालें:
bazel mobile-install //src/main:app \
--mode=skylark \
--mobile_install_aspect=@rules_android//mobile_install:mi.bzl \
--mobile_install_supported_rules=android_binary \
--java_runtime_version=17 \
--java_language_version=17 \
--tool_java_runtime_version=17 \
--tool_java_language_version=17ध्यान दें कि mobile-install के लिए ज़रूरी अतिरिक्त फ़्लैग, आपके
प्रोजेक्ट की bazelrc फ़ाइल में जोड़े जा सकते हैं. Bazel 8.4.0 और इसके बाद के वर्शन में, mobile-install के लिए खास फ़्लैग (--mode, --mobile_install*) की ज़रूरत नहीं होगी. आपके वर्कस्पेस के Java कॉन्फ़िगरेशन के आधार पर, भाषा और रनटाइम वर्शन के लिए अलग-अलग Java फ़्लैग की ज़रूरत पड़ सकती है.
Mobile-install के सब-टूल के लिए, भाषा और रनटाइम लेवल 17 या उससे ज़्यादा होना चाहिए.
अब "Bazel Tutorial App" अपने-आप इंस्टॉल और लॉन्च हो जाना चाहिए:

दूसरी इमेज. Bazel ट्यूटोरियल ऐप्लिकेशन.
बधाई हो! आपने Bazel की मदद से बनाया गया अपना पहला Android ऐप्लिकेशन इंस्टॉल कर लिया है.
इस बारे में और पढ़ें
ज़्यादा जानकारी के लिए, ये पेज देखें:
- rules_android GitHub पर मौजूद, हल न की गई समस्याएं
- mobile-install के बारे में ज़्यादा जानकारी
- rules_jvm_external का इस्तेमाल करके, Maven रिपॉज़िटरी से AppCompat, Guava, और JUnit जैसी बाहरी डिपेंडेंसी इंटिग्रेट करना
- robolectric-bazel इंटिग्रेशन की मदद से, Robolectric टेस्ट रन करना.
- NDK
- Bazel के अन्य सैंपल प्रोजेक्ट देखें:
बिल्डिंग के लिए शुभकामनाएं!