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