Android डेवलपमेंट आज़माना

इस ट्यूटोरियल की मदद से, पहली बार Android ऑपरेटिंग सिस्टम डेवलप करने की कोशिश की जा सकती है.

Android डेवलपमेंट के लिए सेट अप करना

Android सोर्स की android-latest-release मेनिफ़ेस्ट शाखा को डाउनलोड और बिल्ड करने से पहले, पक्का करें कि आपका हार्डवेयर ज़रूरी शर्तों को पूरा करता हो. साथ ही, ज़रूरी सॉफ़्टवेयर सही तरीके से इंस्टॉल हो. आपको इन शब्दों के बारे में भी जानकारी होनी चाहिए:

Git
Git, मुफ़्त और ओपन सोर्स डिस्ट्रिब्यूटेड वर्शन कंट्रोल सिस्टम है. Android, लोकल ऑपरेशन के लिए Git का इस्तेमाल करता है. जैसे, शाखा बनाना, कमिट करना, बदलाव करना, और अंतर देखना. Git सीखने में मदद पाने के लिए, Git का दस्तावेज़ देखें.
रिपॉज़िटरी
Repo, Git के लिए Python का एक रैपर है. इसकी मदद से, कई Git रिपॉज़िटरी में मुश्किल कार्रवाइयां आसानी से की जा सकती हैं. Repo, वर्शन कंट्रोल के सभी ऑपरेशन के लिए Git की जगह नहीं लेता. यह सिर्फ़ Git के मुश्किल ऑपरेशन को आसान बनाता है. Repo, मेनिफ़ेस्ट फ़ाइलों का इस्तेमाल करके, Git प्रोजेक्ट को Android सुपर प्रोजेक्ट में इकट्ठा करता है.
मेनिफ़ेस्ट फ़ाइल
मेनिफ़ेस्ट फ़ाइल एक एक्सएमएल फ़ाइल होती है. इसमें यह जानकारी होती है कि Android सोर्स में मौजूद अलग-अलग Git प्रोजेक्ट, AOSP सोर्स ट्री में कहां रखे गए हैं.

हार्डवेयर की ज़रूरी शर्तें पूरी करना

आपके डेवलपमेंट वर्कस्टेशन में, हार्डवेयर से जुड़ी ये ज़रूरी शर्तें पूरी होनी चाहिए या इनसे बेहतर होनी चाहिए:

  • 64-बिट x86 सिस्टम.

  • कोड को चेक आउट और बिल्ड करने के लिए, डिस्क में कम से कम 400 जीबी खाली जगह होनी चाहिए (चेक आउट करने के लिए 250 जीबी + बिल्ड करने के लिए 150 जीबी).

  • कम से कम 64 जीबी रैम. Google, Android बनाने के लिए 64 जीबी रैम वाली 72-कोर मशीनों का इस्तेमाल करता है. इस हार्डवेयर कॉन्फ़िगरेशन के साथ, Android का पूरा बिल्ड बनाने में करीब 40 मिनट लगते हैं. वहीं, Android का इंक्रीमेंटल बिल्ड बनाने में सिर्फ़ कुछ मिनट लगते हैं. इसके उलट, 64 जीबी रैम वाली 6-कोर मशीन पर, पूरे ऐप्लिकेशन को बिल्ड होने में करीब छह घंटे लगते हैं.

ऑपरेटिंग सिस्टम की ज़रूरी शर्तें पूरी करना

आपके डेवलपमेंट वर्कस्टेशन में, GNU C Library (glibc) 2.17 या इसके बाद का वर्शन वाला कोई 64-बिट Linux डिस्ट्रिब्यूशन होना चाहिए.

ज़रूरी पैकेज इंस्टॉल करना

Ubuntu 18.04 या उसके बाद के वर्शन के लिए ज़रूरी पैकेज इंस्टॉल करने के लिए, यह कमांड चलाएं:

sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

ज़रूरी सॉफ़्टवेयर इंस्टॉल करना

AOSP के साथ काम करने से पहले, आपके पास OpenJDK, Make, Python 3, और Repo इंस्टॉल होने चाहिए. Android की नई रिलीज़ वाली शाखा में, OpenJDK, Make, और Python 3 के पहले से बने वर्शन मौजूद होते हैं. इसलिए, इंस्टॉल करने के लिए अतिरिक्त चरणों की ज़रूरत नहीं होती. नीचे दिए गए सेक्शन में, Repo इंस्टॉल करने का तरीका बताया गया है.

Repo इंस्टॉल करना

