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

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

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

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

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

LSHAL

LSHAL הוא כלי בצד המכשיר שמפרט את כל דפי ה-HAL הרשומים 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. אם יישלח קובץ מניפסט, יש אפשרות ליצור תבנית סטנדרטית מטריצת תאימות שתואמת לקובץ המניפסט.

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

assemble_vintf -m --hals-only \
    -i system/libhidl/manifest.xml \
    -o device/manufacturer/device_name/compatibility_matrix.xml

חשוב לשים לב שכל הגדרה של תוכן עם HAL מוגדרת ל-optional="true".

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

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 של מניפסט של framework ממשתנים

את המשתנים הבאים אפשר להגדיר 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 של מטריצת תאימות ל-framework ממשתנים

את המשתנים הבאים אפשר להגדיר 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

יש להתקין את ה-system_ext של FCM עם מודולים של Sog. ייתכן ש-FCM של המוצר מותקן גם עם מודולים של Sog; לא להגדיר את DEVICE_PRODUCT_COMPATIBILITY_MATRIX_FILE אם נעשה שימוש ב-method. בנוסף, ייתכן שיהיו כמה גרסאות של FCM למוצר וגם גרסאות system_ext של FCM מותקנות באמצעות מודולים של Sog. מגדירים את הדברים הבאים:

  • מגדירים מודול ב-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 של מטריצת תאימות ל-framework:

# 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 עבור ביצוע סריאליזציה, פעולת deserialization ובדיקת תאימות.

רישוי

  • tinyxml2 (חיצוני/tinyxml2) בשביל לבצע סריאליזציה/ביטול סריאליזציה של מאובייקט ל-XML או ממנו. רישיון דמוי BSD.
  • libselinux (חיצוני/selinux/libselinux) לקבלת מדיניות בנושא מדיניות . רישיון שהוא נחלת הכלל.
  • libz (חיצוני/zlib) לביטול דחיסה /proc/config.gz. רישיון דמוי BSD.
  • בפרויקט libvintf נעשה שימוש ברישיון Apache 2.0 (עם רישיון מתאים קובצי MODULE_LICENSE_APACHE2 וקובצי NOTICE).