החל מ-Android 12, ניתן להשתמש ב- Fast Message Queue עם ממשקי AIDL באמצעות ה-NDK backend. זה מאפשר לתהליכים לתקשר ללא תקורה והגבלות של עסקאות קלסר לאחר הגדרה קצרה. שימוש ב-Stable AIDL מאפשר תקשורת בין תהליכי המערכת והספק.
סוגי מטען נתמכים
- @FixedSize סוגי AIDL
parcelable
- סוגי
enum
AIDL - סוגי אינטגרלי AIDL
ההודעות הנשלחות בין תהליכים בתור הודעות הזיכרון המשותף חייבות להיות בעל אותה פריסת זיכרון על פני גבולות התהליך ואינן יכולות להכיל מצביעים. ניסיון ליצור AidlMessageQueue
עם סוג שאינו נתמך יגרום לשגיאת קומפילציה.
סוגי תורים נתמכים
אותם סוגי תורים מ-HIDL, הנקראים לעתים קרובות טעמים, נתמכים עם AIDL. אלה משמשים כארגומנטים של תבנית עבור התורים והמתארים.
סוגי 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
. כל ממשקי ה-API המתוארים בשימוש ב-MessageQueue נתמכים באופן מלא עם AidlMessageQueue
למעט חריג אחד:
const MQDescriptor<T, flavor>* getDesc()
מוחלף ב- MQDescriptor<T, U> dupeDesc()
שמחזיר את ה- AIDL MQDescriptor
.