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

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

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

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

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

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

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

इस ट्यूटोरियल में, यह जाना जा सकता है कि:

  • Bazel और Android Studio इंस्टॉल करके और सैंपल प्रोजेक्ट डाउनलोड करके, अपना एनवायरमेंट सेट अप करें.
  • ऐसा Bazel वर्कस्पेस सेट अप करें जिसमें ऐप्लिकेशन का सोर्स कोड शामिल हो. साथ ही, इसमें एक WORKSPACE फ़ाइल शामिल हो जो Workspace डायरेक्ट्री के टॉप लेवल की पहचान करती हो.
  • Android SDK जैसी ज़रूरी बाहरी डिपेंडेंसी के रेफ़रंस शामिल करने के लिए, WORKSPACE फ़ाइल को अपडेट करें.
  • BUILD फ़ाइल बनाएं.
  • Bazel की मदद से ऐप्लिकेशन बनाएं.
  • इस ऐप्लिकेशन को किसी Android एम्युलेटर या किसी फ़िज़िकल डिवाइस पर डिप्लॉय करें और चलाएं.

शुरू करने से पहले

Bazel इंस्टॉल करें

ट्यूटोरियल शुरू करने से पहले, यह सॉफ़्टवेयर इंस्टॉल करें:

  • Bazel. इंस्टॉल करने के लिए, इंस्टॉलेशन के निर्देशों का पालन करें.
  • Android Studio. इंस्टॉल करने के लिए, Android Studio डाउनलोड करने का तरीका अपनाएं. SDK टूल डाउनलोड करने और अपने एनवायरमेंट को कॉन्फ़िगर करने के लिए, सेटअप विज़र्ड का इस्तेमाल करें.
  • (ज़रूरी नहीं) Git. Android ऐप्लिकेशन प्रोजेक्ट डाउनलोड करने के लिए, git का इस्तेमाल करें.

सैंपल प्रोजेक्ट पाएं

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

इस ऐप्लिकेशन में एक बटन होता है, जिस पर क्लिक करने पर वेलकम मैसेज प्रिंट किया जाता है:

बटन अभिवादन

पहला डायग्राम. Android ऐप्लिकेशन बटन का वेलकम मैसेज.

git की मदद से, डेटा स्टोर करने की जगह को क्लोन करें (या ज़िप फ़ाइल को सीधे डाउनलोड करें):

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 फ़ाइल बनाने के लिए नीचे दिया गया निर्देश चलाएं:

ओएस आदेश
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 SDK का इस्तेमाल करेगा जिसके बारे में ANDROID_HOME एनवायरमेंट वैरिएबल में बताया गया है. साथ ही, यह उस जगह में इंस्टॉल किए गए सबसे अच्छे एपीआई लेवल और इंस्टॉल किए गए बिल्ड टूल के नए वर्शन का अपने-आप पता लगाएगा.

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

android_ndk_repository(name = "androidndk")

android_sdk_repository की तरह ही, Android एनडीके का पाथ, डिफ़ॉल्ट रूप से ANDROID_NDK_HOME एनवायरमेंट वैरिएबल से अनुमानित होता है. पाथ को android_ndk_repository पर path एट्रिब्यूट के साथ साफ़ तौर पर भी बताया जा सकता है.

ज़्यादा जानकारी के लिए, Bazel के साथ Android नेटिव डेवलपमेंट किट इस्तेमाल करना पढ़ें.

api_level, Android API का ऐसा वर्शन है जिसे SDK टूल और एनडीके टारगेट करते हैं - उदाहरण के लिए, Android 6.0 के लिए 23 और Android 7.1 के लिए 25. अगर यह नीति साफ़ तौर पर सेट नहीं की गई है, तो api_level, android_sdk_repository और android_ndk_repository के लिए डिफ़ॉल्ट रूप से सबसे ज़्यादा उपलब्ध एपीआई लेवल को सेट करती है.

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

BUILD फ़ाइल बनाएं

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

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

ध्यान दें कि Bazel का पैकेज हैरारकी, सैद्धांतिक तौर पर आपकी Android ऐप्लिकेशन डायरेक्ट्री के Java पैकेज हैरारकी से अलग है, जहां 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:

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:

android_binary(
    name = "app",
    manifest = "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: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 नियम का इस्तेमाल करके जनरेट की गई Android .apk फ़ाइल को 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 डीबग ब्रिज (adb) का इस्तेमाल करता है. डिवाइस को डिप्लॉय करने से पहले, Android डीबग ब्रिज में दिए गए निर्देशों का पालन करके, adb का इस्तेमाल करने के लिए अपना डिवाइस सेट अप कर लें. आपके पास Android Studio में शामिल Android एम्युलेटर पर ऐप्लिकेशन को इंस्टॉल करने का विकल्प भी है. नीचे दिए गए निर्देश को लागू करने से पहले, पक्का करें कि एम्युलेटर चल रहा है.

नीचे दी गई चीज़ें डालें:

bazel mobile-install //src/main:app

इसके बाद, "Bazel ट्यूटोरियल ऐप्लिकेशन" ढूंढें और लॉन्च करें:

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

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

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

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

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

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

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

बिल्डिंग मुबारक!