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