מקורות מידע נוספים

במקורות המידע הבאים מפורטים פרטים על מיקומי קוד, כלים, בדיקות והיתרים.

מיקום הקוד שניתן לשלוח עליו שאילתה

הקוד של אובייקט ממשק הספק שניתן לשלוח אליו שאילתות עובר אל system/libvintf.

כתיבת קובצי מניפסט ומטריצות תאימות ביד יכולה להיות משימה קשה. תוכלו להשתמש בכלים הבאים כדי ליצור תבנית ראשונית של מניפסט או של מטריצת תאימות, שתוכלו להתחיל ממנה.

LSHAL

LSHAL הוא כלי בצד המכשיר שמציג את כל ה-HALs הרשומים ל-hwservicemanager ואת כל הטמעות העברה החיובית הזמינות (למשל android.hardware.foo@1.0-impl.so) במכשיר. הוא יכול גם ליצור קובץ מניפסט של מכשיר על סמך הרשימה:

adb shell su 0 /system/bin/lshal --init-vintf

חשוב לזכור:

  1. אם חבילה רשומה ב-hwservicemanager ונמצאת כ-HAL של העברה, הערך של <transport> מוגדר כ-hwbinder.
  2. לא נכתבת גרסה של SELinux במניפסט. מומלץ להחדיר את הרכיב דרך assemble_vintf כפי שמוסבר בהמשך.
  3. יכול להיות שקובץ המניפסט של HAL שנוצר לא מדויק. נדרש טיפול ידני כדי לתקן אי-התאמות בין המניפסט של המכשיר לבין מה ש-vendor.img מספק בפועל.

ASSEMBLE_VINTF

assemble_vintf הוא כלי בצד המארח שמאפשר:

  1. בדיקה אם מטריצה של תאימות או קובץ מניפסט תקינים.
  2. הכלי מזין משתנים למניפסטים או למטריצות תאימות שזמינות בזמן ה-build, ויוצר קובץ חדש שצריך להתקין במכשיר.
  3. בדיקת התאימות בין הקובץ שנוצר לבין הקובץ המקביל.
  4. אם מצוין קובץ מניפסט, המערכת יכולה ליצור באופן אופציונלי מטריצה סטנדרטית של תאימות שתהיה תואמת לקובץ המניפסט.

דוגמה: יצירת מטריצה של תאימות מכשירים מקובץ מניפסט של מסגרת

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 המתאימים).