תור הודעות מהיר עם AIDL

החל מ-Android 12, ניתן להשתמש ב- Fast Message Queue עם ממשקי AIDL באמצעות ה-NDK backend. זה מאפשר לתהליכים לתקשר ללא תקורה והגבלות של עסקאות קלסר לאחר הגדרה קצרה. שימוש ב-Stable 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 .