פיתוח גרסאות build ל-Android

כדי ליצור את Android, פועלים לפי ההוראות שמפורטות בדף הזה.

הגדרת סביבת ה-build

בספריית העבודה, מריצים את הסקריפט envsetup.sh כדי להגדיר את סביבת build:

source build/envsetup.sh

הסקריפט הזה מייבא כמה פקודות שמאפשרות לעבוד עם קוד המקור של Android, כולל הפקודות שמופיעות בדף הזה. כדי לראות את המקור של הסקריפט, אפשר לעיין בplatform/build/envsetup.sh. כדי להציג את העזרה המובנית, מקלידים hmm.

בחירת יעד

לפני שמתחילים לבנות את Android, צריך לזהות יעד לבנייה. יעד משקף את פלטפורמת היעד שאתם בונים עבורה. כדי לזהות את יעד הבנייה, משתמשים בפקודה 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
============================================

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

lunch product_name-release_config-build_variant

הרכיבים במחרוזת הזו:

  • product_name הוא שם המוצר שרוצים ליצור, למשל aosp_cf_x86_64_only_phone או aosp_husky. המספר הספציפי שלכם product_name יכול להיות בפורמט משלכם, אבל הפורמט שבו Google משתמשת במכשירים שלה כולל את הרכיבים הבאים:

    • aosp מתייחס לפרויקט הקוד הפתוח של Android.
    • אפשר לכלול את cf אם רוצים להריץ את היעד באמולטור Cuttlefish.
    • שם הקוד של הארכיטקטורה והחומרה, למשל x86_64_only_phone או husky, שהוא שם הקוד של Pixel 8 Pro. רשימה של שמות קוד למכשירי Google זמינה במאמר שמות קוד למכשירים.
  • הערך של release_config מוגדר כהגדרת גרסה, כמו הגדרת גרסת הפיתוח שנקראת aosp_current. הגדרת גרסה מזהה תכונות וקוד מסוימים שמוסתרים מאחורי דגלים להשקת תכונות, ומופעלים או מושבתים בגרסה. מידע נוסף על הגדרות של השקות זמין במאמר הגדרת ערכי השקה של feature flag.

  • החלק build_variant במחרוזת יכול להיות אחד משלושת הערכים שבטבלה הבאה:

    build_variant תיאור
    user וריאנט ה-build הזה מספק גישה מוגבלת לאבטחה והוא מתאים לייצור.
    userdebug וריאנט ה-build הזה עוזר למפתחי המכשיר להבין את הביצועים ואת העוצמה של גרסאות שנמצאות בפיתוח. כשמפתחים באמצעות userdebugbuild, צריך לפעול בהתאם להנחיות בנושא userdebug.
    eng לוריאנט build הזה יש משך זמן של תהליך build מהיר יותר, והוא מתאים במיוחד לסביבות פיתוח יומיומיות (שבהן הביצועים וההספק פחות חשובים).

אם מריצים את הפקודה lunch ללא ארגומנטים, lunch מספק רשימה של יעדים נפוצים. כדי ליצור מחרוזות טירגוט מותאמות אישית, משלבים רכיבים של מחרוזות טירגוט עם שמות קוד של חומרה. רשימה של שמות קוד זמינה במאמר שמות קוד של מכשירים.

הצגת היעד הנוכחי

כדי לראות את ההגדרות הנוכחיות של ארוחת הצהריים, מריצים את הפקודה:

$ echo "$TARGET_PRODUCT-$TARGET_BUILD_VARIANT"

יצירת הקוד

מריצים את הפקודה הבאה כדי ליצור את היעד. בהתאם למפרט של תחנת העבודה, יכול להיות שהגרסה הראשונה תיצור תוך פחות משעה, ויכול להיות שייקח כמה שעות. הגרסאות הבאות ייבנו בזמן קצר בהרבה.

m

הפלט של הבנייה יופיע ב-$OUT_DIR. אם יוצרים יעדים שונים, כל יעד מופיע ב-$OUT_DIR.

הפקודה m מתבססת על החלק העליון של העץ, כך שאפשר להריץ את הפקודה m מתוך תיקיות משנה. אם משתנה הסביבה TOP מוגדר, הפקודה m משתמשת בו. אם לא מוגדר TOP, הפקודה m מחפשת בעץ החל מהספרייה הנוכחית, בניסיון למצוא את החלק העליון של העץ.

הפקודה m יכולה לטפל במשימות מקבילות באמצעות הארגומנט -jN. אם לא מספקים ארגומנט -j, מערכת ה-build בוחרת באופן אוטומטי את מספר המשימות המקבילות שהיא חושבת שהוא אופטימלי למערכת שלכם.

אפשר ליצור מודולים ספציפיים במקום את תמונת המכשיר המלאה. לשם כך, צריך לציין את שמות המודולים בשורת הפקודה m. בנוסף, הפקודה m מספקת כמה יעדים פסאודו, שנקראים goals. לדוגמה, הפקודה m nothing לא יוצרת שום דבר, אבל היא מנתחת ומאמתת את מבנה ה-build. כדי לראות רשימה של יעדים תקינים, מקלידים m help.

פתרון בעיות שקשורות לבנייה

בקטע הזה מפורטות הוראות לטיפול בשגיאות בנייה.

שגיאות במערכת קבצים לקריאה בלבד (Android 17 ואילך)

במהלך הבנייה, עץ המקור של AOSP הוא לקריאה בלבד. אם הגרסה שאתם מריצים מנסה לשנות את עץ המקור במהלך הגדרת המוצר או בכל חלק אחר של הבנייה, יכול להיות שהבנייה תיכשל ויוצגו שגיאות של מערכת קבצים לקריאה בלבד. אתם יכולים להשתמש באפשרויות האלה כדי לשנות באופן זמני את עץ המקור למצב קריאה-כתיבה:

  • כדי לשנות את כל עץ המקור לגישה של קריאה וכתיבה במהלך ה-build, מוסיפים את BUILD_BROKEN_SRC_DIR_IS_WRITABLE=true לסביבת ה-build.

  • כדי לשנות חלק מהעץ לגישה של קריאה וכתיבה במהלך ה-build, משתמשים ב-BUILD_BROKEN_SRC_DIR_RW_ALLOWLIST="path1, path2, ...". הנתיבים צריכים להיות הנתיבים של הספריות שבהן צריך לאפשר כתיבה, ביחס לראש סביבת העבודה.

גרסת Java שגויה (Android מגרסה 8.0 ומטה)

אם אתם מפתחים ל-Android 8.0 (רמת API‏ 26) ולגרסאות קודמות, יכול להיות שהפקודה m תופסק אם תהיה בעיה בגרסת Java שלכם. לדוגמה, יכול להיות שתקבלו את ההודעה הבאה:

************************************************************
You are attempting to build with the incorrect version of java.

Your version is: WRONG_VERSION.
The correct version is: RIGHT_VERSION.

Please follow the machine setup instructions at
https://source.android.com/source/initializing.html
************************************************************

אלה הסיבות האפשריות והפתרונות:

  • לא מותקן JDK מתאים. מידע נוסף זמין במאמר הגדרה לפיתוח ב-AOSP (גרסאות 2.3 עד 8.0).
  • נראה שיש עוד JDK שהותקן בעבר בנתיב שלך. מוסיפים את ה-JDK הנכון בתחילת הנתיב או מסירים את ה-JDK הבעייתי.