एआईडीएल के साथ तेज़ी से मैसेज की सूची

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

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

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

इस्तेमाल की जा सकने वाली सूची के टाइप

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

HIDL प्रकार एआईडीएल टाइप
android::hardware::kSynchronizedReadWrite android.hardware.common.fmq.SynchronizedReadWrite
android::hardware::kUnsynchronizedWrite android.hardware.common.fmq.UnsynchronizedWrite

कैसे इस्तेमाल करें

ऐसा एआईडीएल इंटरफ़ेस तय करें जो MQDescriptor को अन्य प्रोसेस में पास करेगा. MQDescriptor का इस्तेमाल ऐसी किसी भी जगह किया जा सकता है जहां पार्सल किया जा सकता है.

MQDescriptor के लिए ज़रूरी टेंप्लेट आर्ग्युमेंट, पेलोड टाइप और क्यू फ़्लेवर हैं.

import android.hardware.common.fmq.MQDescriptor
import android.hardware.common.fmq.SynchronizedReadWrite

void getQueue(out MQDescriptor<int, SynchronizedReadWrite> mqDesc);

संदेश सूची के दोनों ओर सेट करने की प्रक्रिया करीब-करीब इसके समान है एआईडीएल टाइप का इस्तेमाल करके, एचआईडीएल का इस्तेमाल करके प्रोसेस को पूरा करना.

#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);

मैसेज पाने की प्रोसेस के तहत, एआईडीएल इंटरफ़ेस से मिले डिस्क्रिप्टर के साथ, सूची की दूसरी साइड बनाई जाएगी.

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() से बदल दिया गया है जो एआईडीएल MQDescriptor दिखाता है.