מחיצות מוצרים

ב-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
  • לא ניתן לעדכן אותם. בדרך כלל הם מופעלים פעם אחת במפעל.
  • נוצרות בהתאם לוריאציות קטנות, כמו מיתוג וצבע. תוכן המחיצה oem יכול להיות שונה, אבל זה לא אומר שתוכנת המוצר שונה.
  • המחיצה system לא תלויה במחיצה oem. (המערכת משתמשת במחיצה oem רק כשנמצא בה קובץ ספציפי).
  • משתמשת רק ב-API ציבורי במחיצה system.
product
  • אפשר לעדכן אותם
  • יחד עם קובץ האימג' של המערכת (הם מתעדכנים יחד)
  • נוצרים לכל מוצר או לקבוצות של מוצרים.
  • מחיצה המערכת יכולה להיות תלויה במחיצה product.
  • אפשר להשתמש בממשקי API לא ציבוריים כי הם מתעדכנים בו-זמנית.
product (ממשקים מאולצים)
  • אפשר לעדכן אותם
  • ניתוק מהקובץ ה-image של המערכת.
  • נוצרים לכל מוצר או לקבוצות של מוצרים.
  • המחיצה system לא תלויה במחיצה product.
  • לא ניתן להשתמש בממשקי API מוסתרים, אלא רק בממשקי API ציבוריים וממשקי API של מערכת במחיצה system.

לכן, ב-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.