يتيح لك هذا البرنامج التعليمي تجربة تطوير نظام التشغيل Android لأول مرة.
الإعداد لتطوير Android
قبل تنزيل الإصدار main
من مصدر Android وإنشاءه، تأكَّد من أنّه
تستوفي الأجهزة المتطلبات اللازمة
وأنّه تم تثبيت البرامج المطلوبة بشكل صحيح. يجب أن تكون أيضًا على دراية بالأحكام التالية:
- Git
- Git هو نظام تحكم في الإصدارات موزّع ومفتوح المصدر. يستخدم نظام التشغيل Android Git لإجراء العمليات المحلية، مثل إنشاء الفروع وعمليات الحفظ ومقارنة الملفات والتعديلات. للحصول على مساعدة في تعلُّم Git، يُرجى الرجوع إلى مستندات Git.
- Repo
- Repo هو حزمة Python حول Git تعمل على تبسيط تنفيذ العمليات المعقدة في مستودعات Git المتعددة. لا يحل Repo محل Git لجميع عمليات التحكم في الإصدار، بل يجعل فقط عمليات Git المعقدة أسهل في التنفيذ. يستخدم Repo ملفات البيان لتجميع مشاريع Git في المشروع الفائق لنظام التشغيل Android.
- ملف البيان
- ملف البيان هو ملف XML يحدِّد مكان وضع مشاريع Git المختلفة في مصدر Android ضمن شجرة مصدر AOSP.
متطلبات أجهزة Meet
يجب أن تستوفي محطة عمل التطوير متطلبات الأجهزة التالية أو تتجاوزها:
نظام تشغيل 64 بت × 86
مساحة خالية على القرص لا تقل عن 400 غيغابايت لفحص الرمز البرمجي وإنشاءه (250 غيغابايت لفحص الرمز البرمجي + 150 غيغابايت لإنشاءه)
ذاكرة وصول عشوائي (RAM) بسعة 64 غيغابايت على الأقل تستخدم Google أجهزة تتضمّن 72 نواة وذاكرة وصول عشوائي (RAM) بسعة 64 غيغابايت لإنشاء نظام التشغيل Android. باستخدام إعدادات الأجهزة هذه، يستغرق ملف Android الكامل نحو 40 دقيقة، بينما يستغرق ملف Android المتزايد بضع دقائق فقط. في المقابل، يستغرق الإصدار الكامل باستخدام جهاز مزوّد بـ 6 نوى وذاكرة وصول عشوائي بسعة 64 غيغابايت حوالي 6 ساعات.
استيفاء متطلبات نظام التشغيل
يجب أن تعمل محطة عمل التطوير على أي إصدار من توزيعات Linux بسعة 64 بت مع مكتبة 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. يتضمّن الفرع الرئيسي من AOSP لنظام التشغيل Android إصدارات مُسبقة الإنشاء من OpenJDK وMake وPython 3، لذا لا يلزم اتّباع خطوات تثبيت إضافية. يوضّح القسم التالي كيفية تثبيت Repo.
تثبيت Repo
اتّبِع الخطوات التالية لتثبيت Repo:
تنزيل معلومات الحزمة الحالية:
sudo apt-get update
شغِّل الأمر التالي لتثبيت مشغِّل Repo:
sudo apt-get install repo
يقدّم مشغّل Repo نصًا برمجيًا بلغة Python يُنشئ عملية فحص وينزّل أداة Repo الكاملة.
إذا نجحت، انتقِل إلى الخطوة 4.
(اختياري) يمكنك تثبيت 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
ويجب أن تشير المخرجات إلى إصدار 2.4 أو إصدار أحدث، على سبيل المثال:
repo launcher version 2.45
تنزيل رمز المصدر لنظام التشغيل Android
يمكن العثور على مصدر Android في مجموعة من مستودعات Git التي تستضيفها Google. يشتمل كل مستودع من مستودعات Git على السجلّ الكامل لمصدر Android، بما في ذلك التغييرات التي تم إجراؤها على المصدر ووقت إجراء التغييرات. لتنزيل ملف رمز المصدر لنظام التشغيل Android:
انتقِل إلى الدليل الرئيسي:
cd ~
أنشئ دليلاً فرعيًا محليًا للعمل ضمنه:
mkdir aosp
انتقِل إلى الدليل:
cd aosp
نفِّذ الفرع الرئيسي لرمز المصدر لمستودع AOSP (الإعداد التلقائي):
repo init --partial-clone -b main -u https://android.googlesource.com/platform/manifest
أدخِل بيانات اعتماد Git (الاسم وعنوان البريد الإلكتروني) أو اقبل هذه البيانات.
مزامنة رمز المصدر:
repo sync -c -j8
إذا واجهت أي مشاكل أثناء التنزيل، يُرجى الاطّلاع على مقالة تحديد مشاكل المزامنة وحلّها.
إنشاء الرمز
لإنشاء الرمز:
من داخل دليل العمل، استخدِم النص البرمجي "
envsetup.sh
" لإعداد بيئة التصميم:source build/envsetup.sh
حدِّد نوع جهاز مستهدَف لإنشاء تطبيق باستخدام الأمر
lunch
. الهدف هو ترتيب جهاز، مثل طراز أو شكل محدّدَين. حدِّد هذا الاستهداف: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 ============================================
إنشاء الاستهداف:
m
من المتوقّع أن تستغرق عملية الإنشاء الأولى ساعات. تستغرق عمليات الإنشاء اللاحقة وقتًا
أقصر بكثير. تظهر نتيجة عملية الإنشاء في
$OUT_DIR
.
إطلاق Cuttlefish
Cuttlefish هو محاكي Android المستخدَم لاختبار إصداراتك.
شغِّل الأوامر التالية لتنزيل حزم 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
القواعد.إطلاق Cuttlefish:
launch_cvd --daemon
يمكنك الاتصال بجهاز Cuttlefish من خلال الانتقال إلى
https://localhost:8443
في متصفّح الويب. يتم عرض جهاز Android الظاهري.
تغيير
عدِّل الرمز المصدر باتّباع مثال قائمة التغييرات هذا.
من جذر عملية الفحص (الدليل
aosp/
)، انتقِل إلىframeworks/native
مشروع Git:cd frameworks/native
ابدأ مشروعًا مؤقتًا باستخدام الأمر التالي:
repo start <some-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 root
adb remount -R
adb root
adb sync
adb reboot
تأكَّد من ظهور تغيير في اللون على الجهاز المحدَّد يشبه ما هو معروض في الشكل 1.
الشكل 1: مظهر الشاشة بعد تغيير اللون بنجاح
إصلاح اختبار
يستخدِم هذا الجزء من الدرس التطبيقي نموذج اختبار في شجرة المصدر والذي يتعذّر إكماله.
لإجراء الاختبار وتصحيح الأخطاء وإصلاحها، يجب اتّباع التعليمات التالية:
تنفيذ:
atest DevCodelabTest
تعذّر إكمال الاختبار.
فحص تتبُّع تسلسل استدعاء الدوال البرمجية للاختبار الذي تعذّر إكماله:
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/
إلى آخر سطر من تتبع تسلسل استدعاء الدوال البرمجية حتى اسم ملف الاختبار ، بما في ذلك. وبالتالي، يصبحandroid.test.example.devcodelab.DevCodelabTest
WORKING_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 من خلال تجميع الأوامر، مثل git clone
، للعمل
على العديد من مستودعات Git (أو مشاريعها) في آنٍ واحد.
لمراجعة الرموز البرمجية لمشاريعك في Git، استخدِم نظام مراجعة الرموز المستنِدة إلى الويب Gerrit.
على افتراض أنّك أجريت التغييرات في مشروع
frameworks/native
، نفِّذ هذه الأوامر لتحميل التغييرات:cd frameworks/native
repo start codelab .
git add .
git commit
أدخِل ما يلي في رسالة الإضافة:
Android codelab change Test: manual atest
حمِّل التغيير:
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 ودمجه في المستودع. بدلاً من ذلك، لأغراض هذا مختبر الرموز البرمجية، يمكنك الرجوع إلى عملك:
في Gerrit، انقر على تخلّي.
التخلي عن الفرع المؤقت المرتبط في دليل مشروع
frameworks/native
(أو أدلته الفرعية):repo abandon codelab .
إلغاء التغييرات التي أجريتها على الملف التجريبي بما أنّك لم تشغِّل
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.
اكتب ps -A | grep crosvm
لمعرفة ما إذا كان crosvm
قيد التشغيل. إذا كان crossvm
قيد التشغيل، اكتب عملية stop_cvd || true
أو kill crosvm
باستخدام معرّف العملية.