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

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

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

শেয়ার্ড মেমোরি মেসেজ কিউতে থাকা প্রসেসগুলির মধ্যে পাঠানো বার্তাগুলির প্রসেস সীমানা জুড়ে একই মেমোরি লেআউট থাকতে হবে এবং এতে পয়েন্টার থাকতে পারবে না। সমর্থিত নয় এমন টাইপ দিয়ে AidlMessageQueue তৈরি করার চেষ্টা করলে একটি সংকলন ত্রুটি দেখা দেয়। cpp ব্যাকএন্ডে AIDL parcelable এবং union টাইপগুলি Fast Message Queue-এর সাথে ব্যবহার করা যাবে না কারণ এগুলি 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 যেকোনো জায়গায় ব্যবহার করা যেতে পারে যেখানে একটি parceable থাকতে পারে।

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 প্রদান করে।