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

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

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

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

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

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

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

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

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

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

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

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

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

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 वर्शन वाला वर्चुअल डिवाइस दिखेगा.

बदलाव करें

इस उदाहरण बदलाव की सूची के मुताबिक, सोर्स कोड को अपडेट करें.

  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 का इस्तेमाल करना आसान बनाता है. इसके लिए, यह git clone जैसी कमांड को बंडल करता है, ताकि एक साथ कई 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 android16-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/android16-release
    

Gerrit में किए गए बदलाव देखें

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

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

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

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

  1. Gerrit में, Abandon पर क्लिक करें.

  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 ग्रुप को सवाल भेजें.

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