مراجع إضافية

توفّر المَراجع التالية تفاصيل حول مواقع الرموز البرمجية والأدوات والاختبار والترخيص.

موقع الرمز البرمجي القابل للاستعلام

يتم وضع الرمز البرمجي لكائن واجهة مورّد قابل للاستعلام في 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. تُدخِل متغيرات في البيانات/مصفوفات التوافق المتاحة في وقت الإنشاء وتُنشئ ملفًا جديدًا يجب تثبيته على الجهاز.
  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

يتم بعد ذلك تنفيذ الأوامر التالية (في نظام الإنشاء، تم تعديلها لحذف تفاصيل التنفيذ) لإنشاء ملفات 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

يتم بعد ذلك تنفيذ الأوامر التالية (في نظام الإنشاء، تم تعديلها لحذف تفاصيل التنفيذ) لإنشاء ملفات 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

يتم تنفيذ الأوامر التالية (في نظام الإنشاء، تم تعديلها لحذف تفاصيل التنفيذ) لإنشاء ملفات 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 بين بيان النظام وأجزاء بيان النظام وبيان المنتج وأجزاء بيان المنتج كبيان إطار العمل. لمزيد من التفاصيل، يُرجى الاطّلاع على بيان إطار العمل .

مثال: إنشاء ملفات 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

يتم تنفيذ الأوامر التالية (في نظام الإنشاء، تم تعديلها لحذف تفاصيل التنفيذ) لإنشاء ملفات 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 بين مجموعة فرعية من مصفوفات توافق النظام ومصفوفات توافق المنتج كمصفوفة توافق إطار العمل. لمزيد من التفاصيل، يُرجى الاطّلاع على مصفوفة توافق إطار العمل.

مثال: إنشاء بيان المورّد من الأجزاء

يمكن تجميع أجزاء متعدّدة من بيان المورّد في مدّة التصميم. على سبيل المثال:

<!-- 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 للأشعة تحت الحمراء إلى بيان المورّد إذا تم تحديد 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 وإليه. ترخيص مشابه لترخيص BSD.
  • libselinux (external/selinux/libselinux) للحصول على إصدار policydb. ترخيص الملكية العامة.
  • libz (external/zlib) لفك ضغط /proc/config.gz. ترخيص مشابه لترخيص BSD.
  • يستخدم مشروع libvintf ترخيص Apache 2.0 (مع ملفات MODULE_LICENSE_APACHE2 وNOTICE المناسبة).