Android 12 के बाद, फ़ास्ट मैसेज क्यू का इस्तेमाल, NDK बैकएंड का इस्तेमाल करने वाले AIDL इंटरफ़ेस के साथ किया जा सकता है. इससे प्रोसेस को कुछ समय के सेटअप के बाद, बाइंडर लेन-देन के ओवरहेड और पाबंदियों के बिना कम्यूनिकेट करने में मदद मिलती है. स्टेबल एआईडीएल का इस्तेमाल करने से, सिस्टम और वेंडर प्रोसेस के बीच कम्यूनिकेशन की सुविधा मिलती है.
इस्तेमाल किए जा सकने वाले पेलोड टाइप
- @FixedSize AIDL
parcelable
टाइप - एआईडीएल
enum
टाइप - AIDL के इंटिग्रल टाइप
शेयर की गई मेमोरी मैसेज कतार में प्रोसेस के बीच भेजे गए मैसेज का मेमोरी लेआउट, प्रोसेस की सीमाओं में एक जैसा होना चाहिए. साथ ही, इनमें पॉइंटर नहीं होने चाहिए. काम न करने वाले टाइप का इस्तेमाल करके AidlMessageQueue
बनाने की कोशिश करने पर, कंपाइल करने में गड़बड़ी होगी.
सूची के टाइप
HIDL में मौजूद क्यू टाइप, जिन्हें अक्सर फ़्लेवर कहा जाता है वे ही AIDL के साथ काम करते हैं. इनका इस्तेमाल, सूचियों और डिस्क्रिप्टर के लिए टेंप्लेट आर्ग्युमेंट के तौर पर किया जाता है.
HIDL टाइप | एआईडीएल टाइप |
---|---|
android::hardware::kSynchronizedReadWrite |
android.hardware.common.fmq.SynchronizedReadWrite |
android::hardware::kUnsynchronizedWrite |
android.hardware.common.fmq.UnsynchronizedWrite |
कैसे इस्तेमाल करें
वह AIDL इंटरफ़ेस तय करें जो MQDescriptor
को दूसरी प्रोसेस को पास करेगा.
MQDescriptor
का इस्तेमाल, parcelable के तौर पर इस्तेमाल किए जा सकने वाले किसी भी आइटम के लिए किया जा सकता है.
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 का इस्तेमाल करना पर बताए गए सभी एपीआई, AidlMessageQueue
के साथ पूरी तरह काम करते हैं. हालांकि, एक अपवाद है:
const MQDescriptor<T, flavor>* getDesc()
की जगह MQDescriptor<T, U> dupeDesc()
ले लेता है, जो AIDL MQDescriptor
दिखाता है.