قائمة انتظار الرسائل السريعة مع AIDL

اعتبارًا من نظام التشغيل Android 12، يمكن استخدام قائمة انتظار الرسائل السريعة مع واجهات AIDL باستخدام الواجهة الخلفية NDK. يسمح هذا للعمليات بالتواصل دون العبء والقيود المفروضة على معاملات الموثق بعد فترة إعداد قصيرة. يتيح استخدام Stable AIDL إمكانية الاتصال بين عمليات النظام والبائعين.

أنواع الحمولة المدعومة

يجب أن يكون للرسائل المرسلة بين العمليات في قائمة انتظار رسائل الذاكرة المشتركة نفس تخطيط الذاكرة عبر حدود العملية ولا يمكن أن تحتوي على مؤشرات. ستؤدي محاولة إنشاء AidlMessageQueue بنوع غير مدعوم إلى حدوث خطأ في الترجمة.

أنواع قوائم الانتظار المدعومة

يتم دعم نفس أنواع قوائم الانتظار من HIDL، والتي تسمى غالبًا النكهات، باستخدام AIDL. يتم استخدامها كوسائط قالبية لقوائم الانتظار والواصفات.

أنواع هيدل أنواع 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 . جميع واجهات برمجة التطبيقات الموضحة في استخدام messageQueue مدعومة بالكامل مع AidlMessageQueue مع استثناء واحد:

يتم استبدال const MQDescriptor<T, flavor>* getDesc() بـ MQDescriptor<T, U> dupeDesc() الذي يُرجع AIDL MQDescriptor .