يجمع عنصر VINTF البيانات من ملفَي ملف بيان الجهاز وملف بيان الإطار العمل (بتنسيق XML). يتشارك كلا البيانَين التنسيق نفسه، على الرغم من أنّ بعض العناصر لا تنطبق على كليهما (للاطّلاع على تفاصيل حول المخطّط، يُرجى الاطّلاع على مخطّط ملف البيان).
بيان الجهاز
يتألّف بيان الجهاز (الذي يقدّمه الجهاز) من بيان المورّد وبيان الشركة المصنّعة للجهاز.
- يحدِّد بيان المورّد واجهات HAL وإصدارات سياسة SELinux وغيرها من العناصر الشائعة لوحدة المعالجة المركزية (SoC). ويُنصح بوضعه في شجرة مصدر Android في
device/VENDOR/DEVICE/manifest.xml
، ولكن يمكن استخدام عدة ملفات fragmented. لمعرفة التفاصيل، يُرجى الاطّلاع على أجزاء البيان وإنشاء بيانات وصف التطبيق (DM) من الأجزاء. - يسرد بيان ODM واجهات HAL الخاصة بالمنتج في
قسم ODM.
يحمِّل عنصر VINTF بيان ODM بالترتيب التالي:
- إذا تم تحديد
SKU
(حيثSKU
هي قيمة السمةro.boot.product.hardware.sku
)،/odm/etc/vintf/manifest_SKU.xml
/odm/etc/vintf/manifest.xml
- إذا تم تحديد
SKU
،/odm/etc/manifest_SKU.xml
/odm/etc/manifest.xml
- إذا تم تحديد
- يسرد بيان المورّد واجهات HAL الخاصة بالمنتج في قسم المورّد.
يحمِّل عنصر VINTF بيان المورّد بالترتيب التالي:
- إذا تم تحديد
SKU
(حيثSKU
هي قيمة السمةro.boot.product.vendor.sku
)،/vendor/etc/vintf/manifest_SKU.xml
/vendor/etc/vintf/manifest.xml
- إذا تم تحديد
- يحمِّل عنصر VINTF بيان الجهاز بالترتيب التالي:
- إذا كان بيان المورّد متوفّرًا، اجمع ما يلي:
- بيان المورّد
- أجزاء بيان المورّد الاختيارية
- بيان ODM اختياري
- أجزاء بيان ODM الاختيارية
- بخلاف ذلك، إذا كان بيان ODM متوفّرًا، يمكنك دمج بيان ODM مع أجزاء بيان ODM الاختيارية.
/vendor/manifest.xml
(قديمة، بدون أجزاء)- أخيرًا، اجمع أجزاء البيان من أيّ ملفات 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
: وضع Binderizedpassthrough
: وضع "النقل المباشر"
- اختياري عند
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
.
- بالنسبة إلى واجهات HIDL HAL، يكون التنسيق هو
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
. اطّلِع على قواعد مطابقة النواة للحصول على التفاصيل.