این آموزش به شما امکان میدهد برای اولین بار توسعه سیستم عامل اندروید را امتحان کنید.
برای توسعه اندروید تنظیم کنید
قبل از دانلود و ساخت شاخه مانیفست 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 مراحل زیر را دنبال کنید:
اطلاعات بسته فعلی را دانلود کنید:
sudo apt-get updateبرای نصب لانچر Repo، دستور زیر را اجرا کنید:
sudo apt-get install repoلانچر Repo یک اسکریپت پایتون ارائه میدهد که یک پرداخت را راهاندازی اولیه کرده و ابزار کامل Repo را دانلود میکند.
اگر موفق شدید، به مرحله ۴ بروید.
(اختیاری) با استفاده از دستورات زیر، 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 را نصب میکند.
نسخه لانچر Repo را تأیید کنید:
repo versionخروجی باید نسخه ۲.۴ یا بالاتر را نشان دهد، برای مثال:
repo launcher version 2.45
سورس اندروید را دانلود کنید
سورس اندروید در مجموعهای از مخازن گیت که توسط گوگل میزبانی میشوند، قرار دارد. هر مخزن گیت شامل کل تاریخچه سورس اندروید، از جمله تغییرات سورس و زمان اعمال تغییرات است. برای دانلود سورس اندروید:
به دایرکتوری خانگی خود بروید:
cd ~یک زیرشاخهی کاری محلی درون آن ایجاد کنید:
mkdir aospبه دایرکتوری بروید:
cd aospمقداردهی اولیهی آخرین شاخهی انتشار کد منبع مخزن AOSP (
android-latest-release):repo init --partial-clone -b android-latest-release -u https://android.googlesource.com/platform/manifestاطلاعات کاربری گیت (نام، آدرس ایمیل) خود را وارد یا قبول کنید.
همگامسازی کد منبع:
repo sync -c -j8اگر در حین دانلود با مشکلی مواجه شدید، به عیبیابی و رفع مشکلات همگامسازی مراجعه کنید.
کد را بسازید
برای ساخت کد:
از درون دایرکتوری کاری خود، اسکریپت
envsetup.shرا برای تنظیم محیط ساخت خود، سورس کنید:source build/envsetup.shبا دستور
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 ============================================هدف را بسازید:
m
انتظار میرود که اولین ساخت ساعتها طول بکشد. ساختهای بعدی زمان بسیار کمتری میبرند. خروجی ساخت شما در $OUT_DIR ظاهر میشود.
راه اندازی ده پا
Cuttlefish شبیهساز اندروید است که برای آزمایش نسخههای ساختهشدهی شما استفاده میشود.
دستورات زیر را برای دانلود، ساخت و نصب بستههای میزبان دبیان اجرا کنید:
sudo apt install -y git devscripts equivs config-package-dev debhelper-compat golang curlgit clone https://github.com/google/android-cuttlefishcd android-cuttlefishfor dir in base frontend; do pushd $dir # Install build dependencies sudo mk-build-deps -i dpkg-buildpackage -uc -us popd donesudo dpkg -i ./cuttlefish-base_*_*64.deb || sudo apt-get install -fsudo dpkg -i ./cuttlefish-user_*_*64.deb || sudo apt-get install -fsudo usermod -aG kvm,cvdnetwork,render $USERsudo rebootراهاندازی مجدد، نصب ماژولهای هسته اضافی را آغاز میکند و قوانین
udevرا اعمال میکند.راه اندازی ماهی مرکب:
launch_cvd --daemonبا رفتن به آدرس
https://localhost:8443در مرورگر وب خود، به دستگاه Cuttlefish متصل شوید. دستگاه مجازی اندروید شما نمایش داده میشود.
تغییر ایجاد کنید
کد منبع را طبق این مثال بهروزرسانی کنید.
از ریشهی فایل پرداخت (دایرکتوری
aosp/)، به پروژهی گیتframeworks/nativeبروید:cd frameworks/nativeبا این دستور یک پروژه موقت را شروع کنید:
repo start PROJECT_NAME.با استفاده از ویرایشگر خود،
SurfaceFlinger.cppدر مسیر زیر ویرایش کنید:aosp/frameworks/native/services/surfaceflinger/SurfaceFlinger.cppاین خط را پیدا کنید:
void SurfaceFlinger::updateColorMatrixLocked() {این خط را در ابتدای
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});کد را بسازید:
mنسخه موجود در دستگاه را بهروزرسانی کنید:
adb rootadb remount -Radb rootadb syncadb rebootتأیید کنید که تغییر رنگی مشابه آنچه در شکل ۱ نشان داده شده است، در دستگاه انتخابی خود مشاهده میکنید.

