توسعه اندروید را امتحان کنید

این آموزش به شما امکان می‌دهد برای اولین بار توسعه سیستم عامل اندروید را امتحان کنید.

برای توسعه اندروید تنظیم کنید

قبل از دانلود و ساخت شاخه مانیفست android-latest-release از سورس اندروید، مطمئن شوید که سخت‌افزار شما الزامات لازم را برآورده می‌کند و نرم‌افزار مورد نیاز به درستی نصب شده است. همچنین باید با اصطلاحات زیر آشنا باشید:

گیت
گیت (Git) یک سیستم کنترل نسخه توزیع‌شده رایگان و متن‌باز است. اندروید از گیت برای عملیات محلی مانند شاخه‌بندی، کامیت‌ها، تفاوت‌ها و ویرایش‌ها استفاده می‌کند. برای کمک به یادگیری گیت، به مستندات گیت مراجعه کنید.
مخزن
Repo یک پوشش پایتون در اطراف Git است که انجام عملیات پیچیده را در چندین مخزن Git ساده می‌کند. Repo جایگزین Git برای همه عملیات کنترل نسخه نمی‌شود، بلکه فقط انجام عملیات پیچیده Git را آسان‌تر می‌کند. Repo از فایل‌های manifest برای تجمیع پروژه‌های Git در ابرپروژه اندروید استفاده می‌کند.
فایل مانیفست
یک فایل مانیفست، یک فایل XML است که مشخص می‌کند پروژه‌های مختلف Git در کد منبع اندروید، در کجای یک درخت کد منبع AOSP قرار دارند.

برآورده کردن نیازهای سخت‌افزاری

ایستگاه کاری توسعه شما باید این الزامات سخت‌افزاری را برآورده کند یا از آنها فراتر رود:

  • یک سیستم ۶۴ بیتی x86.

  • حداقل ۴۰۰ گیگابایت فضای دیسک خالی برای بررسی و ساخت کد (۲۵۰ گیگابایت برای بررسی + ۱۵۰ گیگابایت برای ساخت).

  • حداقل ۶۴ گیگابایت رم. گوگل از دستگاه‌های ۷۲ هسته‌ای با ۶۴ گیگابایت رم برای ساخت اندروید استفاده می‌کند. با این پیکربندی سخت‌افزاری، ساخت کامل اندروید تقریباً ۴۰ دقیقه و ساخت تدریجی اندروید فقط چند دقیقه طول می‌کشد. در مقابل، ساخت کامل با یک دستگاه ۶ هسته‌ای با ۶۴ گیگابایت رم تقریباً ۶ ساعت طول می‌کشد.

برآورده کردن الزامات سیستم عامل

ایستگاه کاری توسعه شما باید هر توزیع لینوکس ۶۴ بیتی با کتابخانه GNU C (glibc) 2.17 یا بالاتر را اجرا کند.

نصب بسته‌های مورد نیاز

برای نصب بسته‌های مورد نیاز برای اوبونتو ۱۸.۰۴ یا بالاتر، دستور زیر را اجرا کنید:

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 را نصب کرده باشید. آخرین نسخه اندروید با نسخه‌های از پیش ساخته شده OpenJDK، Make و Python 3 ارائه می‌شود، بنابراین مراحل نصب اضافی لازم نیست. بخش زیر نحوه نصب Repo را توضیح می‌دهد.

نصب مخزن

برای نصب Repo مراحل زیر را دنبال کنید:

  1. اطلاعات بسته فعلی را دانلود کنید:

    sudo apt-get update
  2. برای نصب لانچر Repo، دستور زیر را اجرا کنید:

    sudo apt-get install repo

    لانچر Repo یک اسکریپت پایتون ارائه می‌دهد که یک پرداخت را راه‌اندازی اولیه کرده و ابزار کامل 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

    خروجی باید نسخه ۲.۴ یا بالاتر را نشان دهد، برای مثال:

    repo launcher version 2.45

سورس اندروید را دانلود کنید

