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