ב-Android מגרסה 9 ואילך יש תמיכה ביצירת מחיצות product
באמצעות מערכת ה-build של Android. בעבר, ב-Android 8.x נאכף ההפרדה של רכיבים ספציפיים ל-SoC מהמחיצה system
למחיצה vendor
, בלי להקצות מקום לרכיבים ספציפיים ל-OEM שנוצרו ממערכת ה-build של Android. ב-Android מגרסה 9 ואילך יש הרשאות ותכונות נוספות להוספה לרשימת ההיתרים שחלות על אפליקציות פרטיות במחיצות שונות.
מידע על חלוקת מוצרים
יצרני ציוד מקורי רבים מבצעים התאמה אישית של קובץ האימג' של מערכת AOSP כדי להטמיע את התכונות שלהם, וגם כדי לעמוד בדרישות של ספקי הסלולר. עם זאת, התאמות אישיות כאלה לא מאפשרות להשתמש בתמונת מערכת אחת לכמה מק"טים של תוכנה. כל תמונה צריכה להיות שונה כדי לתמוך בהתאמות אישיות, למשל עם אזורים שונים או ספקים שונים. שימוש במחיצה נפרדת של product
כדי להכיל התאמות אישיות מאפשר להשתמש בתמונת מערכת אחת לכמה מק"טים של תוכנה. (מחיצה system
מארחת קוד כללי שאפשר לשתף בין הרבה מק"טים של תוכנות). המחיצה vendor
ממשיכה לארח קוד BSP ספציפי ל-SoC, שאפשר לשתף בין כמה מכשירים על סמך ה-SoC הנתון.
לשימוש במחיצות נפרדות יש כמה חסרונות, כמו ניהול נפח האחסון בדיסק (צריך להשאיר כמות מוגבלת של נפח פנוי לצמיחה עתידית) ושמירה על ממשק בינארי יציב של אפליקציה (ABI) בין המחיצות. לפני שאתם מחליטים להשתמש במחיצות product
, כדאי להקדיש זמן כדי לבחון את ההטמעה הייחודית של AOSP ואת שיטות המיטיגציה האפשריות (כמו חלוקה מחדש של המכשיר במחיצות במהלך עדכון אוויר (OTA), פעולה שלא מתבצעת על ידי Google אלא על ידי יצרני ציוד מקורי מסוימים).
חלוקה דינמית היא פתרון טוב לבעיה הזו.
חלוקות מוצרים והרשאות
ב-Android 9 ואילך, שינוי בהרשאות ובתהליך ההוספה לרשימת ההיתרים משפיע על האופן שבו מעניקים הרשאות ל-priv-apps במחיצות 'product'. קובץ permissions.xml
חייב להיות באותו מחיצה שבה נמצאים אפליקציות priv-apps. הצבת קובץ permissions.xml
במחיצה system
לאפליקציות פרטיות לא מרחיבה את ההרשאות האלה לאפליקציות פרטיות במחיצה product
, למרות שהמחיצה הראשונה היא תוספת למחיצה השנייה.
פרטים על ההרשאות ועל תהליך ההוספה לרשימת ההיתרים מופיעים במאמר הוספה של הרשאות עם הרשאות גישה ברשימת ההיתרים.
/oem מדור קודם לעומת /product
יש לנו שני סוגים של מאפיינים של המחיצה product
, בהתאם לאכיפה של ממשק המוצר. בנוסף, המחיצה product
שונה מהמחיצה הקודמת oem
:
מחיצה | מאפיינים |
---|---|
oem |
|
product |
|
product (ממשקים מאולצים) |
|
לכן, ב-Android 9 יש תמיכה במחיצה product
תוך שמירה על תמיכה במחיצה oem
מהדור הקודם, למכשירים שתלויים בה. כדי לבטל את הקישור בין המחיצה product
למחיצה system
, ב-Android 11 יש תמיכה באכיפה של ממשקי product
.
/product components
המחיצה product
מכילה את הרכיבים הבאים:
- מאפייני מערכת ספציפיים למוצר (
/product/build.prop
) - שותפי RRO ספציפיים למוצר (
/product/overlay/*.apk
) - אפליקציות ספציפיות למוצר (
/product/app/*.apk
) - אפליקציות פרטיות ספציפיות למוצר (
/product/priv-app/*.apk
) - ספריות ספציפיות למוצר (
/product/lib/*
) - ספריות Java ספציפיות למוצר (
/product/framework/*.jar
) - הגדרות מערכת ספציפיות למוצר של Android Framework (
/product/etc/sysconfig/*
ו-/product/etc/permissions/*
) - קובצי מדיה ספציפיים למוצר (
/product/media/audio/*
) - קבצים
bootanimation
ספציפיים למוצר
אין custom_images
אי אפשר להשתמש ב-custom_images
. אין בהן תמיכה בתכונות הבאות:
- התקנת מודולים ביעד ספציפי.
custom_images
תומך בהעתקת ארטיפקטים לתוך קובץ אימג', אבל אי אפשר להתקין מודול במחיצה ספציפית על ידי ציון המחיצה היעד שלו כחלק מכלל build. - תמיכה ב-Soong. לא ניתן לבנות את
custom_images
באמצעות מערכת ה-build של Soong. - תמיכה בעדכוני OTA.
custom_images
משמשים כקובצי אימג' של ROM מקוריים שלא יכולים לקבל עדכוני OTA.
שמירה על ממשקי ABI בין מחיצות
המחיצה product
ב-Android 9 היא תוספת למחיצה system
. יש ABI חלש בין המחיצות product
ו-system
, לכן צריך לשדרג את שתיהן בו-זמנית, וה-ABI צריך להיות מבוסס על ערכת SDK של מערכת. אם ה-SDK של המערכת לא מכסה את כל ממשקי ה-API בין product
ל-system
, יצרני ציוד מקורי צריכים לנהל ABI משלהם בין שתי המחיצות.
יכולה להיות תלות בין המחיצות product
ו-system
. עם זאת, בדיקות עם Generic System Image (GSI) צריכות לפעול כראוי ללא המחיצה product
.
כשמפעילים את ממשקי product
, מתבצע ניתוק של המחיצה product
מהמחיצה system
. במחיצה product
נעשה שימוש רק בממשקים המורשים מהמחיצה system
.
אסור שתהיה תלות של המחיצה product
בממשקים לא יציבים במחיצה vendor
. אסור לבצע אינטראקציה ישירה בין המחיצות product
ו-vendor
.
(הכלל הזה נאכף על ידי SEpolicy).
הטמעת חלוקות מוצרים
לפני שמטמיעים מחיצה חדשה של מוצר, כדאי לבדוק את השינויים הקשורים במחיצה של המוצר ב-AOSP. לאחר מכן, כדי להגדיר את product
, צריך לכלול את הדגלים הבאים של הלוח או של build המוצר:
BOARD_USES_PRODUCTIMAGE
BOARD_PRODUCTIMAGE_PARTITION_SIZE
BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE
PRODUCT_PRODUCT_PROPERTIES
עבור/product/build.prop
. הערכים האלה חייבים להיות בתוך$(call inherit-product path/to/device.mk)
, כמו ב-PRODUCT_PRODUCT_PROPERTIES += product.abc=ok
.
התקנה של מודול במחיצה של המוצר
משתמשים בדגלי ה-build הבאים כדי להתקין מודול במחיצה product
.
product_specific: true
בעודAndroid.bp
LOCAL_PRODUCT_MODULE := true
בעודAndroid.mk
הפעלת אתחול מאומת
כדי למנוע תוכנות זדוניות מלהתעסק במחיצה product
, מפעילים את Android Verified Boot (AVB) במחיצה הזו (כמו במחיצות vendor
ו-system
). כדי להפעיל את AVB, צריך לכלול את דגלי ה-build הבאים: BOARD_AVB_PRODUCT_ADD_HASHTREE_FOOTER_ARGS
.