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