במקורות המידע הבאים מפורטים פרטים על מיקומי קוד, כלים, בדיקות והיתרים.
מיקום הקוד שניתן לשלוח עליו שאילתה
הקוד של אובייקט ממשק הספק שניתן לשלוח אליו שאילתות עובר אל system/libvintf
.
כלים
כתיבת קובצי מניפסט ומטריצות תאימות ביד יכולה להיות משימה קשה. תוכלו להשתמש בכלים הבאים כדי ליצור תבנית ראשונית של מניפסט או של מטריצת תאימות, שתוכלו להתחיל ממנה.
LSHAL
LSHAL הוא כלי בצד המכשיר שמציג את כל ה-HALs הרשומים ל-hwservicemanager
ואת כל הטמעות העברה החיובית הזמינות (למשל android.hardware.foo@1.0-impl.so
) במכשיר. הוא יכול גם ליצור קובץ מניפסט של מכשיר על סמך הרשימה:
adb shell su 0 /system/bin/lshal --init-vintf
חשוב לזכור:
- אם חבילה רשומה ב-
hwservicemanager
ונמצאת כ-HAL של העברה, הערך של<transport>
מוגדר כ-hwbinder
. - לא נכתבת גרסה של SELinux במניפסט. מומלץ להחדיר את הרכיב דרך
assemble_vintf
כפי שמוסבר בהמשך. - יכול להיות שקובץ המניפסט של HAL שנוצר לא מדויק. נדרש טיפול ידני כדי לתקן אי-התאמות בין המניפסט של המכשיר לבין מה ש-
vendor.img
מספק בפועל.
ASSEMBLE_VINTF
assemble_vintf
הוא כלי בצד המארח שמאפשר:
- בדיקה אם מטריצה של תאימות או קובץ מניפסט תקינים.
- הכלי מזין משתנים למניפסטים או למטריצות תאימות שזמינות בזמן ה-build, ויוצר קובץ חדש שצריך להתקין במכשיר.
- בדיקת התאימות בין הקובץ שנוצר לבין הקובץ המקביל.
- אם מצוין קובץ מניפסט, המערכת יכולה ליצור באופן אופציונלי מטריצה סטנדרטית של תאימות שתהיה תואמת לקובץ המניפסט.
דוגמה: יצירת מטריצה של תאימות מכשירים מקובץ מניפסט של מסגרת
assemble_vintf -m --hals-only \ -i system/libhidl/manifest.xml \ -o device/manufacturer/device_name/compatibility_matrix.xml
חשוב לזכור שכל ה-HAL מוגדרים ל-optional="true"
.
דוגמה: יצירת מטריצה של תאימות של מסגרת שלד מקובץ מניפסט של מכשיר
assemble_vintf -m --hals-only \ -i device/foo/bar/manifest.xml \ -o path/to/place/output/compatibility_matrix.xml
חשוב לזכור שכל ה-HAL מוגדרים ל-optional="true"
.
דוגמה: יצירת קובצי XML של מניפסט המכשיר ממשתנים
בזמן ה-build, אם המשתנים הבאים מוגדרים ב-device/manufacturer/device_name/BoardConfig.mk
:
# Vendor manifest is named DEVICE_MANIFEST_FILE for legacy reasons. DEVICE_MANIFEST_FILE := \ device/manufacturer/device_name/vendor_manifest.xml ODM_MANIFEST_FILES := \ device/manufacturer/device_name/odm_manifest.xml ODM_MANIFEST_SKUS := sku1 sku2 ODM_MANIFEST_SKU1_FILES := \ device/manufacturer/device_name/odm_manifest_sku1.xml ODM_MANIFEST_SKU2_FILES := \ device/manufacturer/device_name/odm_manifest_sku2.xml
לאחר מכן, הפקודות הבאות מופעלות (במערכת ה-build, עם שינויים כדי להשמיט את פרטי ההטמעה) כדי ליצור קובצי XML של מניפסט המכשיר:
# vendor manifest; only when DEVICE_MANIFEST_FILE is set BOARD_SEPOLICY_VERS=$(BOARD_SEPOLICY_VERS) assemble_vintf \ $(addprefix,-i ,$(DEVICE_MANIFEST_FILE)) \ -o $(TARGET_OUT_VENDOR)/etc/vintf/manifest.xml # ODM manifests assemble_vintf \ $(addprefix,-i ,$(ODM_MANIFEST_FILES)) \ -o $(TARGET_OUT_ODM)/etc/vintf/manifest.xml # ODM manifests for each sku assemble_vintf \ $(addprefix,-i ,$(ODM_MANIFEST_SKU1_FILES)) \ -o $(TARGET_OUT_ODM)/etc/vintf/manifest_sku1.xml assemble_vintf \ $(addprefix,-i ,$(ODM_MANIFEST_SKU2_FILES)) \ -o $(TARGET_OUT_ODM)/etc/vintf/manifest_sku2.xml
במהלך זמן הריצה, אובייקט ה-VINTF משללב בין מניפסטים של ספקים לבין מניפסטים של ODM כמניפסט המכשיר. פרטים נוספים זמינים במאמר מניפסט של מכשיר.
דוגמה: יצירת קובצי XML של מטריצה של תאימות מכשירים ממשתנים
בזמן ה-build, אם המשתנים הבאים מוגדרים ב-device/manufacturer/device_name/BoardConfig.mk
:
# vendor compatibility matrix is named DEVICE_MATRIX_FILE for legacy reasons. DEVICE_MATRIX_FILE := \ device/manufacturer/device_name/vendor_compatibility_matrix.xml \ device/manufacturer/device_name/vendor_compatibility_matrix_additional.xml
לאחר מכן, הפקודות הבאות מופעלות (במערכת ה-build, עם שינויים כדי להשמיט את פרטי ההטמעה) כדי ליצור קובצי XML של מטריצות תאימות למכשירים:
# vendor compatibility matrix; only when DEVICE_MATRIX_FILE is set assemble_vintf \ $(addprefix,-i ,$(DEVICE_MATRIX_FILE)) \ -o $(TARGET_OUT_VENDOR)/etc/vintf/compatibility_matrix.xml
בסביבת זמן הריצה, אובייקט ה-VINTF משתמש במטריצת התאימות של הספק בתור מטריצת התאימות של המכשיר. פרטים נוספים זמינים בטבלת התאימות של המכשירים.
דוגמה: יצירת קובצי XML של מניפסט מסגרת ממשתנים
אפשר להגדיר את המשתנים הבאים ב-device/manufacturer/device_name/BoardConfig.mk
:
# Device-specific system manifest is named DEVICE_FRAMEWORK_MANIFEST_FILE for legacy reasons DEVICE_FRAMEWORK_MANIFEST_FILE := \ device/manufacturer/device_name/device_system_manifest.xml # Product manifest PRODUCT_MANIFEST_FILES := \ device/manufacturer/device_name/product_manifest.xml
הפקודות הבאות מופעלות (במערכת ה-build, עם שינויים כדי להשמיט פרטי הטמעה) כדי ליצור קובצי XML של מניפסט מסגרת:
# system manifest assemble_vintf \ -i system/libhidl/vintfdata/manifest.xml \ $(addprefix,-i ,$(DEVICE_FRAMEWORK_MANIFEST_FILE)) \ -o $(TARGET_OUT)/etc/vintf/manifest.xml # product manifest assemble_vintf \ $(addprefix,-i ,$(PRODUCT_MANIFEST_FILES)) \ -o $(TARGET_OUT_PRODUCT)/etc/vintf/manifest.xml
במהלך זמן הריצה, אובייקט VINTF משלב את מניפסט המערכת, את קטעי המניפסט של המערכת, את מניפסט המוצר ואת קטעי המניפסט של המוצר כמניפסט המסגרת. פרטים נוספים זמינים במאמר מניפסט של Framework.
דוגמה: יצירת קובצי XML של מטריצות תאימות של מסגרות מתוך משתנים
אפשר להגדיר את המשתנים הבאים ב-device/manufacturer/device_name/BoardConfig.mk
כדי להגדיר את FCM של המוצר ואת FCM המערכת הספציפי למכשיר:
DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE := \ device/manufacturer/device_name/product_compatibility_matrix.xml # Device-specific system compatibility matrix is named # DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE for legacy reasons. DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE := \ device/manufacturer/device_name/device_system_compatibility_matrix.xml
צריך להתקין את FCM של system_ext באמצעות מודולים של Soong. אפשר גם להתקין את FCM של המוצר באמצעות מודולים של Soong. אם משתמשים בשיטה הזו, לא מגדירים את DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE
. בנוסף, אפשר להתקין כמה גרסאות של FCM למוצרים וגרסאות של FCM ל-system_ext באמצעות מודולים של Soong.
מגדירים את הפרטים הבאים:
-
מגדירים מודול ב-
device/manufacturer/device_name/Android.bp
. לדוגמה (מחליפים את system_ext במוצר עבור FCM של מוצר):vintf_compatibility_matrix { name: "system_ext_compatibility_matrix.xml", stem: "compatibility_matrix.xml", system_ext_specific: true, // product_specific: true, // for product FCM srcs: [ "system_ext_compatibility_matrix.xml", ], }
-
מתקינים את המודול ב-
device/manufacturer/device_name/device.mk
. לדוגמה:PRODUCT_PACKAGES += system_ext_compatibility_matrix.xml
הפקודות הבאות מופעלות (במערכת ה-build, עם שינויים כדי להשמיט פרטי הטמעה) כדי ליצור קובצי XML של מטריצות תאימות של מסגרות:
# common system compatibility matrix for each FCM version BOARD_SEPOLICY_VERS=$(BOARD_SEPOLICY_VERS) \ POLICYVERS=$(POLICYVERS) \ BOARD_AVB_VBMETA_VERSION=$(BOARD_AVB_VBMETA_VERSION) assemble_vintf \ -i hardware/interfaces/compatibility_matrices/compatibility_matrix.empty.xml $(addprefix,-i ,$(DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE)) \ -o $(TARGET_OUT)/etc/vintf/compatibility_matrix.device.xml # framework compatibility matrixes at each FCM version assemble_vintf -i hardware/interfaces/compatibility_matrices/compatibility_matrix.{level}.xml \ -o $(TARGET_OUT)/etc/vintf/compatibility_matrix.{level}.xml \ --kernel=... # product framework compatibility matrix; only when # DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE is set or when the Soong module for # product FCM is defined assemble_vintf -i $(DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE) -o $(TARGET_OUT_PRODUCT)/etc/vintf/compatibility_matrix.xml # system_ext framework compatibility matrix; only when the Soong module for # system_ext FCM is defined assemble_vintf -i <srcs for the soong module> -o $(TARGET_OUT_SYSTEM_EXT)/etc/vintf/compatibility_matrix.xml
במהלך זמן הריצה, אובייקט VINTF משללב קבוצת משנה של מטריצות תאימות למערכת ומטריצות תאימות למוצרים כמטריצה של תאימות למסגרת. פרטים נוספים זמינים במטריצה של תאימות המסגרות.
דוגמה: יצירת המניפסט של הספק מקטעים
אפשר לקבץ כמה קטעי מניפסט של ספקים בזמן ה-build. לדוגמה:
<!-- device/manufacturer/device_name/manifest_common.xml --> <manifest version="1.0" type="device"> <!-- common HALs here --> </manifest>
<!-- device/manufacturer/device_name/ir.xml --> <manifest version="1.0" type="device"> <hal> <name>android.hardware.ir</name> <version>1.0</version> <!-- other fields --> </hal> </manifest>
# device/manufacturer/device_name/BoardConfig.mk DEVICE_MANIFEST_FILE := device/manufacturer/device_name/manifest_common.xml ifdef BOARD_ENABLE_IR DEVICE_MANIFEST_FILE += device/manufacturer/device_name/ir.xml endif
לאחר מכן, assemble_vintf
מוסיף את ה-HAL של IR למניפסט של הספק אם הערך של BOARD_ENABLE_IR
מוגדר, ומשמיט אותו אם הערך של BOARD_ENABLE_IR
לא מוגדר. כדי ליצור את המניפסט של הספק, מריצים את הפקודות הבאות (ששונו כדי להשמיט את פרטי ההטמעה):
# if BOARD_ENABLE_IR is defined BOARD_SEPOLICY_VERS=10000.0 assemble_vintf \ -i device/manufacturer/device_name/manifest_common.xml:device/manufacturer/device_name/ir.xml \ -o $(TARGET_OUT_VENDOR)/manifest.xml # if BOARD_ENABLE_IR is not defined BOARD_SEPOLICY_VERS=10000.0 assemble_vintf \ -i device/manufacturer/device_name/manifest_common.xml \ -o $(TARGET_OUT_VENDOR)/manifest.xml
לקבלת פרטים, ראה:
assemble_vintf --help
בדיקה
בפרויקט platform/system/libvintf
נעשה שימוש ב-GTest לצורך סריאליזציה, דה-סריאליזציה ובדיקת תאימות.
רישוי
tinyxml2
(external/tinyxml2) לסריאליזציה/לפענוח של האובייקט ל-XML או מ-XML. רישיון שדומה ל-BSD.libselinux
(external/selinux/libselinux) כדי לקבל את גרסת policydb. רישיון בתחום הציבורי.libz
(external/zlib) לצורך דחיסה של/proc/config.gz
. רישיון שדומה ל-BSD.- הפרויקט
libvintf
משתמש ברישיון Apache 2.0 (עם קובצי MODULE_LICENSE_APACHE2 ו-NOTICE המתאימים).