אובייקט VINTF צובר נתונים מקובצי מניפסט של מכשירים וקובצי מסגרת (XML). שני המניפסטים חולקים פורמט, אם כי לא כל הרכיבים חלים על שניהם (לפרטים על הסכימה, ראה סכימת קובץ מניפסט ).
מניפסט מכשיר
מניפסט המכשיר (המסופק על ידי המכשיר) מורכב ממניפסט הספק וממניפסט ODM.
- מניפסט הספק מפרט HALs, גרסאות מדיניות SELinux וכו' המשותפות ל-SoC. מומלץ למקם בעץ המקור של אנדרואיד
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
- אם
- המניפסט של הספק מפרט HALs ספציפיים למוצר במחיצת הספק. אובייקט 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
(מורשת, ללא שברים)
שים לב ש:
- במכשירים מדור קודם, נעשה שימוש במניפסט של ספק מדור קודם ובמניפסט ODM. המניפסט של ODM עשוי לעקוף לחלוטין את המניפסט של הספק מדור קודם.
- במכשירים שהושקו עם אנדרואיד 9, מניפסט ODM משולב עם מניפסט הספק.
- בעת שילוב של רשימת מניפסטים, מניפסטים המופיעים מאוחר יותר ברשימה עשויים לעקוף תגים במניפסטים המופיעים מוקדם יותר ברשימה, בתנאי שלתגים במניפסט המאוחר יותר יש את התכונה
override="true"
. לדוגמה, המניפסט של ODM עשוי לעקוף כמה תגיות<hal>
מהמניפסט של הספק. עיין בתיעודoverride
של תכונה למטה.
- אם המניפסט של הספק קיים, שלבו את הדברים הבאים:
הגדרה זו מאפשרת למוצרים מרובים עם אותו לוח לשתף את אותה תמונת ספק (המספקת HAL נפוצים) אך עם תמונות 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>
לפרטים נוספים, ראה פיתוח מניפסט התקן .
מניפסט מסגרת
קובץ המניפסט של המסגרת מורכב ממניפסט המערכת, מניפסט המוצר וממניפסט system_ext.
- מניפסט המערכת (המסופק על ידי Google) נוצר באופן ידני וחי בעץ המקור של Android בכתובת
/system/libhidl/manifest.xml
. - מניפסט המוצר (המסופק על ידי המכשיר) מפרט HALs המטופלים על ידי מודולים המותקנים על מחיצת המוצר.
- מניפסט system_ext (המסופק על ידי המכשיר) מפרט את הדברים הבאים:
- HALs מטופלים על ידי מודולים המותקנים במחיצת system_ext;
- גרסאות VNDK;
- גרסת SDK של מערכת.
בדומה למניפסט המכשיר, ניתן להשתמש במספר קובצי פרגמנט. לפרטים, ראה קטעי מניפסט .
הנה מניפסט מסגרת לדוגמה.
<?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>
שברי מניפסט
באנדרואיד 10 ומעלה, אתה יכול לשייך ערך מניפסט למודול HAL במערכת הבנייה. זה מקל על הכללה מותנית של מודול HAL במערכת הבנייה.
דוגמא
בקובץ 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
, צור את המניפסט עבור מודול זה. בזמן הבנייה, המניפסט הזה מתווסף למכשיר. הוספת ערך כאן זהה להוספת ערך במניפסט הראשי של המכשיר. זה מאפשר ללקוחות להשתמש בממשק ומאפשר ל-VTS לזהות אילו יישומי HAL נמצאים במכשיר. כל דבר שמניפסט רגיל עושה, גם המניפסט הזה עושה.
הדוגמה להלן מיישמת את android.hardware.foo@1.0::IFoo/default
, המותקן על vendor
או במחיצת odm
. אם הוא מותקן במחיצת system
, product
או system_ext
, השתמש ב-type framework
במקום ב-type 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>
סכימת קובץ מניפסט
סעיף זה מתאר את המשמעות של תגי XML אלה. כמה תגים "נדרשים" עשויים להיות חסרים בקובץ המקור בעץ המקור של אנדרואיד ונכתבו על ידי assemble_vintf
בזמן הבנייה. תגים נדרשים חייבים להיות נוכחים בקבצים המתאימים במכשיר.
-
?xml
- אופציונאלי. מספק מידע רק למנתח XML.
-
manifest.version
- נדרש. מטא-גרסה של מניפסט זה . מתאר את האלמנטים הצפויים במניפסט. לא קשור לגרסת XML.
-
manifest.type
- נדרש. סוג המניפסט הזה. יש לו את
device
הערך עבור קובץ המניפסט של המכשיר ואתframework
עבור קובץ המניפסט של המסגרת. -
manifest.target-level
- נדרש עבור מניפסט המכשיר. מציין את גרסת מטריצת תאימות המסגרת (FCM) שאליה מכוון מניפסט המכשיר הזה להיות תואם. זה נקרא גם גרסת ה-FCM למשלוח של המכשיר.
-
manifest.hal
- אופציונלי, יכול לחזור. HAL בודד (HIDL או מקורי, כגון GL), בהתאם לתכונת
format
. -
manifest.hal.format
- אופציונאלי. הערך יכול להיות אחד מ:
-
hidl
: HIDL HALs. זוהי ברירת המחדל. -
aidl
: AIDL HALs . תקף רק במטא-מניפסט בגרסה 2.0 ומעלה. -
native
: HALs ילידים.
-
-
manifest.hal.max-level
- אופציונאלי. תקף רק על מניפסטים של מסגרת. אם מוגדר, HALs עם רמה מקסימלית נמוכה מגירסת היעד 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
: שקע 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 HALs,<version>
לא חייב להיות קיים במכשירים עם אנדרואיד 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
- נדרש, יכול לחזור; נדרש למניפסט המסגרת. לא חייב להיות נוכח במניפסט המכשיר. לכניסות
<vendor-ndk>
מרובות חייבות להיות<version>
s שונות. מתאר קבוצה של תמונות VNDK המסופקות על ידי המסגרת. -
manifest.vendor-ndk.version
- נדרש. זהו מספר שלם חיובי המייצג את הגרסה של תמונת המצב של VNDK.
-
manifest.vendor-ndk.library
- אופציונלי, יכול לחזור, ללא כפילויות. מתאר קבוצה של ספריות VNDK שסופקה על ידי המסגרת עבור תמונת מצב זו של ספק VNDK. הערך הוא שם הקובץ של ספרייה, למשל
libjpeg.so
, כולל הקידומתlib
והסיומת.so
. אסור להשתמש ברכיבי נתיב. -
manifest.system-sdk.version
- אופציונלי, יכול לחזור, ללא כפילויות; בשימוש רק במניפסט המסגרת. מתאר קבוצה של גירסאות SDK של המערכת שסופקה על ידי המסגרת ליישומי ספקים.
-
manifest.kernel
- אופציונאלי. מתאר מידע סטטי על הקרנל.
-
manifest.kernel.target-level
- אופציונאלי. מתאר את ענף הגרעין. הערך שלו כברירת מחדל הוא
manifest.target-level
אם אינו קיים. חייב להיות גדול או שווה ל-manifest.target-level
. ראה את כללי התאמת הקרנל לפרטים.