השתמש במידע בדף זה כדי ליצור קבצי makefile עבור המכשיר והמוצר שלך.
לכל מודול אנדרואיד חדש חייב להיות קובץ תצורה כדי לכוון את מערכת הבנייה עם מטא נתונים של מודול, תלות בזמן הידור והוראות אריזה. אנדרואיד משתמשת במערכת הבנייה Soong . ראה בניית אנדרואיד למידע נוסף על מערכת הבנייה של אנדרואיד.
הבנת שכבות בנייה
היררכיית הבנייה כוללת את שכבות ההפשטה המתאימות למבנה הפיזי של מכשיר. שכבות אלו מתוארות בטבלה שלהלן. כל שכבה מתייחסת לזה שמעליו במערכת יחסים של אחד לרבים. לדוגמה, ארכיטקטורה יכולה לכלול יותר מלוח אחד ולכל לוח יכול להיות יותר ממוצר אחד. אתה יכול להגדיר אלמנט בשכבה נתונה כהתמחות של אלמנט באותה שכבה, מה שמבטל את ההעתקה ומפשט את התחזוקה.
שִׁכבָה | דוגמא | תיאור |
---|---|---|
מוצר | myProduct, myProduct_eu, myProduct_eu_fr, j2, sdk | שכבת המוצר מגדירה את מפרט התכונה של מוצר משלוח, כגון המודולים לבנייה, מקומות נתמכים ותצורה עבור מקומות שונים. במילים אחרות, זה השם של המוצר הכולל. משתנים ספציפיים למוצר מוגדרים בקבצי makefile של הגדרת המוצר. מוצר יכול לרשת מהגדרות מוצר אחרות, מה שמפשט את התחזוקה. שיטה נפוצה היא ליצור מוצר בסיס המכיל תכונות החלות על כל המוצרים, ולאחר מכן ליצור גרסאות מוצר המבוססות על מוצר בסיס זה. לדוגמה, שני מוצרים שנבדלים זה מזה רק במכשירי הרדיו שלהם (CDMA לעומת GSM) יכולים לרשת מאותו מוצר בסיס שאינו מגדיר רדיו. |
לוח/מכשיר | מרלין, בלוליין, אלמוגים | שכבת הלוח/המכשיר מייצגת את השכבה הפיזית של הפלסטיק על המכשיר (כלומר, העיצוב התעשייתי של המכשיר). שכבה זו מייצגת גם את הסכמטיקה החשופה של מוצר. אלה כוללים את הציוד ההיקפי על הלוח ואת התצורה שלהם. השמות המשמשים הם רק קודים עבור תצורות לוח/התקן שונות. |
קֶשֶׁת | arm, x86, arm64, x86_64 | שכבת הארכיטקטורה מתארת את תצורת המעבד והממשק הבינארי של יישומים (ABI) הפועלים על הלוח. |
שימוש בגרסאות בנייה
כאשר בונים עבור מוצר מסוים, כדאי שיהיו וריאציות קלות על בניית המהדורה הסופית. בהגדרת מודול, המודול יכול לציין תגים עם LOCAL_MODULE_TAGS
, שיכולים להיות ערך אחד או יותר של optional
(ברירת מחדל), debug
ו- eng
.
אם מודול אינו מציין תג (על ידי LOCAL_MODULE_TAGS
), התג שלו מוגדר כברירת מחדל optional
. מודול אופציונלי מותקן רק אם הוא נדרש על ידי תצורת המוצר עם PRODUCT_PACKAGES
.
אלו הן גרסאות הבנייה המוגדרות כעת.
גִרְסָה אַחֶרֶת | תיאור |
---|---|
eng | זהו טעם ברירת המחדל.
|
user | הגרסה נועדה להיות סיביות השחרור הסופיות.
|
userdebug | זהה user , למעט החריגים הבאים:
|
הנחיות עבור userdebug
הפעלת Userdebug build בבדיקות עוזרת למפתחי מכשירים להבין את הביצועים והעוצמה של מהדורות בפיתוח. כדי לשמור על עקביות בין משתמש ו-userdebug builds, וכדי להשיג מדדים אמינים ב-builds המשמשים לניפוי באגים, מפתחי מכשירים צריכים לפעול לפי ההנחיות הבאות:
- userdebug מוגדר כבניית משתמש עם גישת בסיס מופעלת, למעט:
- אפליקציות userdebug בלבד המופעלות רק לפי דרישה של המשתמש
- פעולות הפועלות רק בזמן תחזוקה סרק (במטען/טעון במלואו), כמו שימוש ב-
dex2oatd
לעומתdex2oat
עבור קומפילי רקע
- אל תכלול תכונות מופעלות/מושבתות כברירת מחדל על סמך סוג ה-build. מפתחים לא מעודדים להשתמש בכל צורת רישום שמשפיעה על חיי הסוללה, כגון רישום באגים או השלכת ערימות.
- כל תכונות ניפוי באגים המופעלות כברירת מחדל ב-userdebug צריכות להיות מוגדרות בבירור ולשתף אותן עם כל המפתחים שעובדים על הפרויקט. עליך להפעיל תכונות ניפוי באגים רק על בסיס זמן מוגבל עד שהבעיה שאתה מנסה לאתר באגים תיפתר.
התאמה אישית של ה-build עם שכבות-על של משאבים
מערכת הבנייה של אנדרואיד משתמשת בשכבות-על של משאבים כדי להתאים אישית מוצר בזמן הבנייה. שכבות-על של משאבים מציינות קובצי משאבים המוחלים על ברירות המחדל. כדי להשתמש בשכבות-על של משאבים, שנה את קובץ build של הפרויקט כדי להגדיר את PRODUCT_PACKAGE_OVERLAYS
לנתיב ביחס לספרייה ברמה העליונה שלך. נתיב זה הופך לשורש צל שמחפשים אותו יחד עם השורש הנוכחי כאשר מערכת ה-build מחפשת משאבים.
ההגדרות המותאמות אישית הנפוצות ביותר נמצאות במסגרות הקובץ/base/core/res/res/values/config.xml .
כדי להגדיר שכבת-על של משאב בקובץ זה, הוסף את ספריית שכבת-העל לקובץ build של הפרויקט באמצעות אחת מהפעולות הבאות:
PRODUCT_PACKAGE_OVERLAYS := device/device-implementer/device-name/overlay
אוֹ
PRODUCT_PACKAGE_OVERLAYS := vendor/vendor-name/overlay
לאחר מכן, הוסף קובץ שכבת-על לספרייה, לדוגמה:
vendor/foobar/overlay/frameworks/base/core/res/res/values/config.xml
כל מחרוזות או מערכי מחרוזת שנמצאו בקובץ שכבת-העל config.xml
מחליפים את אלה שנמצאו בקובץ המקורי.
בניית מוצר
אתה יכול לארגן את קבצי המקור עבור המכשיר שלך בדרכים רבות ושונות. להלן תיאור קצר של דרך אחת לארגן מימוש Pixel.
Pixel מיושם עם תצורת מכשיר ראשי בשם marlin
. מתצורת מכשיר זו, נוצר מוצר עם makefile של הגדרת המוצר המצהיר על מידע ספציפי למוצר על המכשיר כגון השם והדגם. אתה יכול לראות את ספריית device/google/marlin
כדי לראות איך כל זה מוגדר.
כתיבת קבצי מוצר
השלבים הבאים מתארים כיצד להגדיר קבצי makefile של מוצרים בצורה דומה לזו של קו המוצרים של Pixel:
- צור ספריית
device/ <company-name> / <device-name>
עבור המוצר שלך. לדוגמה,device/google/marlin
. ספרייה זו תכיל קוד מקור עבור המכשיר שלך יחד עם קבצי ה-make כדי לבנות אותם. - צור makefile
device.mk
שמצהיר על הקבצים והמודולים הדרושים למכשיר. לדוגמא, ראהdevice/google/marlin/device-marlin.mk
. - צור קובץ makefile להגדרת מוצר כדי ליצור מוצר ספציפי המבוסס על המכשיר. ה-makefile הבא נלקח
device/google/marlin/aosp_marlin.mk
כדוגמה. שימו לב שהמוצר יורשdevice/google/marlin/device-marlin.mk
ו-vendor/google/marlin/device-vendor-marlin.mk
דרך ה-makefile תוך הצהרת המידע הספציפי למוצר כגון שם, מותג, ודגם.# Inherit from the common Open Source product configuration $(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk) $(call inherit-product, $(SRC_TARGET_DIR)/product/aosp_base_telephony.mk) PRODUCT_NAME := aosp_marlin PRODUCT_DEVICE := marlin PRODUCT_BRAND := Android PRODUCT_MODEL := AOSP on msm8996 PRODUCT_MANUFACTURER := Google PRODUCT_RESTRICT_VENDOR_FILES := true PRODUCT_COPY_FILES += device/google/marlin/fstab.common:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.marlin $(call inherit-product, device/google/marlin/device-marlin.mk) $(call inherit-product-if-exists, vendor/google_devices/marlin/device-vendor-marlin.mk) PRODUCT_PACKAGES += \ Launcher3QuickStep \ WallpaperPicker
ראה הגדרת משתני הגדרת מוצר עבור משתנים ספציפיים למוצר נוספים שתוכל להוסיף לקבצי המייקאפ שלך.
- צור קובץ
AndroidProducts.mk
על קבצי המייקאפ של המוצר. בדוגמה זו, יש צורך רק בקובץ makefile של הגדרת המוצר. הדוגמה למטה היא מ-device/google/marlin/AndroidProducts.mk
(המכיל גם את מרלין, את הפיקסל וגם את דג המפרש, ה-Pixel XL, שחלקו את רוב התצורה):PRODUCT_MAKEFILES := \ $(LOCAL_DIR)/aosp_marlin.mk \ $(LOCAL_DIR)/aosp_sailfish.mk COMMON_LUNCH_CHOICES := \ aosp_marlin-userdebug \ aosp_sailfish-userdebug
- צור Makefile
BoardConfig.mk
המכיל תצורות ספציפיות ללוח. לדוגמא, ראהdevice/google/marlin/BoardConfig.mk
. - עבור אנדרואיד 9 ומטה בלבד , צור קובץ
vendorsetup.sh
כדי להוסיף את המוצר שלך ("שילוב ארוחת צהריים") ל-build יחד עם גרסת בנייה מופרדת באמצעות מקף. לדוגמה:add_lunch_combo <product-name>-userdebug
- בשלב זה, תוכל ליצור גרסאות נוספות של מוצר המבוססות על אותו מכשיר.
הגדרת משתני הגדרת המוצר
משתנים ספציפיים למוצר מוגדרים ב-makefile של המוצר. הטבלה מציגה חלק מהמשתנים המתוחזקים בקובץ הגדרת מוצר.
מִשְׁתַנֶה | תיאור | דוגמא |
---|---|---|
PRODUCT_AAPT_CONFIG | תצורות aapt לשימוש בעת יצירת חבילות. | |
PRODUCT_BRAND | המותג (למשל, הספק) עבורו מותאמת התוכנה, אם בכלל. | |
PRODUCT_CHARACTERISTICS | aapt מאפיינים כדי לאפשר הוספת משאבים ספציפיים לגרסה לחבילה. | tablet , nosdcard |
PRODUCT_COPY_FILES | רשימת מילים כמו source_path:destination_path . יש להעתיק את הקובץ בנתיב המקור לנתיב היעד בעת בניית מוצר זה. הכללים עבור שלבי ההעתקה מוגדרים ב- config/makefile . | |
PRODUCT_DEVICE | שם העיצוב התעשייתי. זהו גם שם הלוח, ומערכת ה-build משתמשת בו כדי לאתר את BoardConfig.mk . | tuna |
PRODUCT_LOCALES | רשימה מופרדת ברווחים של קוד שפות בן שתי אותיות, צמדי קוד מדינה בני שתי אותיות המתארות מספר הגדרות עבור המשתמש, כגון שפת ממשק המשתמש ועיצוב השעה, התאריך והמטבע. המקום הראשון הרשום ב- PRODUCT_LOCALES משמש כאזור ברירת המחדל של המוצר. | de_DE , en_GB , es_ES , fr_CA |
PRODUCT_MANUFACTURER | שם היצרן. | acme |
PRODUCT_MODEL | שם גלוי למשתמש הקצה עבור המוצר הסופי. | |
PRODUCT_NAME | שם גלוי למשתמש הקצה עבור המוצר הכולל. מופיע במסך הגדרות > אודות . | |
PRODUCT_OTA_PUBLIC_KEYS | רשימה של מפתחות ציבוריים (OTA) עבור המוצר. | |
PRODUCT_PACKAGES | רשימת ה-APKs והמודולים להתקנה. | אנשי קשר ביומן |
PRODUCT_PACKAGE_OVERLAYS | מציין אם להשתמש במשאבי ברירת מחדל או להוסיף שכבות-על ספציפיות למוצר. | vendor/acme/overlay |
PRODUCT_SYSTEM_PROPERTIES | רשימה של הקצאות מאפייני המערכת בפורמט "key=value" עבור מחיצת המערכת. ניתן להגדיר מאפייני מערכת עבור מחיצות אחרות באמצעות PRODUCT_<PARTITION>_PROPERTIES כמו ב- PRODUCT_VENDOR_PROPERTIES עבור מחיצת הספק. שמות מחיצות נתמכות: SYSTEM , VENDOR , ODM , SYSTEM_EXT ו- PRODUCT . |
הגדרת שפת מערכת ברירת המחדל ומסנן מיקום
השתמש במידע זה כדי להגדיר את מסנן שפת ברירת המחדל ואת מסנן אזור המערכת, ולאחר מכן הפעל את מסנן המקום עבור סוג מכשיר חדש.
נכסים
הגדר הן את שפת ברירת המחדל והן את מסנן אזור המערכת באמצעות מאפייני מערכת ייעודיים:
-
ro.product.locale
: להגדרת מיקום ברירת המחדל. זה מוגדר בתחילה למקום הראשון במשתנהPRODUCT_LOCALES
; אתה יכול לעקוף את הערך הזה. (למידע נוסף, עיין בטבלה הגדרת משתני הגדרת מוצר ). -
ro.localization.locale_filter
: להגדרת מסנן מקומי, באמצעות ביטוי רגולרי המוחל על שמות מקומיים. לדוגמה:- מסנן כולל:
^(de-AT|de-DE|en|uk).*
- מאפשר רק גרמנית (גרסאות אוסטריה וגרמניה), כל הגרסאות האנגלית של אנגלית ואוקראינית - מסנן בלעדי:
^(?!de-IT|es).*
- לא כולל גרמנית (גרסה איטלקית), ואת כל הגרסאות של ספרדית.
- מסנן כולל:
הפעלת מסנן המקום
כדי להפעיל את המסנן, הגדר את ערך המחרוזת של מערכת ro.localization.locale_filter
.
על ידי הגדרת ערך מאפיין המסנן ושפת ברירת המחדל באמצעות oem/oem.prop
במהלך כיול היצרן, תוכל להגדיר הגבלות מבלי לאפות את המסנן בתמונת המערכת. אתה מוודא שהמאפיינים האלה ייאספו ממחיצת ה-OEM על ידי הוספתם למשתנה PRODUCT_OEM_PROPERTIES
כמצוין להלן:
# Delegation for OEM customization PRODUCT_OEM_PROPERTIES += \ ro.product.locale \ ro.localization.locale_filter
לאחר מכן בייצור הערכים בפועל נכתבים אל oem/oem.prop
, כדי לשקף את דרישות היעד. בגישה זו, ערכי ברירת המחדל נשמרים במהלך איפוס היצרן, כך שההגדרות הראשוניות נראות בדיוק כמו הגדרה ראשונה למשתמש.
הגדרת ADB_VENDOR_KEYS לחיבור דרך USB
משתנה הסביבה ADB_VENDOR_KEYS
מאפשר ליצרני מכשירים לגשת ל-builds הניתנים לאיפוי באגים (-userdebug ו-eng, אך לא -user) דרך adb ללא הרשאה ידנית. בדרך כלל adb מייצר מפתח אימות RSA ייחודי עבור כל מחשב לקוח, אותו הוא ישלח לכל מכשיר מחובר. זהו מפתח ה-RSA המוצג בתיבת הדו-שיח של הרשאות adb. כחלופה ניתן לבנות מפתחות ידועים בתמונת המערכת ולשתף אותם עם לקוח adb. זה שימושי לפיתוח מערכת ההפעלה ובמיוחד לבדיקות מכיוון שהוא מונע את הצורך באינטראקציה ידנית עם תיבת הדו-שיח של הרשאות adb.
כדי ליצור מפתחות ספקים, אדם אחד (בדרך כלל מנהל שחרור) צריך:
- צור זוג מפתחות באמצעות
adb keygen
. עבור מכשירי Google, Google מייצרת זוג מפתחות חדש עבור כל גרסה חדשה של מערכת ההפעלה. - בדוק את צמדי המפתחות, איפשהו בעץ המקור. גוגל מאחסנת אותם
vendor/google/security/adb/
, למשל. - הגדר את משתנה הבנייה
PRODUCT_ADB_KEYS
כך שיצביע על ספריית המפתח שלך. גוגל עושה זאת על ידי הוספת קובץAndroid.mk
בספריית המפתחות שאומרPRODUCT_ADB_KEYS := $(LOCAL_PATH)/$(PLATFORM_VERSION).adb_key.pub
, מה שעוזר להבטיח שנזכור ליצור זוג מפתחות חדש עבור כל גרסת מערכת הפעלה.
להלן קובץ ה-makefile ש-Google משתמשת בספרייה שבה אנו מאחסנים את צמדי המפתחות שנרשמו עבור כל מהדורה:
PRODUCT_ADB_KEYS := $(LOCAL_PATH)/$(PLATFORM_VERSION).adb_key.pub ifeq ($(wildcard $(PRODUCT_ADB_KEYS)),) $(warning ========================) $(warning The adb key for this release) $(warning ) $(warning $(PRODUCT_ADB_KEYS)) $(warning ) $(warning does not exist. Most likely PLATFORM_VERSION in build/core/version_defaults.mk) $(warning has changed and a new adb key needs to be generated.) $(warning ) $(warning Please run the following commands to create a new key:) $(warning ) $(warning make -j8 adb) $(warning LOGNAME=android-eng HOSTNAME=google.com adb keygen $(patsubst %.pub,%,$(PRODUCT_ADB_KEYS))) $(warning ) $(warning and upload/review/submit the changes) $(warning ========================) $(error done) endif
כדי להשתמש במפתחות ספקים אלה, מהנדס רק צריך להגדיר את משתנה הסביבה ADB_VENDOR_KEYS
כך שיצביע על הספרייה שבה מאוחסנים צמדי המפתחות. זה אומר ל- adb
לנסות את המפתחות הקנוניים האלה תחילה, לפני שתחזור למפתח המארח שנוצר הדורש הרשאה ידנית. כאשר adb
לא יכול להתחבר למכשיר לא מורשה, הודעת השגיאה תציע לך להגדיר ADB_VENDOR_KEYS
אם הוא עדיין לא מוגדר.