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

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

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

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

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

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

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

  • 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 की AOSP मुख्य शाखा में, पहले से बने 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

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

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

    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 रिपॉज़िटरी के सोर्स कोड की मुख्य शाखा (डिफ़ॉल्ट) को शुरू करना:

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

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

    repo sync -c -j8

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

कोड बनाएं

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

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

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

    lunch aosp_cf_x86_64_phone-trunk_staging-userdebug

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

    ============================================
    PLATFORM_VERSION_CODENAME=VanillaIceCream
    PLATFORM_VERSION=VanillaIceCream
    PRODUCT_INCLUDE_TAGS=com.android.mainline
    TARGET_PRODUCT=aosp_arm
    TARGET_BUILD_VARIANT=eng
    TARGET_ARCH=arm
    TARGET_ARCH_VARIANT=armv7-a-neon
    TARGET_CPU_VARIANT=generic
    HOST_OS=linux
    HOST_OS_EXTRA=Linux-6.5.13-1rodete2-amd64-x86_64-Debian-GNU/Linux-rodete
    HOST_CROSS_OS=windows
    BUILD_ID=AOSP.MAIN
    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 main:
     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/main
    

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 प्रोसेस टाइप करें.