המדריך הזה מאפשר לכם לנסות לפתח מערכת הפעלה של 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:
מורידים את פרטי החבילה הנוכחיים:
sudo apt-get update
מריצים את הפקודה הבאה כדי להתקין את מרכז האפליקציות של Repo:
sudo apt-get install repo
במרכז האפליקציות של ה-Repo יש סקריפט Python שמפעיל תהליך תשלום ומוריד את כלי ה-Repo המלא.
אם הפעולה מסתיימת ללא שגיאות, מדלגים לשלב 4.
(אופציונלי) מתקינים את 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 version
הפלט צריך לכלול גרסה 2.4 ומעלה, לדוגמה:
repo launcher version 2.45
הורדת קוד המקור של Android
המקור של Android נמצא באוסף של מאגרי Git שמתארח ב-Google. כל מאגר Git כולל את כל ההיסטוריה של מקור Android, כולל שינויים במקור ומועד ביצוע השינויים. כדי להוריד את המקור של Android:
מנווטים לספריית הבית:
cd ~
יוצרים תיקיית משנה מקומית לעבודה בתוך התיקייה:
mkdir aosp
עוברים לספרייה:
cd aosp
מאתחלים את ההסתעפות הראשית של קוד המקור במאגר AOSP (ברירת המחדל):
repo init --partial-clone -b main -u https://android.googlesource.com/platform/manifest
מזינים או מאשרים את פרטי הכניסה ל-Git (שם, כתובת אימייל).
מסנכרנים את קוד המקור:
repo sync -c -j8
אם נתקלתם בבעיות במהלך ההורדה, תוכלו לעיין במאמר פתרון בעיות בסנכרון.
יצירת הקוד
כדי ליצור את הקוד:
בתיקיית העבודה, מגדירים את סביבת ה-build באמצעות הסקריפט
envsetup.sh
:source build/envsetup.sh
מציינים את סוג המכשיר היעד ליצירת גרסה 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 ============================================
יצירת היעד:
m
תהליך ה-build הראשון עשוי להימשך שעות. יצירת גרסאות build נוספות אורכת זמן קצר יותר. הפלט של ה-build מופיע ב-$OUT_DIR
.
הפעלת Cuttlefish
Cuttlefish הוא אמולטור Android שמשמש לבדיקת גרסאות build.
מריצים את הפקודות הבאות כדי להוריד, ליצור ולהתקין את חבילות 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
.הפעלת Cuttlefish:
launch_cvd --daemon
כדי להתחבר למכשיר Cuttlefish, עוברים אל
https://localhost:8443
בדפדפן האינטרנט. המכשיר הווירטואלי עם Android יוצג.
ביצוע שינוי
מעדכנים את קוד המקור לפי רשימת השינויים לדוגמה.
מהשורש של ה-checkout (הספרייה
aosp/
), עוברים לפרויקטframeworks/native
ב-Git:cd frameworks/native
כדי להתחיל פרויקט זמני, מריצים את הפקודה הבאה:
repo start <some-name> .
עורכים את
SurfaceFlinger.cpp
במיקום הבא באמצעות העורך:aosp/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
מחפשים את השורה הבאה:
void SurfaceFlinger::updateColorMatrixLocked() {
מוסיפים את השורה הבאה בתחילת הקובץ
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});
יוצרים את הקוד:
m
מעדכנים את הגרסה היציבה במכשיר:
adb root
adb remount -R
adb root
adb sync
adb reboot
מוודאים שרואים שינוי צבע במכשיר שנבחר, בדומה לתמונה 1.
איור 1. מראה המסך אחרי שינוי מוצלח של הצבע
תיקון בדיקה
בקטע הזה של הקודלאב נעשה שימוש בבדיקה לדוגמה שנמצאת בעץ המקור ומכשילה.
כדי להריץ את הבדיקה, לנפות באגים ולתקן אותה, פועלים לפי ההוראות הבאות:
הפעלה:
atest DevCodelabTest
הבדיקה נכשלת.
בודקים את נתיב הקריאה ב-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
.כדי לקבוע מה יהיה המיקום של הבדיקה שצריך לתקן, מוסיפים את המחרוזת
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
.עורכים את
platform_testing/tests/example/devcodelab/src/android/test/example/devcodelab/DevCodelabTest.java
ומחליפים אתAssert.assertTrue(false)
ב-Assert.assertTrue(true)
מריצים את הבדיקה שוב כדי לוודא שהבעיה נפתרה:
atest DevCodelabTest
העלאת הקוד לבדיקה
ה-Repo מפשט את השימוש ב-Git על ידי קיבוץ פקודות כמו git clone
כך שיפעלו במספר מאגרים (או פרויקטים) של Git בבת אחת.
כדי לבדוק את הקוד של הפרויקטים ב-Git, תוכלו להשתמש במערכת הבדיקה מבוססת-האינטרנט של Gerrit.
נניח שביצעתם את השינויים בפרויקט
frameworks/native
. כדי להעלות את השינויים, מריצים את הפקודות הבאות:cd frameworks/native
repo start codelab .
git add .
git commit
מזינים את ההודעה הבאה:
Android codelab change Test: manual atest
מעלים את השינוי:
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 וממזגים אותו למאגר. במקום זאת, למטרות הקודלאב הזה, צריך לבטל את השינויים:
ב-Gerrit, לוחצים על Abandon (נטישה).
משאירים את ההסתעפות הזמנית המשויכת בספריית הפרויקט
frameworks/native
(או בספריות המשנה שלה):repo abandon codelab .
מבטלים את השינויים שביצעתם בקובץ הבדיקה. מכיוון שלא הרצתם את הפקודות
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 של התהליך.