तारीख सेव करें: BazelCon 2023, 24 से 25 अक्टूबर तक Google म्यूनिख में होगा! ज़्यादा जानें

बैजल ट्यूटोरियल: Android ऐप्लिकेशन बनाएं

किसी समस्या की शिकायत करें स्रोत देखें

ध्यान दें: Android ऐप्लिकेशन बनाने के लिए, Bazel का इस्तेमाल करने से जुड़ी कुछ सीमाएं हैं. समस्याओं की सूची देखने के लिए, Github टीम-Android हॉटलिस्ट पर जाएं. Bazel की टीम और ओपन सोर्स सॉफ़्टवेयर (ओएसएस) योगदान देने वाले लोग, पहले से मौजूद समस्याओं को हल करने के लिए लगातार काम कर रहे हैं. हालांकि, इस्तेमाल करने वालों को ध्यान रखना चाहिए कि Android Studio के साथ आधिकारिक तौर पर Bazel प्रोजेक्ट काम नहीं करते.

इस ट्यूटोरियल में 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 ट्यूटोरियल ऐप्लिकेशन.

बधाई हो! आपने अभी-अभी अपना पहला Bazel का Android ऐप्लिकेशन इंस्टॉल किया है.

ध्यान दें कि mobile-install सबकॉमैंड, --incremental फ़्लैग का भी इस्तेमाल करता है. इसका इस्तेमाल ऐप्लिकेशन के सिर्फ़ उन हिस्सों को डिप्लॉय करने के लिए किया जा सकता है जिन्हें पिछले डिप्लॉयमेंट के बाद से बदला गया है.

ऐप्लिकेशन इंस्टॉल करने के तुरंत बाद शुरू करने के लिए --start_app फ़्लैग का भी इस्तेमाल किया जा सकता है.

इसके बारे में और पढ़ें

ज़्यादा जानकारी के लिए, ये पेज देखें:

बिल्डिंग की शुभकामनाएं!