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