AIDL এর সাথে ফাস্ট মেসেজ কিউ

অ্যান্ড্রয়েড ১২ থেকে, এনডিকে ব্যাকএন্ড ব্যবহার করে এআইডিএল ইন্টারফেসের সাথে ফাস্ট মেসেজ কিউ ব্যবহার করা যায়। এর ফলে, কিছু সংক্ষিপ্ত সেটআপের পর প্রসেসগুলো বাইন্ডার ট্রানজ্যাকশনের অতিরিক্ত বোঝা ও সীমাবদ্ধতা ছাড়াই একে অপরের সাথে যোগাযোগ করতে পারে। স্টেবল এআইডিএল ব্যবহার করে সিস্টেম এবং ভেন্ডর প্রসেসগুলোর মধ্যে যোগাযোগ সম্ভব হয়।

সমর্থিত পেলোড প্রকার

  • FixedSize AIDL parcelable প্রকার ( 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 ব্যবহারের মতোই। " Use the MessageQueue" অংশে বর্ণিত সমস্ত API, একটি ব্যতিক্রম ছাড়া, AidlMessageQueue তে সম্পূর্ণরূপে সমর্থিত:

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