بدءًا من نظام Android 12، يمكن إعداد قائمة انتظار الرسائل السريعة مع واجهات AIDL من خلال الواجهة الخلفية NDK. يسمح هذا للعمليات والتواصل دون النفقات العامة والقيود المفروضة على معاملات المربط بعد الإعداد القصير. يسمح استخدام واجهة AIDL الثابتة بالاتصال بين النظام عمليات البائع.
أنواع الحمولات المسموح بها
- أنواع
parcelable
في @FixedSize AIDL - نوعان (
enum
) من AIDL - أنواع تكامل AIDL
يجب أن تحتوي الرسائل المُرسَلة بين العمليات في قائمة انتظار رسائل الذاكرة المشتركة على نفس
تنسيق الذاكرة على مستوى حدود العملية ولا يمكن أن يحتوي على مؤشرات. سيؤدي محاولة إنشاء
AidlMessageQueue
بنوع غير متوافق إلى حدوث خطأ في الترجمة.
أنواع قوائم الانتظار المتوافقة
أنواع قوائم الانتظار نفسها من HIDL، غالبًا تسمى النكهات، ومدعومة بـ AIDL. وتُستخدَم هذه الوسائط كوسائط نموذج ل القوائم والأوصاف.
أنواع HIDL | أنواع AIDL |
---|---|
android::hardware::kSynchronizedReadWrite |
android.hardware.common.fmq.SynchronizedReadWrite |
android::hardware::kUnsynchronizedWrite |
android.hardware.common.fmq.UnsynchronizedWrite |
كيفية الاستخدام
حدِّد واجهة AIDL التي ستُرسل MQDescriptor
إلى العملية الأخرى.
يمكن استخدام MQDescriptor
في أي مكان يمكن فيه استخدام قطعة أرض.
وسيطات النموذج المطلوبة للدالة MQDescriptor
هي نوع الحمولة ونكهة قائمة الانتظار.
import android.hardware.common.fmq.MQDescriptor
import android.hardware.common.fmq.SynchronizedReadWrite
void getQueue(out MQDescriptor<int, SynchronizedReadWrite> mqDesc);
إنّ عملية إعداد كل جانب من صف الرسائل متطابقة تقريبًا مع العملية باستخدام HIDL، باستخدام أنواع AIDL فقط.
#include <fmq/AidlMessageQueue.h>
...
using ::android::AidlMessageQueue;
using ::aidl::android::hardware::common::fmq::MQDescriptor;
using ::aidl::android::hardware::common::fmq::SynchronizedReadWrite;
...
ndk::ScopedAStatus MyInterface::getQueue(MQDescriptor<int32_t, SynchronizedReadWrite>* mqDesc) {
*mqDesc = mFmqSynchronized->dupeDesc();
return ndk::ScopedAStatus::ok();
}
...
// Create the first side of the queue before servicing getQueue() in this example
mFmqSynchronized =
new AidlMessageQueue<int32_t, SynchronizedReadWrite>(kNumElementsInQueue);
ستنشئ عملية الاستقبال الجانب الآخر من "قائمة الانتظار" باستخدام الوصف الذي تم استلامه من واجهة AIDL.
MQDescriptor<int32_t, SynchronizedReadWrite> desc;
auto ret = service->getQueue(true, &desc);
if (!ret.isOk()) {
...
}
// By default the constructor will reset the read and write pointers of the queue.
// Add a second `false` argument to avoid resetting the pointers.
mQueue = new (std::nothrow) AidlMessageQueue<int32_t, SynchronizedReadWrite>(desc);
if (!mQueue->isValid()) {
...
}
يُرجى العِلم أنّ استخدام AidlMessageQueue
بعد الإعداد هو نفسه استخدام HIDL MessageQueue
.
جميع واجهات برمجة التطبيقات الموضحة في استخدام قائمة انتظار الرسائل
متوافقة بالكامل مع AidlMessageQueue
مع استثناء واحد:
تم استبدال const MQDescriptor<T, flavor>* getDesc()
بـ MQDescriptor<T, U> dupeDesc()
التي تعرض معيار AIDL MQDescriptor