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

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

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

ভাগ করা মেমরি বার্তা সারিতে প্রসেসের মধ্যে প্রেরিত বার্তাগুলি অবশ্যই প্রক্রিয়া সীমানা জুড়ে একই মেমরি বিন্যাস থাকতে হবে এবং পয়েন্টার ধারণ করতে পারবে না। সমর্থিত নয় এমন একটি টাইপ সহ একটি AidlMessageQueue তৈরি করার চেষ্টা করা একটি সংকলন ত্রুটির কারণ হবে৷

সমর্থিত সারি প্রকার

HIDL থেকে একই সারির ধরন , প্রায়শই স্বাদ বলা হয়, AIDL এর সাথে সমর্থিত। এগুলি সারি এবং বর্ণনাকারীর জন্য টেমপ্লেট আর্গুমেন্ট হিসাবে ব্যবহৃত হয়।

HIDL প্রকার এআইডিএল প্রকার
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 ব্যবহারে বর্ণিত সমস্ত APIs একটি ব্যতিক্রম ছাড়া AidlMessageQueue এর সাথে সম্পূর্ণরূপে সমর্থিত:

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