يتيح لك هذا الدليل التعليمي تجربة تطوير نظام التشغيل Android لأول مرة.
الإعداد لتطوير تطبيقات Android
قبل تنزيل فرع بيان android-latest-release من
مصدر Android وإنشاءه، تأكَّد من استيفاء جهازك
للمتطلبات اللازمة ومن تثبيت
البرامج المطلوبة بشكل صحيح. يجب أيضًا أن تكون على
دراية بالأحكام التالية:
- Git
- Git هو نظام تحكم في الإصدارات موزّع ومفتوح المصدر. يستخدم Android Git لإجراء عمليات محلية، مثل إنشاء الفروع وعمليات الإضافة ومقارنة الملفات والتعديلات. للحصول على مساعدة في تعلُّم Git، يُرجى الرجوع إلى مستندات Git.
- Repo
- Repo هو حزمة Python حول Git تعمل على تبسيط تنفيذ العمليات المعقدة في مستودعات Git المتعددة. لا يحلّ Repo محلّ Git في جميع عمليات التحكّم في الإصدارات، بل يسهّل فقط تنفيذ عمليات Git المعقّدة. يستخدم Repo ملفات البيان لتجميع مشاريع Git في المشروع الفائق لنظام التشغيل Android.
- ملف البيان
- ملف البيان هو ملف XML يحدِّد مكان وضع مشاريع Git المختلفة في مصدر Android ضمن شجرة مصدر AOSP.
متطلبات أجهزة Meet
يجب أن تستوفي محطة عمل التطوير متطلبات الأجهزة التالية أو تتجاوزها:
نظام x86 64 بت
مساحة خالية على القرص لا تقل عن 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. يتضمّن أحدث إصدار من 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 (
android-latest-release):repo init --partial-clone -b android-latest-release -u https://android.googlesource.com/platform/manifestأدخِل بيانات اعتماد Git (الاسم وعنوان البريد الإلكتروني) أو اقبل هذه البيانات.
مزامنة رمز المصدر:
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
Cuttlefish هو محاكي Android المستخدَم لاختبار إصداراتك.
شغِّل الأوامر التالية لتنزيل حزم Debian الخاصة بالمضيف وإنشاءها وتثبيتها:
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القواعد.إطلاق 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 rootadb remount -Radb rootadb syncadb 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.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 من خلال تجميع أوامر مثل git clone للعمل
في العديد من مستودعات Git (أو المشاريع) في آنٍ واحد.
لمراجعة الرموز البرمجية لمشاريعك في Git، استخدِم نظام مراجعة الرموز البرمجية المستنِد إلى الويب Gerrit.
على افتراض أنّك أجريت التغييرات في مشروع
frameworks/native، نفِّذ هذه الأوامر لتحميل التغييرات:cd frameworks/nativerepo start codelab .git add .git commitبالنسبة إلى رسالة التعليق، أدخِل ما يلي:
Android codelab change Test: manual atestحمِّل التغيير:
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 ودمجه في المستودع. بدلاً من ذلك، لأغراض هذا مختبر الرموز البرمجية، أعِد عملك:
في Gerrit، انقر على التخلي.
تخلَّ عن الفرع المؤقت المرتبط في ملف
frameworks/nativedirectory (أو أدلةه الفرعية):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.javagit checkout .
بذلك، تكون قد أكملت الدرس التطبيقي حول تطوير نظام Android الأساسي.
الحصول على مساعدة
إذا واجهت أخطاء أثناء هذا الدليل التعليمي حول رموز البرامج، يُرجى الإبلاغ عنها باستخدام رابط تتبُّع المشاكل في أسفل أي صفحة. أرسِل الأسئلة إلى مجموعة android-building.
اكتب ps -A | grep crosvm لمعرفة ما إذا كان crosvm قيد التشغيل. إذا كانcrossvm
قيد التشغيل، اكتب عملية stop_cvd || true أو kill crosvm باستخدام معرّف العملية.