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