اعتبارًا من 27 آذار (مارس) 2025، ننصحك باستخدام android-latest-release بدلاً من aosp-main لإنشاء AOSP والمساهمة فيه. لمزيد من المعلومات، يُرجى الاطّلاع على التغييرات في AOSP.
تنظيم صفحاتك في مجموعات
يمكنك حفظ المحتوى وتصنيفه حسب إعداداتك المفضّلة.
باستثناء بعض الحالات، يمكن العثور على حِزم واجهة HIDL في directory
hardware/interfaces أو vendor/. تتمّ ترجمة المستوى الأعلى
hardware/interfaces مباشرةً إلى مساحة اسم الحزمة
android.hardware، ويكون الإصدار دليلاً فرعيًا
ضمن مساحة اسم الحزمة (وليس الواجهة).
يُجمِّع مُجمِّع hidl-gen ملفات .hal في
مجموعة من ملفات .h و.cpp. من هذه الملفات التي تم إنشاؤها تلقائيًا، يتم إنشاء مكتبة مشتركة ترتبط بها عمليات تنفيذ العميل/الخادم.
يتم إنشاء ملف Android.bp الذي ينشئ هذه المكتبة المشتركة
تلقائيًا بواسطة نص hardware/interfaces/update-makefiles.sh. في كل مرة تضيف فيها حزمة جديدة إلى hardware/interfaces، أو تتم فيها
إضافة ملفات .hal أو إزالتها من حزمة حالية أو إليها، عليك إعادة تنفيذ
النص البرمجي للتأكّد من أنّ المكتبة المشتركة التي تم إنشاؤها محدّثة.
على سبيل المثال، يجب أن يكون ملف IFoo.hal نموذجًا في
hardware/interfaces/samples/1.0. ينشئ ملف النموذج
IFoo.hal واجهة IFoo في حزمة
samples:
يتم ربط الملفات التي يتم إنشاؤها تلقائيًا في حزمة HIDL بمكتبة مشتركة واحدة
بالاسم نفسه للحزمة (على سبيل المثال،
android.hardware.samples@1.0). تُصدِّر المكتبة المشتركة أيضًا عنوانًا واحدًا، وهو IFoo.h، ويمكن أن يتضمّنه العملاء
والخوادم. باستخدام المُجمِّع hidl-gen مع ملف IFoo.hal
واجهة كإدخال، يتضمّن الوضع المرتبط ملفَّي
التلقائيَين التاليَين:
الشكل 1: الملفات التي أنشأها المُجمِّع
IFoo.h: يصف واجهة IFoo
الخالصة في فئة C++، ويحتوي على الطرق والأنواع المحدّدة في واجهة
IFoo في ملف IFoo.hal، والتي تم ترجمتها إلى أنواع
C++ عند الضرورة. لا تحتوي على تفاصيل متعلّقة بآلية
RPC (مثل HwBinder) المستخدَمة لتنفيذ هذه الواجهة
يتم إنشاء مساحة اسم للصف باستخدام الحزمة والإصدار، على سبيل المثال،
::android::hardware::samples::IFoo::V1_0. يتضمن كلّ من العملاء والخوادم
هذا الرأس: العملاء لاستدعاء الطرق عليه والخوادم
لتنفيذ هذه الطرق.
IHwFoo.h. ملف الرأس الذي يحتوي على
بيانات الدوالّ التي تسلسل أنواع البيانات المستخدَمة في الواجهة
يجب ألا يدرج المطوّرون العنوان مباشرةً (لا يحتوي على أي
فئات).
BpHwFoo.h: فئة تُكتسَب من
IFoo وتصف تنفيذ HwBinder الوكيل (من جهة العميل)
للواجهة ويجب ألا يشير المطوّرون إلى هذه الفئة
بشكل مباشر.
BnHwFoo.h: فئة تحتوي على
إشارة إلى تنفيذ IFoo وتصف
تنفيذ HwBinder (من جهة الخادم) للواجهة
ويجب ألا يشير المطوّرون إلى هذه الفئة مباشرةً.
FooAll.cpp: فئة تحتوي على
عمليات التنفيذ لكل من الوكيل HwBinder وHwBinder الرمز المرجعي عندما يستدعي أحد العملاء طريقة واجهة، يُجمِّع الوكيل
تلقائيًا الوسيطات من العميل ويرسل المعاملة
إلى برنامج تشغيل نواة الربط الذي يرسل المعاملة إلى العنصر المرجعي على
الجانب الآخر (الذي يستدعي بعد ذلك تنفيذ الخادم الفعلي).
تكون بنية الملفات مشابهة لبنية الملفات التي تم إنشاؤها باستخدام IDE IDE
aidl-cpp (للاطّلاع على التفاصيل، يُرجى الاطّلاع على "وضع السماح بالمرور" في
نظرة عامة على HIDL). إنّ الملف الوحيد الذي يتم إنشاؤه تلقائيًا والذي لا يعتمد على آلية RPC المستخدَمة في HIDL هوIFoo.h، وجميع الملفات الأخرى مرتبطة بآلية HwBinder RPC المستخدَمة في HIDL. لذلك، يجب ألا تشيرعمليات تنفيذ العميل والخادم مطلقًا مباشرةً إلى أي شيء آخر غير IFoo. لتحقيق
هذا، أدرِج IFoo.h فقط واربطه بالمكتبة المشترَكة التي تم إنشاؤها.
رابط يؤدي إلى المكتبات المشتركة
يجب أن يتضمّن العميل أو الخادم الذي يستخدم أي واجهة في حزمة مكتبة
المشترَكة لهذه الحزمة في مكان واحد (1) من
المواقع التالية:
يتضمّن أنواع بيانات HIDL العادية. بدءًا من الإصدار
10 من Android، يتضمّن هذا الجدول أيضًا جميع الرموز التي كانت مضمّنة سابقًا في رمزَي
libhidltransport و
libhwbinder.
libhidltransport
تعالج نقل طلبات HIDL عبر آليات مختلفة لبروتوكول RPC/IPC.
سيتم إيقاف هذه المكتبة نهائيًا في Android 10.
libhwbinder
الرموز الخاصة بدفتر الربط يتوقف نظام التشغيل Android 10 عن استخدام هذه المكتبة نهائيًا.
يتم تعريف دوال HIDL وأنواعها، مثل Return<T> و
Void()، في مساحة الاسم ::android::hardware.
يتم تحديد مساحة الاسم C++ لأي حزمة حسب اسم الحزمة وإصدارها.
على سبيل المثال، الحزمة mypackage التي تستخدم الإصدار 1.2 ضمن
hardware/interfaces تتضمّن الخصائص التالية:
مساحة الاسم C++ هي
::android::hardware::mypackage::V1_2
الاسم المؤهَّل بالكامل لـ IMyInterface في تلك
الحزمة هو: ::android::hardware::mypackage::V1_2::IMyInterface.
(IMyInterface هو معرّف، وليس جزءًا من مساحة الاسم).
الأنواع المحدّدة في ملف types.hal للحزمة
يتم تحديدها على النحو التالي:
::android::hardware::mypackage::V1_2::MyPackageType
يخضع كل من المحتوى وعيّنات التعليمات البرمجية في هذه الصفحة للتراخيص الموضحّة في ترخيص استخدام المحتوى. إنّ Java وOpenJDK هما علامتان تجاريتان مسجَّلتان لشركة Oracle و/أو الشركات التابعة لها.
تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)
[[["يسهُل فهم المحتوى.","easyToUnderstand","thumb-up"],["ساعَدني المحتوى في حلّ مشكلتي.","solvedMyProblem","thumb-up"],["غير ذلك","otherUp","thumb-up"]],[["لا يحتوي على المعلومات التي أحتاج إليها.","missingTheInformationINeed","thumb-down"],["الخطوات معقدة للغاية / كثيرة جدًا.","tooComplicatedTooManySteps","thumb-down"],["المحتوى قديم.","outOfDate","thumb-down"],["ثمة مشكلة في الترجمة.","translationIssue","thumb-down"],["مشكلة في العيّنات / التعليمات البرمجية","samplesCodeIssue","thumb-down"],["غير ذلك","otherDown","thumb-down"]],["تاريخ التعديل الأخير: 2025-07-27 (حسب التوقيت العالمي المتفَّق عليه)"],[],[],null,["# Packages\n\n| **Note:** This section uses sample `.hal` files to illustrate how HIDL language constructs map to C++.\n\nWith few exceptions, HIDL interface packages are located in\n`hardware/interfaces` or the `vendor/` directory. The\n`hardware/interfaces` top-level maps directly to the\n`android.hardware` package namespace; the version is a subdirectory\nunder the package (not interface) namespace.\n\nThe `hidl-gen` compiler compiles the `.hal` files into\na set of a `.h` and `.cpp` files. From these autogenerated\nfiles a shared library that client/server implementations link against is built.\nThe `Android.bp` file that builds this shared library is\nautogenerated by the `hardware/interfaces/update-makefiles.sh`\nscript. Every time you add a new package to `hardware/interfaces`, or\nadd/remove `.hal` files to/from an existing package, you must rerun\nthe script to ensure the generated shared library is up-to-date.\n\nFor example, the `IFoo.hal` sample file should be located in\n`hardware/interfaces/samples/1.0`. The sample\n`IFoo.hal` file creates an IFoo interface in the\n**samples** package: \n\n```c++\npackage android.hardware.samples@1.0;\ninterface IFoo {\n struct Foo {\n int64_t someValue;\n handle myHandle;\n };\n\n someMethod() generates (vec\u003cuint32_t\u003e);\n anotherMethod(Foo foo) generates (int32_t ret);\n};\n```\n\nGenerated files\n---------------\n\nAutogenerated files in a HIDL package are linked into a single shared\nlibrary with the same name as the package (for example,\n`android.hardware.samples@1.0`). The shared library also exports a\nsingle header, `IFoo.h`, which can be included by clients and\nservers. Using the `hidl-gen` compiler with the `IFoo.hal`\ninterface file as an input, binderized mode has the following autogenerated\nfiles:\n\n**Figure 1.** Files generated by compiler.\n\n- `IFoo.h`. Describes the pure `IFoo` interface in a C++ class; it contains the methods and types defined in the `IFoo` interface in the `IFoo.hal` file, translated to C++ types where necessary. **Doesn't contain** details related to the RPC mechanism (for example, `HwBinder`) used to implement this interface. The class is namespaced with the package and version, for example, `::android::hardware::samples::IFoo::V1_0`. Both clients and servers include this header: Clients for calling methods on it and servers for implementing those methods.\n- `IHwFoo.h`. Header file that contains declarations for functions that serialize data types used in the interface. Developers should never include his header directly (it doesn't contain any classes).\n- `BpHwFoo.h`. A class that inherits from `IFoo` and describes the `HwBinder` proxy (client-side) implementation of the interface. Developers should never refer to this class directly.\n- `BnHwFoo.h`. A class that holds a reference to an `IFoo` implementation and describes the `HwBinder` stub (server-side) implementation of the interface. Developers should never refer to this class directly.\n- `FooAll.cpp`. A class that contains the implementations for both the `HwBinder` proxy and the `HwBinder` stub. When a client calls an interface method, the proxy automatically marshals the arguments from the client and sends the transaction to the binder kernel driver, which delivers the transaction to the stub on the other side (which then calls the actual server implementation).\n\nThe files are structured similarly to the files generated by\n`aidl-cpp` (for details, see \"Passthrough mode\" in the\n[HIDL Overview](/docs/core/architecture/hidl)). The only\nautogenerated file that is independent of the RPC mechanism used by HIDL is\n`IFoo.h`; all other files are tied to the HwBinder RPC mechanism used\nby HIDL. Therefore, client and server implementations **should never\ndirectly refer to anything other than `IFoo`** . To achieve\nthis, include only `IFoo.h` and link against the generated shared\nlibrary.\n| **Note:** HwBinder is only one possible transport; new transports might be added in the future.\n\nLink to shared libraries\n------------------------\n\nA client or server that uses any interface in a package must include the\nshared library of that package in **one (1)** of the following\nlocations:\n\n- In **Android.mk** : \n\n ```c++\n LOCAL_SHARED_LIBRARIES += android.hardware.samples@1.0\n ```\n- In **Android.bp** : \n\n ```c++\n shared_libs: [\n /* ... */\n \"android.hardware.samples@1.0\",\n ],\n ```\n\nAdditional libraries you might need to include:\n\n| `libhidlbase` | Includes standard HIDL data types. Starting in Android 10, this also contains all of the symbols previously in `libhidltransport` and `libhwbinder`. |\n| `libhidltransport` | Handles the transport of HIDL calls over different RPC/IPC mechanisms. **Android 10 deprecates this library.** |\n| `libhwbinder` | Binder-specific symbols. **Android 10 deprecates this library.** |\n| `libfmq` | Fast Message Queue IPC. |\n|--------------------|------------------------------------------------------------------------------------------------------------------------------------------------------|\n\nNamespaces\n----------\n\nHIDL functions and types such as `Return\u003cT\u003e` and\n`Void()` are declared in namespace `::android::hardware`.\nThe C++ namespace of a package is determined by the package name and version.\nFor example, a package **mypackage** with version 1.2 under\n`hardware/interfaces` has the following qualities:\n\n- **C++ namespace** is `::android::hardware::mypackage::V1_2`\n- **Fully qualified name** of `IMyInterface` in that package is: `::android::hardware::mypackage::V1_2::IMyInterface`. (`IMyInterface` is an identifier, not part of the namespace).\n- **Types** defined in the package's `types.hal` file are identified as: `::android::hardware::mypackage::V1_2::MyPackageType`"]]