התנסות בפיתוח ל-Android

המדריך הזה מאפשר לכם לנסות לפתח למערכת ההפעלה Android בפעם הראשונה.

הגדרה לפיתוח ל-Android

לפני שמורידים ויוצרים את android-latest-release ענף המניפסט של מקור Android, צריך לוודא שהחומרה עומדת בדרישות הדרושות ושהתוכנה הנדרשת מותקנת בצורה תקינה. חשוב גם להכיר את המונחים הבאים:

Git
Git היא מערכת חינמית לניהול גרסאות בקוד פתוח. ‫Android משתמשת ב-Git לפעולות מקומיות כמו יצירת ענפים, התחייבויות, הבדלים ועריכות. לקבלת עזרה בלימוד Git, אפשר לעיין במסמכי התיעוד של Git.
Repo
Repo הוא wrapper של Python סביב Git שמפשט ביצוע של פעולות מורכבות בכמה מאגרי Git. ‫Repo לא מחליף את Git בכל הפעולות של בקרת גרסאות, אלא רק מקל על ביצוע פעולות מורכבות ב-Git. ‫Repo משתמש בקובצי מניפסט כדי לצבור פרויקטים של Git בפרויקט העל של Android.
קובץ מניפסט
קובץ מניפסט הוא קובץ XML שמציין איפה ממוקמים הפרויקטים השונים של Git במקור של Android בתוך עץ המקור של AOSP.

דרישות לציוד ל-Meet

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

  • מערכת x86 בגרסת 64 ביט.

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

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

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

במחשב העבודה שלכם לפיתוח צריך להיות מותקן כל הפצת 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 launcher:

    sudo apt-get install repo

    הכלי Repo launcher מספק סקריפט 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 launcher.

  4. בודקים את הגרסה של Repo launcher:

    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

    יופיע תקציר של סביבת היעד וה-build:

    ============================================
    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 <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. איך המסך נראה אחרי שינוי הצבע

פתרון בעיות בניסוי

החלק הזה של ה-codelab מתבסס על דוגמה לבדיקה שנמצאת בעץ המקור ונכשלת.

כדי להריץ את הבדיקה, לנפות באגים ולתקן אותה, פועלים לפי ההוראות הבאות:

  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 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 וממזגים אותו למאגר. במקום זאת, לצורך ה-codelab הזה, צריך לבטל את השינויים שביצעתם:

  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.

עזרה

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

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