Repo इंस्टॉल करने के लिए, यह तरीका अपनाएं:

  1. पैकेज की मौजूदा जानकारी डाउनलोड करें:

    sudo apt-get update
  2. Repo लॉन्चर इंस्टॉल करने के लिए, यह कमांड चलाएं:

    sudo apt-get install repo

    Repo लॉन्चर, एक Python स्क्रिप्ट उपलब्ध कराता है. यह स्क्रिप्ट, चेकआउट की प्रोसेस शुरू करती है और Repo टूल को पूरी तरह से डाउनलोड करती है.

    अगर ऐसा हो जाता है, तो सीधे चौथे चरण पर जाएं.

  3. (ज़रूरी नहीं) नीचे दिए गए निर्देशों का इस्तेमाल करके, Repo को मैन्युअल तरीके से इंस्टॉल करें:

    export REPO=$(mktemp /tmp/repo.XXXXXXXXX)
    curl -o ${REPO} https://storage.googleapis.com/git-repo-downloads/repo
    gpg --recv-keys 8BB9AD793E8E6153AF0F9A4416530D5E920F5C65
    curl -s https://storage.googleapis.com/git-repo-downloads/repo.asc | gpg --verify - ${REPO} && install -m 755 ${REPO} ~/bin/repo

    पहले तीन निर्देश, एक अस्थायी फ़ाइल सेट अप करते हैं, फ़ाइल में Repo डाउनलोड करते हैं, और पुष्टि करते हैं कि दी गई कुंजी, ज़रूरी कुंजी से मेल खाती है या नहीं. अगर ये निर्देश काम करते हैं, तो आखिरी निर्देश Repo लॉन्चर इंस्टॉल करता है.

  4. Repo लॉन्चर के वर्शन की पुष्टि करें:

    repo version

    आउटपुट में 2.4 या उसके बाद का वर्शन दिखना चाहिए. उदाहरण के लिए:

    repo launcher version 2.45

Android सोर्स डाउनलोड करना

Android का सोर्स, Google के होस्ट किए गए Git रिपॉज़िटरी के कलेक्शन में मौजूद होता है. हर Git रिपॉज़िटरी में, Android सोर्स का पूरा इतिहास शामिल होता है. इसमें सोर्स में किए गए बदलाव और बदलाव किए जाने की तारीख की जानकारी भी शामिल होती है. Android सोर्स डाउनलोड करने के लिए:

  1. अपनी होम डायरेक्ट्री पर जाएं:

    cd ~
  2. इसके अंदर एक लोकल वर्किंग सबडायरेक्ट्री बनाएं:

    mkdir aosp
  3. डायरेक्ट्री में नेविगेट करने के लिए:

    cd aosp
  4. AOSP रिपॉज़िटरी के सोर्स कोड की नई रिलीज़ शाखा (android-latest-release) को शुरू करना:

    repo init --partial-clone -b android-latest-release -u https://android.googlesource.com/platform/manifest
  5. Git के क्रेडेंशियल (नाम, ईमेल पता) डालें या स्वीकार करें.

  6. सोर्स कोड सिंक करें:

    repo sync -c -j8

    अगर डाउनलोड करने के दौरान कोई समस्या आती है, तो सिंक करने से जुड़ी समस्याओं को हल करना लेख पढ़ें.

कोड बनाना

कोड बनाने के लिए:

  1. अपनी वर्किंग डायरेक्ट्री में, envsetup.sh स्क्रिप्ट को सोर्स करें, ताकि आप अपना बिल्ड एनवायरमेंट सेट अप कर सकें:

    source build/envsetup.sh
  2. lunch कमांड के साथ बनाने के लिए, टारगेट डिवाइस टाइप की जानकारी दें. टारगेट, डिवाइस का कोई वैरिएशन होता है. जैसे, कोई खास मॉडल या फ़ॉर्म फ़ैक्टर. यह टारगेट तय करें:

    lunch aosp_cf_x86_64_only_phone-aosp_current-userdebug

    आपको अपने टारगेट और बिल्ड एनवायरमेंट की खास जानकारी दिखेगी:

    ============================================
    PLATFORM_VERSION_CODENAME=Baklava
    PLATFORM_VERSION=Baklava
    TARGET_PRODUCT=aosp_cf_x86_64_only_phone
    TARGET_BUILD_VARIANT=userdebug
    TARGET_ARCH=x86_64
    TARGET_ARCH_VARIANT=silvermont
    HOST_OS=linux
    HOST_OS_EXTRA=Linux-6.10.11-1rodete2-amd64-x86_64-Debian-GNU/Linux-rodete
    HOST_CROSS_OS=windows
    BUILD_ID=BP1A.250305.020
    OUT_DIR=out
    ============================================
    
  3. टारगेट बनाएं:

    m

