بدءًا من Android 12، يمكن استخدام قائمة انتظار الرسائل السريعة مع واجهات AIDL باستخدام الخلفية الأصلية لحزمة تطوير البرامج (NDK). ويسمح ذلك للعمليات بالتواصل بدون تكاليف إضافية وبدون قيود على معاملات Binder بعد إعداد قصير. يتيح استخدام Stable AIDL التواصل بين عمليات النظام وعمليات المورّد.
أنواع الحمولة المتوافقة
- أنواع
parcelable
في @FixedSize AIDL - أنواع
enum
في AIDL - أنواع الأعداد الصحيحة في AIDL
يجب أن يكون للرسائل المُرسَلة بين العمليات في قائمة انتظار الرسائل في الذاكرة المشتركة تنسيق الذاكرة نفسه على مستوى حدود العمليات، ويجب ألا تحتوي على مؤشرات. ستؤدي محاولة إنشاء
AidlMessageQueue
بنوع غير متوافق إلى حدوث خطأ في التجميع.
أنواع قوائم الانتظار المتوافقة
تتوافق AIDL مع أنواع قوائم الانتظار نفسها من HIDL، والتي يُطلق عليها غالبًا اسم "النكهات". ويتم استخدامها كمعلَمات للنماذج في قوائم الانتظار والأوصاف.
أنواع 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
بعد الإعداد هو نفسه استخدام MessageQueue
في HIDL.
تتوافق جميع واجهات برمجة التطبيقات الموضّحة في استخدام MessageQueue
تمامًا مع AidlMessageQueue
باستثناء ما يلي:
يتم استبدال const MQDescriptor<T, flavor>* getDesc()
بـ MQDescriptor<T, U> dupeDesc()
التي تعرض MQDescriptor
AIDL.