شکل ۱. ظاهر صفحه پس از تغییر رنگ موفقیتآمیز
رفع یک تست
این بخش از آزمایشگاه کد از یک تست نمونه که در درخت منبع قرار دارد و با شکست مواجه شده است، استفاده میکند.
برای اجرا، اشکالزدایی و رفع مشکل تست، دستورالعملهای زیر را دنبال کنید:
اجرا:
atest DevCodelabTestآزمایش با شکست مواجه میشود.
ردپای پشته (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قرار دارد.برای تعیین محل تستی که باید اصلاح شود،
WORKING_DIRECTORY /platform_testing/tests/example/devcodelab/src/را به آخرین خط stack trace تا نام فایل تست اضافه کنید. بنابراین،android.test.example.devcodelab.DevCodelabTestWORKING_DIRECTORY /platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.javaتبدیل میشود.platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.javaرا ویرایش کنید وAssert.assertTrue(false)را باAssert.assertTrue(true)جایگزین کنید.برای تأیید رفع مشکل، دوباره تست را اجرا کنید:
atest DevCodelabTest
کد خود را برای بررسی آپلود کنید
Repo با دستهبندی دستوراتی مانند git clone برای کار همزمان در چندین مخزن (یا پروژه) Git، استفاده از Git را ساده میکند.
برای بررسی کد پروژههای خود در گیت، از سیستم بررسی کد مبتنی بر وب Gerrit استفاده کنید.
با فرض اینکه تغییرات خود را در پروژه
frameworks/nativeانجام دادهاید، این دستورات را برای آپلود تغییرات خود اجرا کنید:cd frameworks/nativerepo start PROJECT_NAME.git add .git commitبرای پیام کامیت خود، موارد زیر را وارد کنید:
Android PROJECT_NAME. change Test: manual atestتغییر خود را آپلود کنید:
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 ارسال میکنید و آن را در مخزن ادغام میکنید. در عوض، برای اهداف این آزمایشگاه کد، کار خود را برگردانید:
در گریت، روی «رها کردن» کلیک کنید.
شاخه موقت مرتبط را در دایرکتوری پروژه
frameworks/native(یا زیرشاخههای آن) رها کنید:repo abandon PROJECT_NAME.تغییراتی که در فایل آزمایشی ایجاد کردهاید را به حالت اولیه برگردانید. از آنجایی که
repo start،git commitوrepo uploadدر تغییر آزمایشی اجرا نکردهاید، میتوانید خود فایل را مجدداً تنظیم کنید. با فرض اینکه درaosp/platform_testing directoryهستید، از دستور زیر برای تنظیم مجدد فایل استفاده کنید:git reset HEAD tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.javagit checkout .
بدین ترتیب، آزمایشگاه کد برای توسعه پلتفرم اندروید تکمیل میشود.
کمک بگیرید
اگر در طول این آزمایش کد با خطایی مواجه شدید، آن را با استفاده از لینک ردیاب مشکلات در پایین هر صفحه گزارش دهید. سوالات خود را به گروه ساخت اندروید ارسال کنید.
برای دیدن اینکه آیا crosvm از قبل در حال اجرا است یا خیر، دستور ps -A | grep crosvm تایپ کنید. اگر crossvm در حال اجرا است، stop_cvd || true را تایپ کنید یا فرآیند kill crosvm .