להתנסות בפיתוח של 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.

עמידה בדרישות החומרה

תחנת העבודה של הפיתוח צריכה לעמוד בדרישות החומרה הבאות:

  • מערכת x86 של 64 ביט.

  • שטח פנוי בנפח 400GB לפחות כדי לבצע צ'ק-אאוט של הקוד ולבנות אותו (250GB לצ'ק-אאוט + 150GB לבנייה).

  • זיכרון RAM בנפח 64GB לפחות. Google משתמשת במכונות עם 72 ליבות ו-64GB של זיכרון RAM כדי לפתח את Android. עם הגדרת החומרה הזו, יצירת גרסה מלאה של Android נמשכת כ-40 דקות, ויצירת גרסה מצטברת של Android נמשכת רק כמה דקות. לעומת זאת, תהליך build מלא נמשך כ-6 שעות במכונה עם 6 ליבות ו-64GB של RAM.

עמידה בדרישות של מערכת ההפעלה

בתחנת הפיתוח צריכה לפעול כל הפצה של 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, Maker ו-Python 3, כך שאין צורך לבצע פעולות התקנה נוספות. בקטע הבא מוסבר איך להתקין את 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 לקובץ ומאמתות שהמפתח שסופק תואם למפתח הנדרש. אם הפקודות האלה מצליחות, הפקודה הסופית מתקינה את מרכז האפליקציות של המאגר.

  4. איך מאמתים את גרסת מרכז האפליקציות:

    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. בתיקיית העבודה, מגדירים את סביבת ה-build באמצעות הסקריפט envsetup.sh:

    source build/envsetup.sh
  2. מציינים את סוג המכשיר היעד ליצירת גרסה build באמצעות הפקודה lunch. יעד הוא חלוקה של מכשיר, כמו מודל ספציפי או גורם צורה. מציינים את היעד הזה:

    lunch aosp_cf_x86_64_phone-trunk_staging-userdebug

    אמור להופיע סיכום של היעד ושל סביבת ה-build:

    ============================================
    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

תהליך ה-build הראשון עשוי להימשך שעות. יצירת גרסאות build נוספות אורכת זמן קצר יותר. הפלט של ה-build מופיע ב-$OUT_DIR.

הפעלת Cuttlefish

Cuttlefish הוא אמולטור Android שמשמש לבדיקת גרסאות build.

  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. מהשורש של ה-checkout (הספרייה 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. בודקים את נתיב הקריאה ב-stack של הבדיקה שנכשלה:

    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, לוחצים על Abandon (נטישה).

  2. משאירים את ההסתעפות הזמנית המשויכת בספריית הפרויקט frameworks/native (או בספריות המשנה שלה):

    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 .

סיימתם את ה-Codelab לפיתוח פלטפורמת Android.

עזרה

אם תיתקלו בשגיאות במהלך הקודלאב, תוכלו לדווח עליהן באמצעות הקישור Issue Tracker שבתחתית כל דף. שולחים שאלות לקבוצה android-building.

צריך להקליד ps -A | grep crosvm כדי לראות אם crosvm כבר פועל. אם crossvm פועל, מקלידים stop_cvd || true או kill crosvm process עם PID של התהליך.