البيانات

يقوم كائن VINTF بتجميع البيانات من بيان الجهاز وملفات بيان إطار العمل (XML). يشترك كلا البيانين في التنسيق، على الرغم من أنه لا تنطبق جميع العناصر على كليهما (للحصول على تفاصيل حول المخطط، راجع مخطط ملف البيان ).

بيان الجهاز

يتكون بيان الجهاز (الذي يقدمه الجهاز) من بيان البائع وبيان ODM.

  • يحدد بيان البائع HALs، وإصدارات سياسة SELinux، وما إلى ذلك المشتركة في SoC. يوصى بوضعه في شجرة مصدر Android على device/ VENDOR / DEVICE /manifest.xml ، ولكن يمكن استخدام ملفات مجزأة متعددة. لمزيد من التفاصيل، راجع بيان الأجزاء و إنشاء رسالة مباشرة من الأجزاء .
  • يسرد بيان ODM شرائح HALs الخاصة بالمنتج في قسم ODM . يقوم كائن VINTF بتحميل بيان ODM بهذا الترتيب:
    1. إذا تم تعريف SKU (حيث SKU هي قيمة الخاصية ro.boot.product.hardware.sku/odm/etc/vintf/manifest_ SKU .xml
    2. /odm/etc/vintf/manifest.xml
    3. إذا تم تعريف SKU ، /odm/etc/manifest_ SKU .xml
    4. /odm/etc/manifest.xml
  • يسرد بيان البائع شرائح HALs الخاصة بالمنتج في قسم البائع. يقوم كائن VINTF بتحميل بيان البائع بهذا الترتيب:
    1. إذا تم تعريف SKU (حيث SKU هي قيمة الخاصية ro.boot.product.vendor.sku/vendor/etc/vintf/manifest_ SKU .xml
    2. /vendor/etc/vintf/manifest.xml
  • يقوم كائن VINTF بتحميل بيان الجهاز بهذا الترتيب:
    1. في حالة وجود بيان البائع، قم بدمج ما يلي:
      1. بيان البائع
      2. أجزاء بيان البائع الاختيارية
      3. بيان ODM اختياري
      4. أجزاء بيان ODM الاختيارية
    2. بخلاف ذلك، في حالة وجود بيان ODM، قم بدمج بيان ODM مع أجزاء بيان ODM الاختيارية.
    3. /vendor/manifest.xml (قديم، بدون أجزاء)

    لاحظ أن:

    • على الأجهزة القديمة، يتم استخدام بيان البائع القديم وبيان ODM. قد يتجاوز بيان ODM بيان البائع القديم تمامًا.
    • على الأجهزة التي تعمل بنظام التشغيل Android 9، يتم دمج بيان ODM مع بيان البائع.
    • عند دمج قائمة من البيانات، قد تتجاوز البيانات التي تظهر لاحقًا في القائمة العلامات الموجودة في البيانات التي تظهر مسبقًا في القائمة، بشرط أن تحتوي العلامات الموجودة في البيان اللاحق على السمة override="true" . على سبيل المثال، قد يتجاوز بيان ODM بعض علامات <hal> من بيان البائع. راجع وثائق override السمة أدناه.

يمكّن هذا الإعداد منتجات متعددة بنفس اللوحة من مشاركة نفس صورة البائع (التي توفر HALs الشائعة) مع وجود صور ODM مختلفة (التي تحدد HALs الخاصة بالمنتج).

فيما يلي مثال لبيان البائع.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Comments, Legal notices, etc. here -->
<manifest version="2.0" type="device" target-level="1">
    <hal>
        <name>android.hardware.camera</name>
        <transport>hwbinder</transport>
        <version>3.4</version>
        <interface>
            <name>ICameraProvider</name>
            <instance>legacy/0</instance>
            <instance>proprietary/0</instance>
        </interface>
    </hal>
    <hal>
        <name>android.hardware.nfc</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <version>2.0</version>
        <interface>
            <name>INfc</name>
            <instance>nfc_nci</instance>
        </interface>
    </hal>
    <hal>
        <name>android.hardware.nfc</name>
        <transport>hwbinder</transport>
        <fqname>@2.0::INfc/default</fqname>
    </hal>
    <hal>
        <name>android.hardware.drm</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <interface>
            <name>ICryptoFactory</name>
            <instance>default</instance>
        </interface>
        <interface>
            <name>IDrmFactory</name>
            <instance>default</instance>
        </interface>
        <fqname>@1.1::ICryptoFactory/clearkey</fqname>
        <fqname>@1.1::IDrmFactory/clearkey</fqname>
    </hal>
    <hal format="aidl">
        <name>android.hardware.light</name>
        <version>1</version>
        <fqname>ILights/default</fqname>
    </hal>
    <hal format="aidl">
        <name>android.hardware.power</name>
        <version>2</version>
        <interface>
            <name>IPower</name>
            <instance>default</instance>
        </interface>
    </hal>
    <hal format="native">
        <name>EGL</name>
        <version>1.1</version>
    </hal>
    <hal format="native">
        <name>GLES</name>
        <version>1.1</version>
        <version>2.0</version>
        <version>3.0</version>
    </hal>
    <sepolicy>
        <version>25.0</version>
    </sepolicy>
</manifest>

فيما يلي مثال لبيان ODM.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Comments, Legal notices, etc. here -->
<manifest version="1.0" type="device">
    <!-- camera 3.4 in vendor manifest is ignored -->
    <hal override="true">
        <name>android.hardware.camera</name>
        <transport>hwbinder</transport>
        <version>3.5</version>
        <interface>
            <name>ICameraProvider</name>
            <instance>legacy/0</instance>
        </interface>
    </hal>
    <!-- NFC is declared to be disabled -->
    <hal override="true">
        <name>android.hardware.nfc</name>
        <transport>hwbinder</transport>
    </hal>
    <hal>
        <name>android.hardware.power</name>
        <transport>hwbinder</transport>
        <version>1.1</version>
        <interface>
            <name>IPower</name>
            <instance>default</instance>
        </interface>
    </hal>
</manifest>

فيما يلي مثال لبيان الجهاز في حزمة OTA.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Comments, Legal notices, etc. here -->
<manifest version="1.0" type="device" target-level="1">
    <!-- hals ommited -->
    <kernel version="4.4.176">
        <config>
            <key>CONFIG_ANDROID</key>
            <value>y</value>
        </config>
        <config>
            <key>CONFIG_ARM64</key>
            <value>y</value>
        </config>
    <!-- other configs ommited -->
    </kernel>
</manifest>

لمزيد من التفاصيل، راجع تطوير بيان الجهاز .

بيان الإطار

يتكون ملف بيان إطار العمل من بيان النظام، وبيان المنتج، وبيان system_ext.

  • يتم إنشاء بيان النظام (المقدم من Google) يدويًا ويتواجد في شجرة مصدر Android على /system/libhidl/manifest.xml .
  • يسرد بيان المنتج (الذي يقدمه الجهاز) شرائح HAL التي تتم خدمتها بواسطة الوحدات النمطية المثبتة على قسم المنتج.
  • يسرد بيان system_ext (الذي يوفره الجهاز) ما يلي:
    • HALs التي تتم خدمتها بواسطة الوحدات النمطية المثبتة على قسم system_ext؛
    • إصدارات VNDK؛
    • إصدار نظام SDK.

كما هو الحال مع بيان الجهاز، يمكن استخدام ملفات مجزأة متعددة. لمزيد من التفاصيل، راجع أجزاء البيان .

فيما يلي مثال لإطار العمل.

<?xml version="1.0" encoding="UTF-8"?>
<!-- Comments, Legal notices, etc. here -->
<manifest version="1.0" type="framework">
    <hal>
        <name>android.hidl.allocator</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <interface>
            <name>IAllocator</name>
            <instance>ashmem</instance>
        </interface>
    </hal>
    <hal>
        <name>android.hidl.memory</name>
        <transport arch="32+64">passthrough</transport>
        <version>1.0</version>
        <interface>
            <name>IMapper</name>
            <instance>ashmem</instance>
        </interface>
    </hal>
    <hal>
        <name>android.hidl.manager</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <interface>
            <name>IServiceManager</name>
            <instance>default</instance>
        </interface>
    </hal>
    <hal>
        <name>android.frameworks.sensorservice</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <interface>
            <name>ISensorManager</name>
            <instance>default</instance>
        </interface>
    </hal>
    <hal max-level="5">
        <name>android.frameworks.schedulerservice</name>
        <transport>hwbinder</transport>
        <version>1.0</version>
        <interface>
            <name>ISchedulingPolicyService</name>
            <instance>default</instance>
        </interface>
    </hal>
    <vendor-ndk>
        <version>27</version>
    </vendor-ndk>
    <system-sdk>
        <version>27</version>
    </system-sdk>
</manifest>

شظايا واضحة

في نظام التشغيل Android 10 والإصدارات الأحدث، يمكنك ربط إدخال البيان بوحدة HAL في نظام الإنشاء. وهذا يجعل من السهل تضمين وحدة HAL بشكل مشروط في نظام البناء.

مثال

في ملف Android.bp أو Android.mk ، أضف vintf_fragments إلى أي وحدة نمطية. على سبيل المثال، يمكنك تعديل الوحدة النمطية من خلال تطبيق HAL الخاص بك ( my.package.foo@1.0-service-bar ).

... {
    ...
    vintf_fragments: ["manifest_foo.xml"],
    ...
}
LOCAL_MODULE := ...
LOCAL_VINTF_FRAGMENTS := manifest_foo.xml

في ملف يسمى manifest_foo.xml ، أنشئ البيان لهذه الوحدة. في وقت الإنشاء، تتم إضافة هذا البيان إلى الجهاز. إن إضافة إدخال هنا هو نفس إضافة إدخال في البيان الرئيسي للجهاز. يتيح ذلك للعملاء استخدام الواجهة ويسمح لـ VTS بتحديد تطبيقات HAL الموجودة على الجهاز. أي شيء يفعله البيان العادي، يفعله هذا البيان أيضًا.

يطبق المثال أدناه android.hardware.foo@1.0::IFoo/default ، والذي تم تثبيته على قسم vendor أو قسم odm . إذا تم تثبيته على قسم system أو product أو system_ext ، فاستخدم framework عمل الكتابة بدلاً من كتابة device .

<manifest version="1.0" type="device">
    <hal format="hidl">
        <name>android.hardware.foo</name>
        <transport>hwbinder</transport>
        <fqname>@1.0::IFoo/default</fqname>
    </hal>
</manifest>

بيان مخطط الملف

يصف هذا القسم معنى علامات XML هذه. قد تكون بعض العلامات "المطلوبة" مفقودة من الملف المصدر في شجرة مصدر Android ويتم كتابتها بواسطة assemble_vintf في وقت الإنشاء. يجب أن تكون العلامات المطلوبة موجودة في الملفات المقابلة على الجهاز.

?xml
خياري. يوفر المعلومات لمحلل XML فقط.
manifest.version
مطلوب. نسخة ميتا من هذا البيان. يصف العناصر المتوقعة في البيان. لا علاقة لها بإصدار XML.
manifest.type
مطلوب. نوع هذا البيان. يحتوي على device القيمة لملف بيان الجهاز framework عمل ملف بيان إطار العمل.
manifest.target-level
مطلوب لبيان الجهاز. يحدد إصدار مصفوفة توافق إطار العمل (FCM) الذي يستهدف بيان الجهاز هذا أن يكون متوافقًا معه. يُطلق على هذا أيضًا اسم إصدار الشحن FCM للجهاز.
manifest.hal
اختياري، يمكن تكراره. طبقة HAL واحدة (HIDL أو أصلية، مثل GL)، اعتمادًا على سمة format .
manifest.hal.format
خياري. يمكن أن تكون القيمة واحدة من:
  • hidl : HIDL HALs. هذا هو الافتراضي.
  • aidl : AIDL HALs . صالح فقط في الإصدار الوصفي 2.0 وما فوق.
  • native : HALs الأصلي.
manifest.hal.max-level
خياري. صالح فقط على بيانات الإطار. إذا تم تعيينها، فسيتم تعطيل شرائح HAL ذات المستوى الأقصى الأقل من إصدار FCM المستهدف في بيان إطار العمل.
manifest.hal.override
خياري. يمكن أن تكون القيمة واحدة من:
  • true : تجاوز عناصر <hal> الأخرى بنفس <name> والإصدار الرئيسي. إذا لم يكن هناك <version> أو <fqname> في عنصر <hal> هذا، فإن العنصر <hal> يعلن تعطيل HAL هذا.
  • false : لا تتجاوز عناصر <hal> الأخرى بنفس <name> والإصدار الرئيسي.
manifest.hal.name
مطلوب. اسم الحزمة المؤهل بالكامل لـ HAL. يمكن لإدخالات HAL المتعددة استخدام نفس الاسم. أمثلة:
  • android.hardware.camera (HIDL أو AIDL HAL)
  • GLES (HAL الأصلي، يتطلب الاسم فقط)
manifest.hal.transport
مطلوب عندما يكون manifest.hal.format == "hidl" . يجب ألا يكون حاضرا خلاف ذلك. يوضح نوع النقل المستخدم عند الاستعلام عن واجهة من هذه الحزمة من مدير الخدمة. يمكن أن تكون القيمة واحدة من:
  • hwbinder : الوضع الموثق
  • passthrough : وضع العبور
اختياري عندما يكون manifest.hal.format == "aidl" . يجب ألا يكون حاضرا خلاف ذلك. يوضح نوع النقل المستخدم عند تقديم الواجهة عن بعد. يجب أن تكون القيمة:
  • inet : مقبس آينت
يجب استخدام manifest.hal.transport.ip و manifest.hal.transport.port لتحديد معلومات اتصال Inet بشكل أكبر.
manifest.hal.transport.arch
مطلوب passthrough ويجب ألا يكون موجودًا لـ hwbinder . يصف مستوى البت في خدمة العبور المقدمة. يمكن أن تكون القيمة واحدة من:
  • 32 : وضع 32 بت
  • 64 : وضع 64 بت
  • 32+64 : كلاهما
manifest.hal.transport.ip
مطلوب لـ inet ويجب ألا يكون موجودًا بخلاف ذلك. يصف عنوان IP الذي يتم من خلاله تقديم الواجهة البعيدة.
manifest.hal.transport.port
مطلوب لـ inet ويجب ألا يكون موجودًا بخلاف ذلك. يصف المنفذ الذي يتم من خلاله تقديم الواجهة البعيدة.
manifest.hal.version
اختياري، يمكن تكراره. نسخة لعلامات hal في البيان.

بالنسبة لـ HIDL وHALs الأصلية، يكون التنسيق MAJOR . MINOR . على سبيل المثال، ارجع إلى hardware/interfaces ، vendor/${VENDOR}/interfaces ، frameworks/hardware/interfaces ، أو system/hardware/interfaces .

قد يستخدم HIDL وHALs الأصلية حقول إصدار متعددة طالما أنها تمثل إصدارات رئيسية مميزة ، مع توفير إصدار ثانوي واحد فقط لكل إصدار رئيسي. على سبيل المثال، 3.1 و3.2 لا يمكن أن يتعايشا، لكن 1.0 و3.4 يمكنهما التعايش. ينطبق هذا على جميع عناصر hal التي تحمل نفس الاسم، ما لم override="true" . لا ترتبط قيم <version> بـ <fqname> لأن <fqname> يحمل إصدارًا.

بالنسبة لـ AIDL HALs، يجب ألا يكون <version> موجودًا على الأجهزة التي تعمل بنظام التشغيل Android 11 والإصدارات الأقدم. يجب أن يكون <version> عددًا صحيحًا واحدًا على الأجهزة التي تعمل بنظام التشغيل Android 12 والإصدارات الأحدث. يجب أن يكون هناك <version> واحد على الأقل لكل صف (package, interface, instance) . إذا لم يكن موجودا، الافتراضي هو 1 . ترتبط قيمة <version> بجميع <fqname> في نفس <hal> لأن <fqname> لا يحمل إصدارًا.
manifest.hal.interface
مطلوبة، يمكن تكرارها دون التكرار. اذكر واجهة في الحزمة لها اسم مثيل. يمكن أن يكون هناك عدة عناصر <interface> في <hal> ؛ يجب أن تكون الأسماء مميزة.
manifest.hal.interface.name
مطلوب. اسم الواجهة.
manifest.hal.interface.instance
مطلوب، يمكن تكرار. اسم المثيل للواجهة. يمكن أن تحتوي على مثيلات متعددة للواجهة ولكن لا توجد عناصر <instance> مكررة.
manifest.hal.fqname
اختياري، يمكن تكراره. طريقة بديلة لتحديد مثيل لـ HAL بالاسم manifest.hal.name .
  • بالنسبة لـ HIDL HALs، يكون التنسيق هو @ MAJOR . MINOR :: INTERFACE / INSTANCE .
  • بالنسبة لـ AIDL HALs، يكون التنسيق هو INTERFACE / INSTANCE .
manifest.sepolicy
مطلوب. يحتوي على كافة الإدخالات المتعلقة بالسياسة.
manifest.sepolicy.version
مطلوب لبيان الجهاز. يعلن عن نسخة SELinux. لديه تنسيق SDK_INT . PLAT_INT .
manifest.vendor-ndk
مطلوب، يمكن تكرار؛ المطلوبة لبيان الإطار. يجب ألا يكون موجودًا في بيان الجهاز. يجب أن تحتوي إدخالات <vendor-ndk> المتعددة على <version> مختلفة. يصف مجموعة من لقطات VNDK التي يوفرها الإطار.
manifest.vendor-ndk.version
مطلوب. هذا عدد صحيح موجب يمثل إصدار لقطة VNDK.
manifest.vendor-ndk.library
اختياري، يمكن تكراره، بدون تكرار. يصف مجموعة من مكتبات VNDK التي يوفرها إطار العمل الخاص بلقطة بائع VNDK هذه. القيمة هي اسم ملف المكتبة، على سبيل المثال libjpeg.so ، بما في ذلك البادئة lib واللاحقة .so . غير مسموح بمكونات المسار.
manifest.system-sdk.version
اختياري، يمكن تكراره، دون تكرار؛ تستخدم فقط من قبل بيان الإطار. يصف مجموعة من إصدارات SDK للنظام التي يوفرها الإطار لتطبيقات البائعين.
manifest.kernel
خياري. يصف المعلومات الثابتة حول النواة.
manifest.kernel.target-level
خياري. يصف فرع النواة. تكون قيمته الافتراضية على manifest.target-level إذا لم تكن موجودة. يجب أن يكون أكبر من أو يساوي manifest.target-level . راجع قواعد مطابقة النواة للحصول على التفاصيل.