يقوم كائن VINTF بتجميع البيانات من بيان الجهاز وملفات بيان إطار العمل (XML). يشترك كلا البيانين في التنسيق ، على الرغم من عدم تطبيق كل العناصر على كليهما (للحصول على تفاصيل حول المخطط ، راجع مخطط ملف البيان ).
بيان الجهاز
يتكون بيان الجهاز (المقدم بواسطة الجهاز) من بيان البائع وبيان ODM.
- يحدد بيان المورد HALs وإصدارات سياسة SELinux وما إلى ذلك الشائعة في SoC. يوصى بوضعه في شجرة مصدر Android على
device/ VENDOR / DEVICE /manifest.xml
، ولكن يمكن استخدام ملفات متعددة. للحصول على تفاصيل ، راجع أجزاء البيان وإنشاء DM من الأجزاء . - يسرد بيان ODM HALs الخاصة بالمنتج في قسم 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
(قديم ، بدون أجزاء)
لاحظ أن:
- على الأجهزة القديمة ، يتم استخدام بيان المورد القديم وبيان 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>
لمزيد من التفاصيل ، راجع تطوير بيان الجهاز .
بيان الإطار
يتكون ملف بيان إطار العمل من بيان النظام وبيان المنتج وبيان نص النظام.
- يتم إنشاء بيان النظام (المقدم من Google) يدويًا وهو موجود في شجرة مصدر Android على
/system/libhidl/manifest.xml
. - يسرد بيان المنتج (المقدم من الجهاز) HALs التي تمت خدمتها بواسطة الوحدات النمطية المثبتة على قسم المنتج.
- يسرد بيان نص النظام (المقدم من الجهاز) ما يلي:
- تتم خدمة HALs بواسطة الوحدات النمطية المثبتة على قسم system_ext ؛
- إصدارات VNDK
- إصدار System 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_ext
على قسم system
أو product
أو نص النظام ، فاستخدم 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
- اختياري. صالح فقط في بيانات الإطار. في حالة الضبط ، يتم تعطيل HALs ذات المستوى الأقصى الأقل من إصدار 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
: الوضع Binderized -
passthrough
: وضع العبور
-
- اختياري عند
manifest.hal.format == "aidl"
. يجب ألا يكون موجودًا بخلاف ذلك. تحدد وسائل النقل المستخدمة عند تقديم واجهة عن بُعد. يجب أن تكون القيمة:- إنت: مقبس
inet
manifest.hal.transport.ip
وmanifest.hal.transport.port
لمزيد من التحديد لمعلومات اتصال Inet. - إنت: مقبس
-
manifest.hal.transport.arch
- مطلوب
hwbinder
passthrough
يصف شهادة خدمة العبور المقدمة. يمكن أن تكون القيمة واحدة مما يلي:-
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)
tuple. إذا لم يكن موجودًا ، افتراضيًا إلى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
.
- بالنسبة إلى HIDL HALs ، يكون التنسيق هو
-
manifest.sepolicy
- مطلوب. يحتوي على جميع الإدخالات المتعلقة بالسياسة.
-
manifest.sepolicy.version
- مطلوب لبيان الجهاز. تعلن عن إصدار SELinux. لها تنسيق
SDK_INT . PLAT_INT
. -
manifest.vendor-ndk
- مطلوب ، يمكن أن يكرر ؛ مطلوب لبيان إطار العمل. يجب ألا يكون موجودًا في بيان الجهاز. يجب أن تحتوي إدخالات
<vendor-ndk>
المتعددة على<version>
s مختلفة. يصف مجموعة من لقطات 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
. راجع قواعد مطابقة kernel للحصول على التفاصيل.