AIDL সহ দ্রুত মেসেজ সারি

Android 12 ভার্সন অনুযায়ী, NDK ব্যাকএন্ড ব্যবহার করে AIDL ইন্টারফেসের সাথে ফাস্ট মেসেজ কিউ (FMQ) ব্যবহার করা যেতে পারে। এটি প্রসেসগুলিকে কিছু সংক্ষিপ্ত সেট-আপের পরে বাইন্ডার ট্রানজ্যাকশনের ওভারহেড ও বিধিনিষেধ ছাড়াই যোগাযোগ করতে দেয়। স্টেবল AIDL ব্যবহার করলে সিস্টেম ও ভেন্ডর প্রসেসের মধ্যে যোগাযোগ করা যায়।

যেসব পেলোড টাইপ কাজ করে

শেয়ার করা মেমরি মেসেজ সারিতে প্রসেসের মধ্যে পাঠানো মেসেজের প্রসেস বাউন্ডারি জুড়ে একই মেমরি লেআউট থাকতে হবে এবং এতে কোনও পয়েন্টার থাকতে পারবে না। কাজ করে না এমন ধরনের AidlMessageQueue তৈরি করার চেষ্টা করলে কম্পাইলেশন সংক্রান্ত সমস্যা হয়। cpp ব্যাকএন্ডে AIDL parcelable এবং union টাইপ ফাস্ট মেসেজ কিউয়ের সাথে ব্যবহার করা যাবে না কারণ সেগুলি android::Parcelable থেকে ইনহেরিট করে, যার ভার্চুয়াল ফাংশন আছে।

যে ধরনের সারি কাজ করে

HIDL থেকে একই কিউয়ের ধরন, যা প্রায়শই ফ্লেভার নামে পরিচিত, তা AIDL-এর সাথে কাজ করে। এগুলি কিউ ও ডেসক্রিপ্টরের জন্য টেমপ্লেট আর্গুমেন্ট হিসেবে ব্যবহার করা হয়।

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 ব্যবহার করা HIDL MessageQueue-এর মতোই। MessageQueue ব্যবহার করুন লিঙ্কে বর্ণিত সব API সম্পূর্ণভাবে কাজ করে AidlMessageQueue একটি ব্যতিক্রম ছাড়া:

const MQDescriptor<T, flavor>* getDesc()-এর পরিবর্তে MQDescriptor<T, U> dupeDesc() ব্যবহার করা হয়, যা AIDL MQDescriptor রিটার্ন করে।