البيانات

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

بيان الجهاز

يتألّف بيان الجهاز (الذي يقدّمه الجهاز) من بيان المورّد وبيان الشركة المصنّعة للجهاز.

  • يحدِّد بيان المورّد واجهات HAL وإصدارات سياسة SELinux وغيرها من العناصر الشائعة لوحدة المعالجة المركزية (SoC). ويُنصح بوضعه في شجرة مصدر Android في device/VENDOR/DEVICE/manifest.xml، ولكن يمكن استخدام عدة ملفات fragmented. لمعرفة التفاصيل، يُرجى الاطّلاع على أجزاء البيان وإنشاء بيانات وصف التطبيق (DM) من الأجزاء.
  • يسرد بيان ODM واجهات HAL الخاصة بالمنتج في قسم 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
  • يسرد بيان المورّد واجهات HAL الخاصة بالمنتج في قسم المورّد. يحمِّل عنصر 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 (قديمة، بدون أجزاء)
    4. أخيرًا، اجمع أجزاء البيان من أيّ ملفات APEX الخاصة بالمورّدين. يتم تحميل أجزاء البيان من دليل etc/vintf لكل ملف APEX (مثل /apex/<apex name>/etc/vintf).

    يُرجى العلم بما يلي:

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

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

في ما يلي مثال على بيان المورّد.

<?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 (الذي يقدّمه الجهاز) ما يلي:
    • واجهات HAL التي تخدمها وحدات مثبَّتة على قسم 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>

أجزاء البيان

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

مثال

في ملف Android.bp أو Android.mk، أضِف vintf_fragments إلى أي وحدة تم تثبيتها صراحةً على الجهاز، مثل cc_binary أو rust_binary. على سبيل المثال، يمكنك تعديل الوحدة باستخدام عملية تنفيذ 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>

إذا تم تجميع وحدة HAL في حزمة APEX الخاصة بالمورّد، اجمع أجزاء VINTF المرتبطة بها في حزمة APEX نفسها باستخدام prebuilt_etc كما هو описан في أجزاء VINTF.

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

يصف هذا القسم معنى علامات 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 HAL هذا هو الخيار التلقائي.
  • aidl: واجهات برمجة التطبيقات لـ AIDL لا يكون صالحًا إلا عند استخدام الإصدار 2.0 من الإصدار الأساسي للبيان أو الإصدارات الأحدث.
  • native: واجهات برمجة التطبيقات لمستوى الحِزم الأساسية
manifest.hal.max-level
اختياري. صالحة فقط في ملفات بيان الإطارات. في حال ضبطها، يتم إيقاف HAL التي يكون الحد الأقصى لمستوى تنسيقها أقل من الإصدار المستهدَف من إطار عمل Firebase Messaging في بيان إطار العمل.
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: وضع Binderized
  • passthrough: وضع "النقل المباشر"
اختياري عند manifest.hal.format == "aidl". يجب عدم إدراجها في حال عدم توفّرها. يحدِّد هذا العنصر طريقة النقل المستخدَمة عند عرض واجهة عن بُعد. يجب أن تكون القيمة:
  • inet: مقبس 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 وواجهات HAL الأصلية، يكون التنسيق هو MAJOR.MINOR. للاطّلاع على مثال، يُرجى الرجوع إلى hardware/interfaces أو vendor/${VENDOR}/interfaces أو frameworks/hardware/interfaces أو system/hardware/interfaces.

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

بالنسبة إلى واجهات برمجة التطبيقات لواجهة HAL لذكاء الاصطناعي (AIDL)، يجب عدم تضمين <version> على الأجهزة التي تعمل بالإصدار 11 من نظام التشغيل Android والإصدارات الأقدم. يجب أن يكون <version> عددًا صحيحًا واحدًا على الأجهزة التي تعمل بالإصدار 12 من نظام التشغيل Android والإصدارات الأحدث. يجب إدراج <version> واحدة كحد أقصى لكل مجموعة (package, interface, instance). إذا لم يكن متوفّرًا، يتم ضبط القيمة التلقائية على 1. تكون قيمة <version> مرتبطة بجميع <fqname> في <hal> نفسه لأنّه لا يحمل <fqname> إصدارًا.
manifest.hal.interface
مطلوبة، ويمكن تكرارها بدون تكرار حدِّد واجهة في الحزمة التي تحتوي على اسم مثيل. يمكن أن تتضمّن <hal> عدّة عناصر <interface>، ويجب أن تكون الأسماء مميّزة.
manifest.hal.interface.name
مطلوبة. اسم الواجهة
manifest.hal.interface.instance
مطلوبة، ويمكن تكرارها. اسم مثيل الواجهة يمكن أن يكون لها عدة نماذج لواجهة معيّنة ولكن بدون عناصر <instance> مكرّرة.
manifest.hal.fqname
اختياري، يمكن تكراره. طريقة بديلة لتحديد مثيل لواجهة HAL بالاسم manifest.hal.name.
  • بالنسبة إلى واجهات HIDL HAL، يكون التنسيق هو @MAJOR.MINOR::INTERFACE/INSTANCE.
  • بالنسبة إلى واجهات برمجة التطبيقات لـ HAL في الذكاء الاصطناعي (AIDL)، يكون التنسيق هو 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
اختياري، يمكن تكراره بدون نُسخ مكرّرة، ولا يستخدمه سوى إطار العمل manifest. يصف مجموعة من إصدارات حِزم SDK الخاصة بالنظام التي يوفّرها إطار العمل ل تطبيقات المورّدين.
manifest.kernel
اختياري. يصف معلومات ثابتة عن النواة.
manifest.kernel.target-level
اختياري. يصف فرع النواة. تكون القيمة التلقائية هي manifest.target-level في حال عدم توفّرها. يجب أن تكون القيمة أكبر من أو تساوي manifest.target-level. اطّلِع على قواعد مطابقة النواة للحصول على التفاصيل.