להתנסות בפיתוח של 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 כדי לבצע איסוף (checkout) של הקוד ולבנות אותו (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. ההסתעפות הראשית של Android ב-AOSP מגיעה עם גרסאות מוכנות מראש של OpenJDK,‏ Make ו-Python 3, כך שאין צורך לבצע שלבי התקנה נוספים. בקטע הבא מוסבר איך להתקין את Repo.

התקנת המאגר

כדי להתקין את Repo:

  1. מורידים את פרטי החבילה הנוכחיים:

    sudo apt-get update
  2. מריצים את הפקודה הבאה כדי להתקין את מרכז האפליקציות של Repo:

    sudo apt-get install repo

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