اعتبارًا من نظام التشغيل Android 12، يمكن استخدام قائمة انتظار الرسائل السريعة مع واجهات AIDL باستخدام الواجهة الخلفية NDK. يسمح هذا للعمليات بالتواصل دون العبء والقيود المفروضة على معاملات الموثق بعد فترة إعداد قصيرة. يتيح استخدام Stable AIDL إمكانية الاتصال بين عمليات النظام والبائعين.
أنواع الحمولة المدعومة
- @FixedSize أنواع AIDL
parcelable
- أنواع
enum
AIDL - أنواع التكامل 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
.