تجربة تطوير تطبيقات 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 المختلفة في شجرة مصدر 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:

  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 (android-latest-release):

    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 هو محاكي 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/)، انتقِل إلى مشروع 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.

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

إذا واجهت أخطاء أثناء هذا الدرس العملي، يمكنك الإبلاغ عنها باستخدام رابط Issue Tracker في أسفل أي صفحة. يمكنك إرسال الأسئلة إلى المجموعة android-building.

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