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

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

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

  • نظام x86‏ 64 بت

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

  • ذاكرة وصول عشوائي (RAM) بسعة 64 غيغابايت على الأقل تستخدم Google أجهزة تتضمّن 72 نواة وذاكرة وصول عشوائي (RAM) بسعة 64 غيغابايت لإنشاء نظام التشغيل Android. باستخدام إعدادات الأجهزة هذه، يستغرق ملف Android الكامل نحو 40 دقيقة، بينما يستغرق ملف Android المتزايد بضع دقائق فقط. وفي المقابل، يستغرق الأمر حوالي 6 ساعات للحصول على إصدار كامل مع جهاز سداسي النواة وذاكرة وصول عشوائي (RAM) بسعة 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. يتضمّن الفرع الرئيسي من AOSP لنظام التشغيل 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. ابدأ الفرع الرئيسي لرمز المصدر في مستودع AOSP (التلقائي):

    repo init --partial-clone -b main -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_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
    ============================================
    
  3. وضع الهدف:

    m

من المتوقّع أن يستغرق إنشاء الإصدار الأول ساعات. وتستغرق عمليات الإنشاء اللاحقة وقتًا أقل بكثير تظهر نتيجة إصدارك في $OUT_DIR.

إطلاق Cuttlefish

Cuttlefish هو محاكي Android المستخدَم لاختبار إصداراتك.

  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

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

  2. إطلاق Cuttlefish:

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

تغيير

عدِّل رمز المصدر باتّباع المثال التالي قائمة التغييرات.

  1. من جذر عملية الفحص (الدليل aosp/)، انتقِل إلى frameworks/native مشروع Git:

    cd frameworks/native
  2. ابدأ مشروعًا مؤقتًا باستخدام الأمر التالي:

    repo start <some-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 codelab .
    git add .
    git commit
  2. أدخِل ما يلي في رسالة الإضافة:

    Android codelab change
    Test: manual atest
    
  3. حمِّل التغيير:

    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 ودمجه في المستودع. بدلاً من ذلك، لأغراض هذا مختبر الرموز البرمجية، يمكنك الرجوع إلى عملك:

  1. في Gerrit، انقر على تخلّي.

  2. تخلَّ عن الفرع المؤقت المرتبط في ملف frameworks/native directory (أو أدلةه الفرعية):

    repo abandon codelab .
  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.

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