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

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

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

Baज़ल, Android के नियमों का इस्तेमाल करके Android ऐप्लिकेशन बनाने की सुविधा देता है.

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

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

इस ट्यूटोरियल में आपको ये काम करने का तरीका पता चलेगा:

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

वेब कंटेनर इंस्टॉल करने से पहले

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

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

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

सैंपल प्रोजेक्ट डाउनलोड करें

सैंपल प्रोजेक्ट के लिए, Baze के सैंपल रिपॉज़िटरी में बेसिक 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/

बेज़ल के साथ बिल्ड

फ़ाइल फ़ोल्डर सेट अप करना

वर्कस्पेस एक ऐसी डायरेक्ट्री है जिसमें एक या उससे ज़्यादा सॉफ़्टवेयर प्रोजेक्ट की सोर्स फ़ाइलें होती हैं. साथ ही, इसके रूट में WORKSPACE फ़ाइल होती है.

WORKSPACE फ़ाइल खाली हो सकती है या इसमें आपका प्रोजेक्ट बनाने के लिए ज़रूरी बाहरी डिपेंडेंसी के रेफ़रंस हो सकते हैं.

सबसे पहले, खाली WORKSPACE फ़ाइल बनाने के लिए, यहां दिया गया निर्देश चलाएं:

ओएस आदेश
Linux और macOS touch WORKSPACE
Windows (कमांड प्रॉम्प्ट) type nul > WORKSPACE
Windows (PowerShell) New-Item WORKSPACE -ItemType file

रनिंग बेज़ल

अब आप यह देख सकते हैं कि Basel का निर्देश सही तरीके से चल रहा है या नहीं:

bazel info workspace

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

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

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

ऐप्लिकेशन बनाने के लिए, Babel को Android SDK बिल्ड टूल चलाना होगा. इसका मतलब है कि आपको अपनी WORKSPACE फ़ाइल में कुछ जानकारी जोड़नी होगी, ताकि Basel को पता चल सके कि वे कहां मिल सकते हैं.

अपनी WORKSPACE फ़ाइल में यह लाइन जोड़ें:

android_sdk_repository(name = "androidsdk")

यह ANDROID_HOME एनवायरमेंट वैरिएबल से बताए गए पाथ पर, Android SDK का इस्तेमाल करेगा. साथ ही, उस जगह पर इंस्टॉल किए गए बिल्ड टूल के सबसे नए वर्शन और सबसे ज़्यादा एपीआई लेवल का अपने-आप पता लगाएगा.

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

android_ndk_repository(name = "androidndk")

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

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

api_level, Android API का वह वर्शन है जिसे SDK टूल और NDK टारगेट करते हैं - उदाहरण के लिए, 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 फ़ाइलें Basel में एक कॉन्सेप्ट का हिस्सा हैं, जिसे पैकेज हैरारकी के नाम से जाना जाता है. पैकेज हैरारकी एक लॉजिकल स्ट्रक्चर है, जो आपके फ़ाइल फ़ोल्डर में डायरेक्ट्री स्ट्रक्चर को ओवरले करता है. हर पैकेज एक डायरेक्ट्री और उसकी सबडायरेक्ट्री होती है. इसमें सोर्स फ़ाइलों का मिलता-जुलता सेट और एक BUILD फ़ाइल होती है. पैकेज में सभी सबडायरेक्ट्री भी शामिल होती हैं. इनमें वे सबडायरेक्ट्री शामिल नहीं होती हैं जिनकी BUILD फ़ाइल होती है. पैकेज का नाम, WORKSPACE से जुड़ी BUILD फ़ाइल का पाथ है.

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

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

android_library नियम जोड़ें

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

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

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

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

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

bazel build //src/main:app

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

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

Basel, ऐप्लिकेशन का सैंपल बनाना शुरू कर देगा. बिल्ड प्रोसेस के दौरान, उसका आउटपुट कुछ ऐसा दिखेगा:

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

बिल्ड आउटपुट खोजना

Baze, इंटरमीडिएट और फ़ाइनल, दोनों तरह की बिल्ड कार्रवाइयों के आउटपुट को हर उपयोगकर्ता के हिसाब से, हर वर्कस्पेस के लिए आउटपुट डायरेक्ट्री में उपलब्ध कराता है. ये डायरेक्ट्री, प्रोजेक्ट डायरेक्ट्री के टॉप-लेवल की इन जगहों से सिमलिंक की गई हैं, जहां WORKSPACE यह है:

  • bazel-bin बाइनरी एक्ज़ीक्यूटेबल और रन किए जा सकने वाले अन्य बिल्ड आउटपुट को सेव करता है
  • bazel-genfiles उन इंटरमीडियरी सोर्स फ़ाइलों को स्टोर करता है जो Baze के नियमों के हिसाब से जनरेट होती हैं
  • bazel-out में अन्य तरह के बिल्ड आउटपुट सेव किए जाते हैं

Baज़ल, android_binary नियम का इस्तेमाल करके जनरेट की गई Android .apk फ़ाइल को bazel-bin/src/main डायरेक्ट्री में सेव करता है. यहां सबडायरेक्ट्री का नाम src/main होता है, जो Bagel पैकेज के नाम से लिया जाता है.

कमांड प्रॉम्प्ट पर, इस डायरेक्ट्री के कॉन्टेंट की सूची बनाएं और app.apk फ़ाइल ढूंढें:

ओएस आदेश
Linux और macOS ls bazel-bin/src/main
Windows (कमांड प्रॉम्प्ट) dir bazel-bin\src\main
Windows (PowerShell) ls bazel-bin\src\main

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

अब ऐप्लिकेशन को, कनेक्ट किए गए Android डिवाइस या एम्युलेटर पर डिप्लॉय किया जा सकता है. ऐसा करने के लिए, bazel mobile-install कमांड का इस्तेमाल करें. यह निर्देश, डिवाइस से संपर्क करने के लिए Android डीबग ब्रिज (adb) का इस्तेमाल करता है. डिप्लॉयमेंट से पहले, Android डीबग ब्रिज में दिए गए निर्देशों का पालन करके, अपने डिवाइस को adb का इस्तेमाल करने के लिए सेट अप करना होगा. Android Studio में शामिल Android एम्युलेटर पर भी ऐप्लिकेशन इंस्टॉल किया जा सकता है. नीचे दिए गए निर्देश को चलाने से पहले, पक्का करें कि एम्युलेटर चल रहा है.

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

bazel mobile-install //src/main:app

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

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

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

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

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

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

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

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

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