המדריך הזה מאפשר לכם לנסות לפתח מערכת הפעלה של 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 השונים במקור של 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 מגיעה עם גרסאות מוכנות מראש של OpenJDK, Make ו-Python 3, כך שאין צורך לבצע שלבי התקנה נוספים. בקטע הבא מוסבר איך להתקין את Repo.
התקנת Repo
כדי להתקין את Repo:
מורידים את פרטי החבילה הנוכחיים:
sudo apt-get updateמריצים את הפקודה הבאה כדי להתקין את מרכז האפליקציות של Repo:
sudo apt-get install repoמרכז האפליקציות של Repo מספק סקריפט Python שמפעיל את תהליך ה-checkout ומוריד את כלי 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.
בודקים את הגרסה של מרכז האפליקציות של Repo:
repo versionבפלט צריכה להופיע גרסה 2.4 ואילך, לדוגמה:
repo launcher version 2.45
הורדת קוד המקור של Android
המקור של Android נמצא באוסף של מאגרי Git שמתארחים ב-Google. כל מאגר Git כולל את כל ההיסטוריה של מקור Android, כולל שינויים במקור ומועד ביצוע השינויים. כדי להוריד את קוד המקור של Android:
עוברים לספריית הבית:
cd ~יוצרים תיקיית משנה מקומית לעבודה בתוך התיקייה:
mkdir aospמנווטים לספרייה:
cd aospמאתחלים את ההסתעפות האחרונה של קוד המקור של המאגר AOSP (
android-latest-release):repo init --partial-clone -b android-latest-release -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_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 ============================================יצירת היעד:
m
תהליך ה-build הראשון צפוי להימשך שעות. יצירת גרסאות build נוספות אורכת זמן קצר בהרבה. הפלט של ה-build מופיע ב-$OUT_DIR.
הפעלת Cuttlefish
Cuttlefish הוא אמולטור Android שמשמש לבדיקה של גרסאות build.
מריצים את הפקודות הבאות כדי להוריד, ליצור ולהתקין את חבילות Debian של המארח:
sudo apt install -y git devscripts equivs config-package-dev debhelper-compat golang curlgit clone https://github.com/google/android-cuttlefishcd android-cuttlefishfor dir in base frontend; do pushd $dir # Install build dependencies sudo mk-build-deps -i dpkg-buildpackage -uc -us popd donesudo dpkg -i ./cuttlefish-base_*_*64.deb || sudo apt-get install -fsudo dpkg -i ./cuttlefish-user_*_*64.deb || sudo apt-get install -fsudo usermod -aG kvm,cvdnetwork,render $USERsudo 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 rootadb remount -Radb rootadb syncadb 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/nativerepo start codelab .git add .git commitמזינים את ההודעה הבאה:
Android codelab change Test: manual atestמעלים את השינוי:
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 וממזגים אותו למאגר. במקום זאת, למטרות הקודלאב הזה, צריך לבטל את השינויים:
ב-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.javagit checkout .
זהו סוף ה-Codelab לפיתוח בפלטפורמת Android.
עזרה
אם תיתקלו בשגיאות במהלך הקודלאב, תוכלו לדווח עליהן באמצעות הקישור Issue Tracker שבתחתית כל דף. שולחים שאלות לקבוצה android-building.
מקלידים ps -A | grep crosvm כדי לבדוק אם crosvm כבר פועל. אם crossvm פועל, מקלידים stop_cvd || true או kill crosvm process עם PID של התהליך.