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

संग्रह की मदद से व्यवस्थित रहें अपनी प्राथमिकताओं के आधार पर, कॉन्टेंट को सेव करें और कैटगरी में बांटें.
समस्या की शिकायत करें स्रोत देखें

इस ट्यूटोरियल में Bazel का इस्तेमाल करके, एक सामान्य Android ऐप्लिकेशन बनाने का तरीका बताया गया है.

Bazel से Android के नियमों का इस्तेमाल करके, Android ऐप्लिकेशन बनाया जा सकता है.

यह ट्यूटोरियल, Windows, macOS, और Linux के उपयोगकर्ताओं के लिए है. इसमें Bazel या Android ऐप्लिकेशन के डेवलपमेंट की ज़रूरत नहीं होती. आपको इस ट्यूटोरियल में कोई Android कोड लिखने की ज़रूरत नहीं है.

आप इन चीज़ों के बारे में जानेंगे

इस ट्यूटोरियल में, आप ये सीखते हैं:

  • Bazel और Android Studio इंस्टॉल करके अपना वातावरण सेट अप करें और नमूना प्रोजेक्ट डाउनलोड करें.
  • बेज़ल फ़ाइल फ़ोल्डर सेट अप करें, जिसमें ऐप्लिकेशन के लिए सोर्स कोड हो और WORKSPACE फ़ाइल मौजूद हो, जिसमें फ़ाइल फ़ोल्डर की डायरेक्ट्री के सबसे ऊपर के लेवल की पहचान हो सके.
  • Android SDK जैसी ज़रूरी बाहरी डिपेंडेंसी के रेफ़रंस शामिल करने के लिए, WORKSPACE फ़ाइल अपडेट करें.
  • कोई 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 info workspace

अगर बेज़ल मौजूदा डायरेक्ट्री के पाथ को प्रिंट करती हैं, तो आप आगे बढ़ सकते हैं! अगर WORKSPACE फ़ाइल मौजूद नहीं है, तो आपको गड़बड़ी का ऐसा मैसेज दिख सकता है:

ERROR: The 'info' command is only supported from within a workspace.

Android SDK के साथ इंटिग्रेट करना

ऐप्लिकेशन बनाने के लिए, बेज़ल को 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)

आप path, api_level, और build_tools_version एट्रिब्यूट को शामिल करके, Android SDK टूल, एपीआई लेवल, और बिल्ड टूल के वर्शन के बारे में भी पूरी जानकारी दे सकते हैं. अगर 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 एनडीके भी डाउनलोड करना होगा. साथ ही, बेज़ल को अपनी WORKSPACE फ़ाइल में यह लाइन जोड़कर पता लगाना होगा कि उसे कहां ढूंढना है:

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. अगर साफ़ तौर पर सेट नहीं किया गया है, तो android_sdk_repository और android_ndk_repository के लिए api_level डिफ़ॉल्ट रूप से सबसे ज़्यादा उपलब्ध एपीआई लेवल है.

SDK टूल और NDK के लिए, एपीआई लेवल को एक जैसी वैल्यू पर सेट करना ज़रूरी नहीं है. इस पेज पर, Android रिलीज़ से लेकर NDK पर काम करने वाले एपीआई लेवल तक का मैप होता है.

एक बिल्ड फ़ाइल बनाएं

BUILD फ़ाइल में, आउटपुट के सेट के बीच संबंध की जानकारी दी गई होती है. जैसे, aapt से इकट्ठा किए गए Android रिसॉर्स या javac की क्लास फ़ाइलों और उनकी डिपेंडेंसी. ये डिपेंडेंसी आपके फ़ाइल फ़ोल्डर या अन्य बिल्ड आउटपुट में सोर्स फ़ाइलें (Java, C++) हो सकती हैं. BUILD फ़ाइलें Starlark नाम की भाषा में लिखी जाती हैं.

BUILD फ़ाइलें, बेज़ल में एक कॉन्सेप्ट का हिस्सा हैं जिसे पैकेज का क्रम कहा जाता है. पैकेज हैरारकी एक लॉजिकल स्ट्रक्चर है जो आपके फ़ाइल फ़ोल्डर में डायरेक्ट्री स्ट्रक्चर को ओवरले करता है. हर पैकेज एक डायरेक्ट्री (और उसकी सबडायरेक्ट्री) होती है, जिसमें सोर्स फ़ाइलों और BUILD फ़ाइल से जुड़ा एक सेट होता है. पैकेज में कोई भी सबडायरेक्ट्री शामिल होती है. इसमें वे सब शामिल नहीं हैं जिनमें उनकी अपनी BUILD फ़ाइल होती है. पैकेज का नाम WORKSPACE से जुड़ी BUILD फ़ाइल का पाथ होता है.

