تجربة تطوير تطبيقات Android

يتيح لك هذا البرنامج التعليمي تجربة تطوير نظام التشغيل 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.

استيفاء متطلبات الجهاز

يجب أن يستوفي جهاز محطة العمل المخصّص للتطوير متطلبات الجهاز التالية أو أن يكون أفضل منها:

  • نظام x86‏ 64 بت

  • مساحة خالية على القرص لا تقل عن 400 غيغابايت لاستخراج الرمز وتجميعه (250 غيغابايت لاستخراج الرمز + 150 غيغابايت للتجميع)

  • ذاكرة وصول عشوائي (RAM) بسعة 64 غيغابايت على الأقل تستخدم Google أجهزة ذات 72 نواة وذاكرة وصول عشوائي بسعة 64 غيغابايت لتجميع Android. باستخدام إعدادات الجهاز هذه، يستغرق التجميع الكامل لنظام Android حوالي 40 دقيقة، بينما يستغرق التجميع الإضافي لنظام Android بضع دقائق فقط. في المقابل، يستغرق التجميع الكامل حوالي 6 ساعات باستخدام جهاز ذي 6 نوى وذاكرة وصول عشوائي بسعة 64 غيغابايت.

استيفاء متطلبات نظام التشغيل

يجب أن تعمل محطة العمل المخصّصة للتطوير على أي توزيعة 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:

  1. نزِّل معلومات الحزمة الحالية:

    sudo apt-get update
  2. شغِّل الأمر التالي لتثبيت مشغِّل Repo:

    sudo apt-get install repo

    يوفّر مشغِّل Repo نصًا برمجيًا بلغة Python يبدأ عملية استخراج وينزّل أداة Repo الكاملة.

    إذا نجحت العملية، انتقِل إلى الخطوة 4.

  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

    يجب أن تشير النتيجة إلى الإصدار 2.4 أو إصدار أحدث، مثلاً:

    repo launcher version 2.45

تنزيل مصدر Android

يقع مصدر Android في مجموعة من مستودعات Git التي تستضيفها Google. يتضمّن كل مستودع Git السجلّ الكامل لمصدر Android، بما في ذلك التغييرات التي تم إجراؤها على المصدر وتاريخ إجراء هذه التغييرات. لتنزيل مصدر Android:

  1. انتقِل إلى دليل الصفحة الرئيسية:

    cd ~
  2. أنشئ دليلاً فرعيًا محليًا للعمل ضِمنه:

    mkdir aosp
  3. انتقِل إلى الدليل:

    cd aosp
  4. ابدأ أحدث فرع إصدار (android-latest-release) من رمز مصدر مستودع AOSP:

    repo init --partial-clone -b android-latest-release -u https://android.googlesource.com/platform/manifest
  5. أدخِل بيانات اعتماد Git (الاسم وعنوان البريد الإلكتروني) أو اقبلها.

  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

Cuttlefish هو المحاكي الذي يتم استخدامه لاختبار عمليات التجميع.

  1. شغِّل الأوامر التالية لتنزيل حِزم 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

    تؤدي عملية إعادة التشغيل إلى تثبيت وحدات kernel إضافية وتطبيق قواعد udev.

  2. أطلِق Cuttlefish:

    launch_cvd --daemon
    
  3. اتّصِل بجهاز Cuttlefish من خلال الانتقال إلى https://localhost:8443 في متصفّح الويب. يظهر جهازك الافتراضي الذي يعمل بنظام Android.

تغيير

عدِّل الرمز المصدر باتّباع قائمة التغييرات النموذجية هذه changelist.

  1. من جذر عملية الاستخراج (الدليل aosp/)، انتقِل إلى مشروع Git‏ 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. تأكَّد من ظهور تغيير في اللون على الجهاز الذي اخترته مشابه لما هو موضّح في الشكل 1.

    مثال على تغيير ناجح في اللون

    الشكل 1: مظهر الشاشة بعد تغيير اللون بنجاح

إصلاح اختبار

يستخدم هذا الجزء من الدرس التطبيقي حول الترميز اختبارًا نموذجيًا موجودًا في شجرة المصدر ويتعذّر تنفيذه.

لتشغيل الاختبار وتصحيحه وإصلاحه، اتّبِع التعليمات التالية:

  1. التشغيل:

    atest DevCodelabTest

    يتعذّر تنفيذ الاختبار.

  2. افحص تتبُّع تسلسل استدعاء الدوال البرمجية للاختبار الذي تعذّر تنفيذه:

    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/ بالسطر الأخير من تتبُّع تسلسل استدعاء الدوال حتى اسم ملف الاختبار ضِمنه. وبذلك، يصبح 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 من خلال تجميع الأوامر، مثل 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

لعرض التغيير في Gerrit، انتقِل إلى الرابط الذي يظهر في المحطة الطرفية. يكون الرابط مشابهًا لما يلي:

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

التراجع عن التغيير

عادةً، بعد الاختبار وعند المراجعة والموافقة، يمكنك إرسال التغيير في Gerrit ودمجه في المستودع. بدلاً من ذلك، لأغراض هذا الدرس التطبيقي حول الترميز، تراجَع عن عملك:

  1. في Gerrit، انقر على تجاهُل.

  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 .

بهذا تنتهي عملية إكمال الدرس التطبيقي حول الترميز لتطوير منصة Android.

الحصول على مساعدة

إذا واجهتك أخطاء أثناء هذا الدرس التطبيقي حول الترميز، أبلِغ عنها باستخدام الـ رابط أداة تتبُّع المشاكل في أسفل أي صفحة. أرسِل الأسئلة إلى مجموعة android-building.

اكتب ps -A | grep crosvm لمعرفة ما إذا كان crosvm قيد التشغيل حاليًا. إذا كان crossvm قيد التشغيل، اكتب stop_cvd || true أو kill crosvm مع معرّف العملية (PID).