पहले बिल्ड में कई घंटे लग सकते हैं. इसके बाद के बिल्ड में काफ़ी कम समय लगता है. आपके बिल्ड का आउटपुट, $OUT_DIR में दिखता है.

Cuttlefish ऐप्लिकेशन लॉन्च करना

Cuttlefish एक Android एमुलेटर है. इसका इस्तेमाल, आपके बिल्ड की जांच करने के लिए किया जाता है.

  1. होस्ट के Debian पैकेज डाउनलोड करने, बनाने, और इंस्टॉल करने के लिए, ये कमांड चलाएं:

    sudo apt install -y git devscripts equivs config-package-dev debhelper-compat golang curl
    git clone https://github.com/google/android-cuttlefish
    cd android-cuttlefish
    for dir in base frontend; do
    pushd $dir
    # Install build dependencies
    sudo mk-build-deps -i
    dpkg-buildpackage -uc -us
    popd
    done
    sudo dpkg -i ./cuttlefish-base_*_*64.deb || sudo apt-get install -f
    sudo dpkg -i ./cuttlefish-user_*_*64.deb || sudo apt-get install -f
    sudo usermod -aG kvm,cvdnetwork,render $USER
    sudo reboot

    रीबूट करने पर, अतिरिक्त कर्नेल मॉड्यूल इंस्टॉल होने लगते हैं और udev नियम लागू होते हैं.

  2. Cuttlefish लॉन्च करें:

    launch_cvd --daemon
    
  3. अपने वेब ब्राउज़र में https://localhost:8443 पर जाकर, Cuttlefish डिवाइस से कनेक्ट करें. आपका वर्चुअल Android डिवाइस दिखेगा.

बदलाव करें

