המדריך הזה מאפשר לכם לנסות לפתח למערכת ההפעלה 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:
מורידים את פרטי החבילה הנוכחית:
sudo apt-get update
מריצים את הפקודה הבאה כדי להתקין את Repo launcher:
sudo apt-get install repo
הכלי Repo launcher מספק סקריפט 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 launcher.
בודקים את הגרסה של Repo launcher:
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
אם נתקלתם בבעיות במהלך ההורדה, תוכלו להיעזר במאמר בנושא פתרון בעיות בסנכרון.
יצירת הקוד
כדי ליצור את הקוד:
בספריית העבודה, מריצים את הסקריפט
envsetup.sh
כדי להגדיר את סביבת הבנייה:source build/envsetup.sh
מציינים סוג מכשיר יעד כדי לבצע את הבנייה באמצעות הפקודה
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
הגרסה הראשונה תיצור תוך כמה שעות. הגרסאות הבאות ייבנו בזמן קצר בהרבה. הפלט של הבנייה מופיע ב-$OUT_DIR
.
הפעלת Cuttlefish
Cuttlefish הוא אמולטור Android שמשמש לבדיקת הגרסאות שלכם.
מריצים את הפקודות הבאות כדי להוריד, ליצור ולהתקין את חבילות 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 מוצג.
ביצוע שינוי
מעדכנים את קוד המקור לפי רשימת השינויים הזו לדוגמה.
מהספרייה הראשית של הצ'קאאוט (
aosp/
), עוברים לפרויקט Git:frameworks/native
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. איך המסך נראה אחרי שינוי הצבע
פתרון בעיות בניסוי
החלק הזה של ה-codelab מתבסס על דוגמה לבדיקה שנמצאת בעץ המקור ונכשלת.
כדי להריץ את הבדיקה, לנפות באגים ולתקן אותה, פועלים לפי ההוראות הבאות:
הפעלה:
atest DevCodelabTest
הבדיקה נכשלת.
בודקים את דוח הקריסות של הבדיקה שנכשלה:
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 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 הזה, צריך לבטל את השינויים שביצעתם:
ב-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.
עזרה
אם נתקלתם בשגיאות במהלך ה-codelab הזה, אתם יכולים לדווח עליהן באמצעות הקישור לכלי למעקב אחר בעיות שבתחתית כל דף. אפשר לשלוח שאלות לקבוצה android-building.
מקלידים ps -A | grep crosvm
כדי לבדוק אם crosvm
כבר פועל. אם crossvm
פועל, מקלידים stop_cvd || true
או kill crosvm
process עם ה-PID של התהליך.