از Android 12، Fast Message Queue را می توان با رابط های AIDL با استفاده از باطن NDK استفاده کرد. این اجازه می دهد تا فرآیندها بدون سربار و محدودیت تراکنش های بایندر پس از چند راه اندازی کوتاه ارتباط برقرار کنند. استفاده از Stable AIDL امکان ارتباط بین فرآیندهای سیستم و فروشنده را فراهم می کند.
انواع محموله پشتیبانی شده
- @FixedSize انواع
parcelable
AIDL - انواع AIDL
enum
- انواع انتگرال AIDL
پیامهای ارسال شده بین پردازشها در صف پیام حافظه مشترک باید طرحبندی حافظه یکسانی در سراسر مرزهای فرآیند داشته باشند و نمیتوانند حاوی نشانگر باشند. تلاش برای ایجاد یک AidlMessageQueue
با نوعی که پشتیبانی نمی شود، باعث خطای کامپایل می شود.
انواع صف پشتیبانی شده
همان نوع صف از HIDL، که اغلب طعم نامیده می شود، با AIDL پشتیبانی می شود. اینها به عنوان آرگومان های الگو برای صف ها و توصیفگرها استفاده می شوند.
انواع HIDL | انواع ایدل |
---|---|
android::hardware::kSynchronizedReadWrite | android.hardware.common.fmq.SynchronizedReadWrite |
android::hardware::kUnsynchronizedWrite | android.hardware.common.fmq.UnsynchronizedWrite |
نحوه استفاده
رابط AIDL را تعریف کنید که MQDescriptor
را به فرآیند دیگر منتقل می کند. MQDescriptor
می توان در هر جایی که parcelable می توان استفاده کرد.
آرگومان های قالب مورد نیاز برای 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
است. همه APIهای توضیح داده شده در Using the MessageQueue با یک استثنا به طور کامل با AidlMessageQueue
پشتیبانی می شوند:
const MQDescriptor<T, flavor>* getDesc()
با MQDescriptor<T, U> dupeDesc()
جایگزین می شود که AIDL MQDescriptor
را برمی گرداند.