במקורות המידע הבאים מפורטים מיקומי קוד, כלים, בדיקות ורישוי.
מיקום קוד שאפשר להריץ עליו שאילתות
הקוד של אובייקט ממשק הספק שאפשר להריץ עליו שאילתות מועבר אל system/libvintf.
כלים
יכול להיות שקשה להבין את קובצי המניפסט של כתב היד ואת מטריצות התאימות. אפשר להשתמש בכלים הבאים כדי ליצור תבנית של קובץ מניפסט או מטריצת תאימות, שמהם אפשר להתחיל.
LSHAL
LSHAL הוא כלי בצד המכשיר שמציג רשימה של כל ה-HAL הרשומים ב-hwservicemanager וכל יישומי ה-passthrough הזמינים (למשל android.hardware.foo@1.0-impl.so) במכשיר. אפשר גם ליצור קובץ מניפסט של המכשיר על סמך הרשימה:
adb shell su 0 /system/bin/lshal --init-vintf
שימו לב לנקודות הבאות:
- אם חבילה רשומה ב-
hwservicemanagerונמצאת כ-HAL passthrough, הערך של<transport>מוגדר כ-hwbinder. - לא נכתבה גרסת SELinux במניפסט. מומלץ להוסיף את הרכיב באמצעות
assemble_vintf, כמו שמוסבר בהמשך. - יכול להיות שקובץ המניפסט של HAL שנוצר לא מדויק. נדרשת התערבות אנושית כדי לתקן חוסר עקביות בין מניפסט המכשיר לבין מה ש-
vendor.imgמספק בפועל.
ASSEMBLE_VINTF
assemble_vintf הוא כלי בצד המארח ש:
- בודק אם מטריצת תאימות או קובץ מניפסט תקינים.
- הוספת משתנים למניפסטים או למטריצות תאימות שזמינים בזמן הבנייה, ויצירת קובץ חדש שצריך להתקין במכשיר.
- בודק את התאימות בין הקובץ שנוצר לבין הקובץ התואם שלו.
- אם מצוין קובץ מניפסט, האפשרות הזו יוצרת באופן אופציונלי תבנית מוכנה של מטריצת תאימות שתואמת לקובץ המניפסט.
דוגמה: יצירת מטריצת תאימות מכשירים מקובץ מניפסט של מסגרת
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 של מניפסט המכשיר ממשתנים
בזמן הבנייה, אם המשתנים הבאים מוגדרים ב-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 של מטריצת תאימות מכשירים מתוך משתנים
בזמן הבנייה, אם המשתנים הבאים מוגדרים ב-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 של מניפסט framework:
# 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 ב-product עבור 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 מוסיף את IR HAL למניפסט הספק אם 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) for serializing/deserializing the object to/from XML. רישיון דומה ל-BSD. -
libselinux(external/selinux/libselinux) כדי לקבל את הגרסה של policydb. רישיון של נחלת הכלל. -
libz(external/zlib) לצורך ביטול הדחיסה של/proc/config.gz. רישיון דומה ל-BSD. libvintfהפרויקט משתמש ברישיון Apache 2.0 (עם קובצי MODULE_LICENSE_APACHE2 ו-NOTICE מתאימים).