एआईडीएल के साथ तेज़ संदेश कतार

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

समर्थित पेलोड प्रकार

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

समर्थित कतार प्रकार

HIDL के समान कतार प्रकार , जिन्हें अक्सर फ्लेवर कहा जाता है, AIDL के साथ समर्थित हैं। इन्हें क्यू और डिस्क्रिप्टर के लिए टेम्पलेट तर्क के रूप में उपयोग किया जाता है।

एचआईडीएल प्रकार एआईडीएल प्रकार
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);

प्राप्त करने की प्रक्रिया एआईडीएल इंटरफ़ेस से प्राप्त डिस्क्रिप्टर के साथ कतार के दूसरी तरफ बनाएगी।

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 का उपयोग में वर्णित सभी API एक अपवाद के साथ AidlMessageQueue के साथ पूरी तरह से समर्थित हैं:

const MQDescriptor<T, flavor>* getDesc() MQDescriptor<T, U> dupeDesc() से बदल दिया जाता है जो AIDL MQDescriptor लौटाता है।