ध्यान दें कि Bazel के पैकेज को क्रम में लगाने का तरीका, आपके Android ऐप्लिकेशन की डायरेक्ट्री के Java पैकेज हैरारकी से अलग है, जहां BUILD फ़ाइल मौजूद होती है. हालांकि, ये डायरेक्ट्री भी एक जैसी व्यवस्थित हो सकती हैं.

इस ट्यूटोरियल में आसान Android ऐप्लिकेशन के लिए, src/main/ में मौजूद सोर्स फ़ाइलों में एक बेज़ल पैकेज होता है. ज़्यादा जटिल प्रोजेक्ट में कई नेस्ट किए गए पैकेज हो सकते हैं.

कोई android_library नियम जोड़ें

BUILD फ़ाइल में Bazel के लिए कई अलग-अलग तरह की सूचनाएं होती हैं. सबसे अहम तरीका बिल्ड नियम है, जो बेज़ल को बताता है कि सोर्स फ़ाइलों के सेट या अन्य डिपेंडेंसी से इंटरमीडिएट या फ़ाइनल सॉफ़्टवेयर आउटपुट कैसे बनाना है. Bazel का इस्तेमाल करके, Android ऐप्लिकेशन बनाने के लिए दो बिल्ड नियम android_library और android_binary इस्तेमाल किए जा सकते हैं.

इस ट्यूटोरियल के लिए, आपको सबसे पहले android_library नियम का इस्तेमाल करना होगा, ताकि ऐप्लिकेशन डेवलपर को ऐप्लिकेशन के सोर्स कोड और रिसॉर्स फ़ाइलों से Android लाइब्रेरी मॉड्यूल बनाने के लिए कहा जा सके. इसके बाद, आप android_binary नियम का इस्तेमाल करके, बेज़ल को 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 एट्रिब्यूट, ऊपर दिए गए BUILD फ़ाइल में जोड़े गए greeter_activity नियम के आउटपुट का रेफ़रंस देता है. इसका मतलब है कि जब बेज़ल इस नियम का आउटपुट बनाती हैं, तो सबसे पहले यह जांच करती हैं कि greeter_activity लाइब्रेरी के नियम का आउटपुट बनाया गया है या नहीं. अगर नहीं, तो Bazel इसे बनाता है और फिर ऐप्लिकेशन पैकेज फ़ाइल बनाने के लिए उस आउटपुट का इस्तेमाल करता है.

अब, फ़ाइल को सेव करें और बंद करें.

ऐप्लिकेशन बनाएं

ऐप्लिकेशन बनाने की कोशिश करें! android_binary टारगेट बनाने के लिए यह निर्देश चलाएं:

bazel build //src/main:app

build सबकैंड, बेज़ल को निर्देश देता है कि वे इस टारगेट को बनाएं. टारगेट को, BUILD फ़ाइल में बनाए गए बिल्ड नियम के नाम के साथ बताया जाता है. साथ ही, इसमें आपकी फ़ाइल फ़ोल्डर डायरेक्ट्री से मिलता-जुलता पैकेज पाथ भी शामिल होता है. इस उदाहरण के लिए, टारगेट app है और पैकेज पाथ //src/main/ है.

ध्यान दें कि आप कभी-कभी कमांड लाइन और टारगेट के नाम वाली अपनी मौजूदा डायरेक्ट्री के आधार पर, पैकेज पाथ या टारगेट नाम को छोड़ सकते हैं. टारगेट लेबल और पाथ के बारे में ज़्यादा जानकारी के लिए, लेबल देखें.

बेज़ेल, नमूना ऐप्लिकेशन बनाना शुरू कर देगा. बिल्ड प्रोसेस के दौरान, उसका आउटपुट इन चीज़ों के जैसा दिखेगा:

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, bazel-bin/src/main नियम में android_binary नियम का इस्तेमाल करके जनरेट की गई Android .apk फ़ाइल को स्टोर करता है. इस जानकारी में, बेज़ेल पैकेज के नाम के आधार पर सबडायरेक्ट्री का नाम src/main दिया गया है.

कमांड प्रॉम्प्ट में, इस निर्देशिका की सामग्री की सूची बनाएं और 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 ट्यूटोरियल ऐप्लिकेशन" ढूँढें और उसे लॉन्च करें:

Bazel ट्यूटोरियल ऐप्लिकेशन

दूसरा डायग्राम. Bazel ट्यूटोरियल ऐप्लिकेशन.

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

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

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

आगे पढ़ना

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

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