سورس اندروید در مجموعه‌ای از مخازن گیت که توسط گوگل میزبانی می‌شوند، قرار دارد. هر مخزن گیت شامل کل تاریخچه سورس اندروید، از جمله تغییرات سورس و زمان اعمال تغییرات است. برای دانلود سورس اندروید:

  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. اطلاعات کاربری گیت (نام، آدرس ایمیل) خود را وارد یا قبول کنید.

  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 شبیه‌ساز اندروید است که برای آزمایش نسخه‌های ساخته‌شده‌ی شما استفاده می‌شود.

  1. دستورات زیر را برای دانلود، ساخت و نصب بسته‌های میزبان دبیان اجرا کنید:

    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. راه اندازی ماهی مرکب:

    launch_cvd --daemon
    
  3. با رفتن به آدرس https://localhost:8443 در مرورگر وب خود، به دستگاه Cuttlefish متصل شوید. دستگاه مجازی اندروید شما نمایش داده می‌شود.

تغییر ایجاد کنید

کد منبع را طبق این مثال به‌روزرسانی کنید.

  1. از ریشه‌ی فایل پرداخت (دایرکتوری aosp/ )، به پروژه‌ی گیت frameworks/native بروید:

    cd frameworks/native
  2. با این دستور یک پروژه موقت را شروع کنید:

    repo start PROJECT_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. تأیید کنید که تغییر رنگی مشابه آنچه در شکل ۱ نشان داده شده است، در دستگاه انتخابی خود مشاهده می‌کنید.

    Example of a successful color
change

    شکل ۱. ظاهر صفحه پس از تغییر رنگ موفقیت‌آمیز

رفع یک تست

این بخش از آزمایشگاه کد از یک تست نمونه که در درخت منبع قرار دارد و با شکست مواجه شده است، استفاده می‌کند.

برای اجرا، اشکال‌زدایی و رفع مشکل تست، دستورالعمل‌های زیر را دنبال کنید:

  1. اجرا:

    atest DevCodelabTest

    آزمایش با شکست مواجه می‌شود.

  2. ردپای پشته (stack trace) مربوط به تست ناموفق را بررسی کنید:

    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/ را به آخرین خط stack trace تا نام فایل تست اضافه کنید. بنابراین، 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 را ساده می‌کند.

برای بررسی کد پروژه‌های خود در گیت، از سیستم بررسی کد مبتنی بر وب Gerrit استفاده کنید.

  1. با فرض اینکه تغییرات خود را در پروژه frameworks/native انجام داده‌اید، این دستورات را برای آپلود تغییرات خود اجرا کنید:

    cd frameworks/native
    repo start PROJECT_NAME.
    git add .
    git commit
  2. برای پیام کامیت خود، موارد زیر را وارد کنید:

    Android PROJECT_NAME. change
    Test: manual atest
    
  3. تغییر خود را آپلود کنید:

    repo upload

    اگر موفق شوید، پیامی شبیه به این خواهید دید:

    Upload project frameworks/native/ to remote branch android17-release:
     branch PROJECT_NAME. ( 1 commit, Wed Aug 7 09:32:33 2019 -0700):
            ff46b36d android PROJECT_NAME. 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 PROJECT_NAME. change [NEW]
    remote:
    To https://android-review.googlesource.com/platform/frameworks/native
    * [new branch]          PROJECT_NAME. -> refs/for/android17-release
    

مشاهده تغییر حساب خود در گریت

برای مشاهده تغییر خود در Gerrit، به خروجی لینک در ترمینال بروید. لینک مشابه لینک زیر است:

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

تغییر خود را برگردانید

معمولاً، پس از آزمایش و پس از بررسی و تأیید، تغییر خود را در Gerrit ارسال می‌کنید و آن را در مخزن ادغام می‌کنید. در عوض، برای اهداف این آزمایشگاه کد، کار خود را برگردانید:

  1. در گریت، روی «رها کردن» کلیک کنید.

  2. شاخه موقت مرتبط را در دایرکتوری پروژه frameworks/native (یا زیرشاخه‌های آن) رها کنید:

    repo abandon PROJECT_NAME.
  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 .

بدین ترتیب، آزمایشگاه کد برای توسعه پلتفرم اندروید تکمیل می‌شود.

کمک بگیرید

اگر در طول این آزمایش کد با خطایی مواجه شدید، آن را با استفاده از لینک ردیاب مشکلات در پایین هر صفحه گزارش دهید. سوالات خود را به گروه ساخت اندروید ارسال کنید.

برای دیدن اینکه آیا crosvm از قبل در حال اجرا است یا خیر، دستور ps -A | grep crosvm تایپ کنید. اگر crossvm در حال اجرا است، stop_cvd || true را تایپ کنید یا فرآیند kill crosvm .