एआईडीएल की मदद से, मैसेज की सूची तेज़ी से बनाना

Android 12 से, फ़ास्ट मैसेज क्यू का इस्तेमाल, NDK बैकएंड का इस्तेमाल करने वाले एआईडीएल इंटरफ़ेस के साथ किया जा सकता है. इससे प्रोसेस, कुछ समय के सेटअप के बाद बाइंडर ट्रांज़ैक्शन की पाबंदियों और ओवरहेड के बिना कम्यूनिकेट कर सकती हैं. Stable AIDL का इस्तेमाल करके, सिस्टम और वेंडर प्रोसेस के बीच कम्यूनिकेशन किया जा सकता है.

साथ काम करने वाले पेलोड टाइप

शेयर की गई मेमोरी मैसेज कतार में प्रोसेस के बीच भेजे गए मैसेज का मेमोरी लेआउट, प्रोसेस की सीमाओं के पार एक जैसा होना चाहिए. साथ ही, इसमें पॉइंटर नहीं होने चाहिए. ऐसे टाइप का AidlMessageQueue बनाने की कोशिश करने पर कंपाइलेशन से जुड़ी गड़बड़ी होगी जो काम नहीं करता.

इस्तेमाल किए जा सकने वाले कतार के टाइप

एचआईडीएल में इस्तेमाल होने वाले एक ही तरह के कतार टाइप, जिन्हें अक्सर फ़्लेवर कहा जाता है, एआईडीएल के साथ काम करते हैं. इनका इस्तेमाल, कतारों और डिस्क्रिप्टर के लिए टेंप्लेट आर्ग्युमेंट के तौर पर किया जाता है.

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 दिखाता है.