يتيح لك هذا الدليل التعليمي تجربة تطوير نظام التشغيل 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 المختلفة في شجرة مصدر AOSP ضمن مصدر Android.
متطلبات أجهزة Meet
يجب أن تستوفي محطة عمل التطوير الحد الأدنى من متطلبات الأجهزة التالية أو تتجاوزها:
نظام x86 64 بت
يجب توفّر مساحة خالية على القرص لا تقل عن 400 غيغابايت لتسجيل الخروج من الرمز البرمجي وإنشائه (250 غيغابايت لتسجيل الخروج + 150 غيغابايت للإنشاء).
ذاكرة وصول عشوائي (RAM) بسعة 64 غيغابايت على الأقل تستخدم Google أجهزة ذات 72 نواة وذاكرة وصول عشوائي (RAM) بسعة 64 غيغابايت لإنشاء Android. باستخدام إعدادات الأجهزة هذه، يستغرق إنشاء إصدار كامل من Android حوالي 40 دقيقة، بينما يستغرق إنشاء إصدار جزئي من Android بضع دقائق فقط. في المقابل، يستغرق إنشاء إصدار كامل باستخدام جهاز مزوّد بـ 6 نوى وذاكرة وصول عشوائي بسعة 64 غيغابايت حوالي 6 ساعات.
استيفاء متطلبات نظام التشغيل
يجب أن يعمل جهاز التطوير بأي توزيعة Linux 64 بت مع الإصدار 2.17 أو إصدار أحدث من مكتبة GNU C (glibc).
تثبيت الحِزم المطلوبة
لتثبيت الحِزم المطلوبة لنظام التشغيل 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 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/
)، انتقِل إلى مشروع Gitframeworks/native
: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 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/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.
الحصول على مساعدة
إذا واجهت أخطاء أثناء استخدام هذا الدرس العملي، يُرجى الإبلاغ عنها باستخدام رابط Issue Tracker في أسفل أي صفحة. يمكنك إرسال الأسئلة إلى المجموعة android-building.
اكتب ps -A | grep crosvm
لمعرفة ما إذا كان crosvm
قيد التشغيل حاليًا. إذا كان crossvm
قيد التشغيل، اكتب stop_cvd || true
أو kill crosvm
العملية مع معرّف العملية.