changelist के इस उदाहरण का पालन करके, सोर्स कोड अपडेट करें.

  1. अपने चेकआउट (aosp/ डायरेक्ट्री) के रूट से, frameworks/native Git प्रोजेक्ट पर जाएं:

    cd frameworks/native
  2. इस निर्देश की मदद से, कुछ समय के लिए प्रोजेक्ट शुरू करें:

    repo start <some-name> .
  3. एडिटर का इस्तेमाल करके, यहां दी गई जगह पर SurfaceFlinger.cpp में बदलाव करें:

    aosp/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
    
  4. यह लाइन ढूंढें:

    void SurfaceFlinger::updateColorMatrixLocked() {
    
  5. updateColorMatrixLocked() की शुरुआत में यह लाइन जोड़ें:

    mClientColorMatrix = mat4(vec4{1.0f, 0.0f, 0.0f, 0.0f}, vec4{0.0f, -1.0f, 0.0f, 0.0f},
                             vec4{0.0f, 0.0f, -1.0f, 0.0f}, vec4{0.0f, 1.0f, 1.0f, 1.0f});
    
  6. कोड बनाएं:

    m
  7. डिवाइस पर मौजूद बिल्ड को अपडेट करें:

    adb root
    adb remount -R
    adb root
    adb sync
    adb reboot
  8. पुष्टि करें कि आपने जिस डिवाइस को चुना है उस पर रंग में बदलाव दिख रहा है. यह बदलाव, पहले चित्र में दिखाए गए रंग में बदलाव जैसा ही होना चाहिए.

    रंग बदलने का उदाहरण

    पहली इमेज. रंग बदलने के बाद स्क्रीन का दिखना

टेस्ट ठीक करना

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

जांच को चलाने, डीबग करने, और ठीक करने के लिए, इन निर्देशों का पालन करें:

  1. चलाएं:

    atest DevCodelabTest

    जांच पूरी नहीं हो पाती.

  2. काम न करने वाले टेस्ट के स्टैक ट्रेस की जांच करें:

    STACKTRACE:
    java.lang.AssertionError
     at org.junit.Assert.fail(Assert.java:87)
     at org.junit.Assert.assertTrue(Assert.java:42)
     at org.junit.Assert.assertTrue(Assert.java:53)
     at android.test.example.devcodelab.DevCodelabTest.testHelloWorld(DevCodelabTest.java:29)

    स्टैक ट्रेस की आखिरी लाइन में, वह टेस्ट दिखता है जो काम नहीं कर रहा है (testHelloWorld). यह टेस्ट DevCodelabTest.java नाम की फ़ाइल में है.

  3. ठीक किए जाने वाले टेस्ट की जगह का पता लगाने के लिए, स्टैक ट्रेस की आखिरी लाइन में WORKING_DIRECTORY/platform_testing/tests/example/devcodelab/src/ को जोड़ें. साथ ही, टेस्ट फ़ाइल के नाम तक जोड़ें. इसलिए, android.test.example.devcodelab.DevCodelabTest, WORKING_DIRECTORY/platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java हो जाता है.

  4. platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java में बदलाव करें और Assert.assertTrue(false) को Assert.assertTrue(true) से बदलें

  5. समस्या ठीक हो गई है या नहीं, इसकी पुष्टि करने के लिए टेस्ट को फिर से चलाएं:

    atest DevCodelabTest

समीक्षा के लिए अपना कोड अपलोड करना

Repo, git clone जैसे कमांड को एक साथ बंडल करके, Git का इस्तेमाल आसान बनाता है. इससे एक साथ कई Git रिपॉज़िटरी (या प्रोजेक्ट) पर काम किया जा सकता है.

Git में अपने प्रोजेक्ट के कोड की समीक्षा करने के लिए, Gerrit के वेब-आधारित कोड की समीक्षा करने वाले सिस्टम का इस्तेमाल करें.

  1. मान लें कि आपने frameworks/native प्रोजेक्ट में बदलाव किए हैं. बदलावों को अपलोड करने के लिए, ये निर्देश चलाएं:

    cd frameworks/native
    repo start codelab .
    git add .
    git commit
  2. कमिट मैसेज के लिए, यह जानकारी डालें:

    Android codelab change
    Test: manual atest
    
  3. बदलाव अपलोड करना:

    repo upload

    अगर आपका खाता लिंक हो जाता है, तो आपको इस तरह का मैसेज दिखेगा:

    Upload project frameworks/native/ to remote branch android15-qpr2-release:
     branch codelab ( 1 commit, Wed Aug 7 09:32:33 2019 -0700):
            ff46b36d android codelab change
    to https://android-review.googlesource.com/ (y/N)? y
    remote: Processing changes: refs: 1, new: 1, done
    remote:
    remote: SUCCESS
    remote:
    remote:   https://android-review.googlesource.com/c/platform/frameworks/native/+/1098432 android codelab change [NEW]
    remote:
    To https://android-review.googlesource.com/platform/frameworks/native
    * [new branch]          codelab -> refs/for/android15-qpr2-release
    

Gerrit में अपना बदलाव देखना

Gerrit में किया गया बदलाव देखने के लिए, टर्मिनल में लिंक आउटपुट पर जाएं. लिंक कुछ ऐसा दिखता है:

https://android-review.googlesource.com/c/platform/frameworks/native/+/1098432

बदलाव को पहले जैसा करना

आम तौर पर, जांच के बाद और समीक्षा और अनुमति मिलने पर, आप अपने बदलाव को Gerrit में सबमिट करते हैं और उसे रिपॉज़िटरी में मर्ज करते हैं. इसके बजाय, इस कोडलैब के लिए, अपने काम को पहले जैसा करें:

  1. Gerrit में, अबॉर्न करें पर क्लिक करें.

  2. frameworks/native प्रोजेक्ट डायरेक्ट्री (या उसकी सबडायरेक्ट्री) में, उससे जुड़ी अस्थायी शाखा को छोड़ दें:

    repo abandon codelab .
  3. टेस्ट फ़ाइल में किए गए बदलावों को पहले जैसा करें. आपने बदलाव के टेस्ट में repo start, git commit, और repo upload को नहीं चलाया है. इसलिए, फ़ाइल को खुद रीसेट किया जा सकता है. मान लें कि आप aosp/platform_testing directory में हैं, तो फ़ाइल को रीसेट करने के लिए, इस कमांड का इस्तेमाल करें:

    git reset HEAD tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
    git checkout .

इससे, Android प्लैटफ़ॉर्म डेवलपमेंट के लिए कोडलैब पूरा हो जाता है.

सहायता पाएं

अगर आपको इस कोडलैब के दौरान गड़बड़ियां आती हैं, तो किसी भी पेज पर सबसे नीचे मौजूद समस्या ट्रैकर लिंक का इस्तेमाल करके उनकी शिकायत करें. android-building ग्रुप में सवाल भेजें.

crosvm पहले से चल रहा है या नहीं, यह देखने के लिए ps -A | grep crosvm टाइप करें. अगर crossvm प्रोसेस चल रही है, तो प्रोसेस पीआईडी के साथ stop_cvd || true या kill crosvm प्रोसेस टाइप करें.