אובייקט VINTF צובר נתונים ממכשיר קובצי מניפסט ומניפסט של framework (XML). שתי השיטות יש פורמט משותף למניפסטים, אבל לא כל הרכיבים חלים על שניהם (פרטים נוספים) בסכימה, ראו סכימת קובצי מניפסט).
מניפסט מכשיר
מניפסט המכשיר (מסופק על ידי המכשיר) מורכב ממניפסט של הספק ואת המניפסט של ODM.
- במניפסט של הספק מצוין HAL, גרסאות של מדיניות SELinux וכו' שמשותפים ל-SoC. הוא
מומלץ למקם את עץ המקור של Android ב
device/VENDOR/DEVICE/manifest.xml
, אבל מספר מקטעים קבצים שימושיים. לפרטים נוספים אפשר לעיין בקטעי מניפסט יצירה DM מקטעים. - במניפסט ODM מפורטים HALs ספציפיים למוצר
מחיצת ODM.
האובייקט VINTF טוען את המניפסט של ODM לפי הסדר הבא:
- אם מוגדר
SKU
(כאשרSKU
הוא הערך של הנכסro.boot.product.hardware.sku
),/odm/etc/vintf/manifest_SKU.xml
/odm/etc/vintf/manifest.xml
- אם מגדירים את
SKU
,/odm/etc/manifest_SKU.xml
/odm/etc/manifest.xml
- אם מוגדר
- במניפסט של הספק מפורטות דרישות HAL שספציפיות למוצר במחיצת הספק.
אובייקט ה-VINTF טוען את המניפסט של הספק לפי הסדר הבא:
- אם מוגדר
SKU
(כאשרSKU
הוא הערך של הנכסro.boot.product.vendor.sku
),/vendor/etc/vintf/manifest_SKU.xml
/vendor/etc/vintf/manifest.xml
- אם מוגדר
- אובייקט ה-VINTF טוען את המניפסט של המכשיר לפי הסדר הבא:
- אם יש מניפסט של ספק, צריך לשלב את הפרטים הבאים:
- המניפסט של הספק
- קטעים אופציונליים במניפסט של הספק
- מניפסט אופציונלי ל-ODM
- קטעים אופציונליים של מניפסט ODM
- אחרת, אם קיים מניפסט ODM, משלבים את המניפסט של ODM עם ה-ODM האופציונלי מקטעי מניפסט.
/vendor/manifest.xml
(מדור קודם, ללא מקטעים)- לבסוף, צריך לשלב מקטעי מניפסט מכל APEX של ספק.
הערה:
- במכשירים מדור קודם, נעשה שימוש במניפסט של הספק הקודם ובמניפסט של ODM. מניפסט ODM עשוי לבטל לחלוטין את המניפסט הקודם של הספק.
- במכשירים עם Android 9, המניפסט של ODM משולב באמצעות המניפסט של הספק.
- כשמשלבים רשימת מניפסטים, מניפסטים שמופיעים בהמשך הרשימה עשויים לבטל
במניפסטים שמופיעים מוקדם יותר ברשימה, בתנאי שהתגים
למניפסט יש את המאפיין
override="true"
. לדוגמה, המניפסט של ODM עשוי לשנות חלק מתגי<hal>
מהמניפסט של הספק. אפשר לעיין במסמכי התיעוד עבור מאפייןoverride
למטה.
- אם יש מניפסט של ספק, צריך לשלב את הפרטים הבאים:
ההגדרה הזו מאפשרת לכמה מוצרים בעלי אותו לוח לשתף את אותו לוח תמונה של הספק (שמאפשרת HALs נפוצים) אבל יש לה תמונות ODM שונות לציין ערכי HAL ספציפיים למוצר).
הנה דוגמה למניפסט של ספק.
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="2.0" type="device" target-level="1"> <hal> <name>android.hardware.camera</name> <transport>hwbinder</transport> <version>3.4</version> <interface> <name>ICameraProvider</name> <instance>legacy/0</instance> <instance>proprietary/0</instance> </interface> </hal> <hal> <name>android.hardware.nfc</name> <transport>hwbinder</transport> <version>1.0</version> <version>2.0</version> <interface> <name>INfc</name> <instance>nfc_nci</instance> </interface> </hal> <hal> <name>android.hardware.nfc</name> <transport>hwbinder</transport> <fqname>@2.0::INfc/default</fqname> </hal> <hal> <name>android.hardware.drm</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ICryptoFactory</name> <instance>default</instance> </interface> <interface> <name>IDrmFactory</name> <instance>default</instance> </interface> <fqname>@1.1::ICryptoFactory/clearkey</fqname> <fqname>@1.1::IDrmFactory/clearkey</fqname> </hal> <hal format="aidl"> <name>android.hardware.light</name> <version>1</version> <fqname>ILights/default</fqname> </hal> <hal format="aidl"> <name>android.hardware.power</name> <version>2</version> <interface> <name>IPower</name> <instance>default</instance> </interface> </hal> <hal format="native"> <name>EGL</name> <version>1.1</version> </hal> <hal format="native"> <name>GLES</name> <version>1.1</version> <version>2.0</version> <version>3.0</version> </hal> <sepolicy> <version>25.0</version> </sepolicy> </manifest>
הנה דוגמה למניפסט ODM.
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="1.0" type="device"> <!-- camera 3.4 in vendor manifest is ignored --> <hal override="true"> <name>android.hardware.camera</name> <transport>hwbinder</transport> <version>3.5</version> <interface> <name>ICameraProvider</name> <instance>legacy/0</instance> </interface> </hal> <!-- NFC is declared to be disabled --> <hal override="true"> <name>android.hardware.nfc</name> <transport>hwbinder</transport> </hal> <hal> <name>android.hardware.power</name> <transport>hwbinder</transport> <version>1.1</version> <interface> <name>IPower</name> <instance>default</instance> </interface> </hal> </manifest>
הנה דוגמה למניפסט של מכשיר בחבילת OTA.
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="1.0" type="device" target-level="1"> <!-- hals ommited --> <kernel version="4.4.176"> <config> <key>CONFIG_ANDROID</key> <value>y</value> </config> <config> <key>CONFIG_ARM64</key> <value>y</value> </config> <!-- other configs ommited --> </kernel> </manifest>
אפשר לקרוא מידע נוסף במאמר מניפסט מכשירים פיתוח.
מניפסט של המסגרת
קובץ המניפסט של framework מורכב ממניפסט המערכת, מניפסט המוצר system_ext למניפסט.
-
מניפסט המערכת (מסופק על ידי Google) נוצר באופן ידני
נמצא בעץ המקור של Android
/system/libhidl/manifest.xml
- במניפסט המוצר (מסופק על ידי המכשיר) מפורטות דפי HAL שמקבלים שירות על ידי מודולים שהותקנו חלוקת מוצרים.
-
המניפסט system_ext (מסופק על ידי המכשיר) מפרט את הפרטים הבאים:
- שירות HAL שמספק מודולים שמותקנים במחיצת system_ext;
- גרסאות VNDK;
- גרסת ה-SDK של המערכת.
בדומה למניפסט של המכשיר, ניתן להשתמש במספר קובצי מקטעים. פרטים נוספים זמינים במאמר קטעי מניפסט.
הנה דוגמה למניפסט של framework.
<?xml version="1.0" encoding="UTF-8"?> <!-- Comments, Legal notices, etc. here --> <manifest version="1.0" type="framework"> <hal> <name>android.hidl.allocator</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>IAllocator</name> <instance>ashmem</instance> </interface> </hal> <hal> <name>android.hidl.memory</name> <transport arch="32+64">passthrough</transport> <version>1.0</version> <interface> <name>IMapper</name> <instance>ashmem</instance> </interface> </hal> <hal> <name>android.hidl.manager</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>IServiceManager</name> <instance>default</instance> </interface> </hal> <hal> <name>android.frameworks.sensorservice</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ISensorManager</name> <instance>default</instance> </interface> </hal> <hal max-level="5"> <name>android.frameworks.schedulerservice</name> <transport>hwbinder</transport> <version>1.0</version> <interface> <name>ISchedulingPolicyService</name> <instance>default</instance> </interface> </hal> <vendor-ndk> <version>27</version> </vendor-ndk> <system-sdk> <version>27</version> </system-sdk> </manifest>
קטעי מניפסט
ב-Android מגרסה 10 ואילך, אפשר לשייך מניפסט עם מודול HAL במערכת ה-build. כך קל יותר לכלול באופן מותנה את מודול ה-HAL במערכת ה-build.
דוגמה
בקובץ Android.bp
או Android.mk
, מוסיפים
vintf_fragments
לכל מודול. לדוגמה, אפשר לשנות
של המודול עם הטמעת תקן HAL
(my.package.foo@1.0-service-bar
).
... { ... vintf_fragments: ["manifest_foo.xml"], ... }
LOCAL_MODULE := ... LOCAL_VINTF_FRAGMENTS := manifest_foo.xml
בקובץ בשם manifest_foo.xml
, יוצרים את המניפסט עבור
של המודול הזה. בזמן ה-build, המניפסט הזה מתווסף למכשיר. ההוספה מתבצעת
רשומה כאן זהה להוספת רשומה במניפסט הראשי של המכשיר.
האימות מאפשר ללקוחות להשתמש בממשק ומאפשר ל-VTS לזהות איזה HAL
נמצאים במכשיר. כל דבר שמניפסט רגיל
כן, המניפסט הזה כן רלוונטי.
הדוגמה הבאה מטמיעה
android.hardware.foo@1.0::IFoo/default
, שמותקן ל-
המחיצה vendor
או odm
. אם היא מותקנת
חלוקה למחיצה system
, product
או system_ext
, סוג השימוש
framework
במקום
מקלידים device
.
<manifest version="1.0" type="device"> <hal format="hidl"> <name>android.hardware.foo</name> <transport>hwbinder</transport> <fqname>@1.0::IFoo/default</fqname> </hal> </manifest>
אם מודול HAL ארוז ב-APEX של ספק,
לארוז את מקטעי ה-VINTF המשויכים בתוך אותו APEX עם prebuilt_etc
כמו
שמוסבר בקטעים של VINTF.
סכימה של קובץ מניפסט
בקטע הזה מתוארת המשמעות של תגי ה-XML האלה. כמה "חובה" תגים
יכול להיות חסר בקובץ המקור בעץ המקור של Android והוא נכתב על ידי
assemble_vintf
בזמן ה-build. תגים נדרשים חייבים להופיע בקבצים המתאימים באתר
במכשיר.
?xml
- אופציונלי. מספק מידע רק למנתח ה-XML.
manifest.version
- חובה. מטא-גרסת של המניפסט הזה. מתאר את הרכיבים הצפויים במניפסט. לא קשור לגרסת ה-XML.
manifest.type
- חובה. סוג המניפסט הזה. הערך שלו הוא
device
עבור קובץ המניפסט של המכשיר ו-framework
למניפסט של ה-framework manifest.target-level
- חובה למניפסט של המכשיר. מציינת את מטריצת התאימות של framework (FCM) שלפיה מניפסט המכשיר הזה מיועד לתאימות עם. היא נקראת גם גרסת FCM למשלוח של המכשיר.
manifest.hal
- אופציונלי, אפשר לחזור על הפעולה. HAL יחיד (HIDL או מותאם, כמו GL),
בהתאם למאפיין
format
. manifest.hal.format
- אופציונלי. הערך יכול להיות אחד מהערכים הבאים:
hidl
: HIDL HALs. (זוהי ברירת המחדל)aidl
: AIDL HALs. תקף רק בגרסת מטא של המניפסט 2.0 ומעלה.native
: מודעות HTML מותאמות.
manifest.hal.max-level
- אופציונלי. תקף רק למניפסטים של framework. אם המדיניות מוגדרת, שיעורי HAL עם רמה מקסימלית נמוכה יותר גרסת היעד של FCM במניפסט של המסגרת מושבתת.
manifest.hal.override
- אופציונלי. הערך יכול להיות אחד מהערכים הבאים:
true
: שינוי רכיבי<hal>
אחרים עם ונותנים את אותה גרסה<name>
וגרסה ראשית. אם לא<version>
או<fqname>
נמצאים בזה הרכיב<hal>
, ולאחר מכן הרכיב<hal>
הצהרה על השבתת ה-HAL הזה.false
: לא לבטל רכיבי<hal>
אחרים עם אותן<name>
והגרסה הראשית.
manifest.hal.name
- חובה. שם חבילה שמוגדר במלואו של HAL. אפשר להשתמש במספר רשומות HAL
אותו שם. למשל:
android.hardware.camera
(HIDL או AIDL HAL)GLES
(HAL מקורי, נדרש שם בלבד)
manifest.hal.transport
- חובה כאשר
manifest.hal.format == "hidl"
. לא יכול להיות קיים אחרת. מציין באיזו העברה נעשה שימוש בממשק של החבילה הזו נשאלת במנהל השירות. הערך יכול להיות אחד מהערכים הבאים:hwbinder
: מצב משניpassthrough
: מצב העברה
- אופציונלי כאשר
manifest.hal.format == "aidl"
. לא יכול להיות קיים אחרת. קובעת באיזו העברה נעשה שימוש כשמוצג ממשק מרחוק. הערך חייב להיות:inet
: שקע פנימי
manifest.hal.transport.ip
וגםmanifest.hal.transport.port
כדי לציין פרטי חיבור נוספים ב-Inet. manifest.hal.transport.arch
- חובה עבור
passthrough
ולא ניתן לכלול אותה עבורhwbinder
. תיאור הביטים של שירות המעבר שניתנו. הערך יכול להיות אחד מהערכים הבאים:32
: מצב 32 ביט64
: מצב 64 ביט32+64
: גם וגם
manifest.hal.transport.ip
- חובה עבור
inet
ואין להציג אותה אחרת. מתאר את כתובת ה-IP שממנו מוצג הממשק המרוחק. manifest.hal.transport.port
- חובה עבור
inet
ואין להציג אותה אחרת. מתאר את היציאה מ- שבו מוצג הממשק המרוחק. manifest.hal.version
- אופציונלי, אפשר לחזור על הפעולה. גרסה של התגים
hal
ב .
בשביל HIDL ו-HALs מקוריים, הפורמט הואMAJOR.MINOR
. עבור דוגמאות:hardware/interfaces
,vendor/${VENDOR}/interfaces
,frameworks/hardware/interfaces
, אוsystem/hardware/interfaces
ב-HIDL וב-HALs מקוריים מותר להשתמש בכמה שדות של גרסאות, כל עוד הם מייצגים גרסאות ראשיות ייחודיות, עם גרסה משנית אחת בלבד לכל ראשי שסופקה. לדוגמה, העמודות 3.1 ו-3.2 לא יכולות להתקיים בו-זמנית, אבל הסטטוסים 1.0 ו-3.4 יכולים להופיע בו-זמנית. הכלל הזה חל על כל רכיביhal
שיש להם אותו שם, אלא אםoverride="true"
. הערכים של<version>
הם לא משויך אל<fqname>
כי<fqname>
כוללת גרסה.
ל-AIDL HAL, לא ניתן לכלול את<version>
במכשירים שפועלים Android מגרסה 11 ומטה.<version>
חייב להיות מספר שלם יחיד במכשירים עם Android מגרסה 12 ואילך. לכל היותר צריך להיות<version>
אחד טמפל(package, interface, instance)
. אם הוא לא נמצא, ברירת המחדל היא1
הערך של<version>
משויך אל כל<fqname>
באותו<hal>
כי ל-<fqname>
אין גרסה. manifest.hal.interface
- חובה, אפשר לחזור על הפעולה ללא כפילויות. לציין ממשק
חבילה שיש לה שם של מכונה. יכולים להיות כמה
רכיבי
<interface>
ב-<hal>
; שמות חייב להיות ייחודי. manifest.hal.interface.name
- חובה. שם הממשק.
manifest.hal.interface.instance
- חובה, אפשר לחזור על הפעולה. שם המופע של הממשק. יכול להיות כמה פעמים
מופעים של ממשק אבל ללא כפילויות של
<instance>
רכיבים. manifest.hal.fqname
- אופציונלי, אפשר לחזור על הפעולה. דרך חלופית לציין מופע ל-HAL
בשם
manifest.hal.name
.- עבור HIDL HAL, הפורמט הוא
@MAJOR.MINOR::INTERFACE/INSTANCE
- ב-AIDL HALs, הפורמט הוא
INTERFACE/INSTANCE
- עבור HIDL HAL, הפורמט הוא
manifest.sepolicy
- חובה. יש בו את כל הרשומות שקשורות למדיניות.
manifest.sepolicy.version
- חובה למניפסט של המכשיר. מצהירה על גרסת SELinux. כולל את
פורמט
SDK_INT.PLAT_INT
. manifest.vendor-ndk
- חובה, אפשר לחזור על הפעולה; שנדרשת למניפסט של ה-framework. לא מופיע
במניפסט של המכשיר. חייבים להיות כמה רשומות של
<vendor-ndk>
<version>
שונים. תיאור קבוצה של תמונות מצב VNDK שסופקו על ידי המסגרת. manifest.vendor-ndk.version
- חובה. זהו מספר שלם חיובי שמייצג את הגרסה של ה-VNDK קובץ snapshot.
manifest.vendor-ndk.library
- אופציונלי, אפשר לחזור על עצמן ללא כפילויות. תיאור קבוצה של ספריות VNDK
סופקו על ידי ה-framework עבור תמונת המצב של הספק VNDK הזה. הערך הוא
של ספרייה, למשל
libjpeg.so
, כולל הקידומתlib
והסיומת.so
. אין רכיבי נתיב . manifest.system-sdk.version
- אופציונלי, אפשר לחזור על כך, ללא כפילויות; משמש רק את ה-framework . מיועד לתיאור קבוצה של גרסאות SDK של מערכת שמסופקות על ידי ה-framework כדי אפליקציות של ספקים.
manifest.kernel
- אופציונלי. מתאר מידע סטטי על הליבה.
manifest.kernel.target-level
- אופציונלי. מתאר את הסתעפות הליבה. ערך ברירת המחדל הוא
manifest.target-level
אם הוא לא קיים. חייב להיות גדול מ- או שווה ל-manifest.target-level
. צפייה כללים להתאמה של ליבה (kernel) לקבלת פרטים.