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

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

מיקום קוד שאפשר להריץ עליו שאילתות

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

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

LSHAL

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

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

שימו לב לנקודות הבאות:

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

ASSEMBLE_VINTF

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

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

בזמן הבנייה, אם המשתנים הבאים מוגדרים ב-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 מתאימים).