صف پیام سریع با AIDL

از Android 12، Fast Message Queue را می توان با رابط های AIDL با استفاده از باطن NDK استفاده کرد. این اجازه می دهد تا فرآیندها بدون سربار و محدودیت تراکنش های بایندر پس از چند راه اندازی کوتاه ارتباط برقرار کنند. استفاده از Stable 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 را برمی گرداند.