ตั้งแต่ Android 12 เป็นต้นไป คิวข้อความที่รวดเร็วสามารถใช้กับอินเทอร์เฟซ AIDL โดยใช้แบ็กเอนด์ NDK ซึ่งช่วยให้กระบวนการสื่อสารกันได้โดยไม่เกิดค่าใช้จ่ายเพิ่มเติมและข้อจํากัดของธุรกรรม Binder หลังจากการตั้งค่าสั้นๆ การใช้ AIDL ที่เสถียรช่วยให้ระบบสื่อสารกับกระบวนการของผู้ให้บริการได้
ประเภทเพย์โหลดที่รองรับ
- ประเภท
parcelable
ของ AIDL @FixedSize enum
ประเภทของ AIDL- ประเภทจำนวนเต็ม AIDL
ข้อความที่ส่งระหว่างกระบวนการในคิวข้อความหน่วยความจำที่ใช้ร่วมกันต้องมีเลย์เอาต์หน่วยความจำเดียวกันในขอบเขตกระบวนการและไม่มีพอยน์เตอร์ การพยายามสร้าง AidlMessageQueue
ที่มีประเภทที่ไม่รองรับจะทำให้เกิดข้อผิดพลาดในการคอมไพล์
ประเภทคิวที่รองรับ
AIDL รองรับประเภทคิวเดียวกันจาก HIDL ซึ่งมักเรียกว่า "Flavour" ซึ่งจะใช้เป็นอาร์กิวเมนต์ของเทมเพลตสำหรับคิวและตัวระบุ
ประเภท 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);
กระบวนการรับจะสร้างอีกฝั่งของคิวด้วยตัวบ่งชี้ที่ได้รับจากอินเทอร์เฟซ 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
AidlMessageQueue
รองรับ API ทั้งหมดที่อธิบายไว้ในการใช้ MessageQueue โดยมีข้อยกเว้นเพียงอย่างเดียวดังนี้
const MQDescriptor<T, flavor>* getDesc()
แทนที่ด้วย MQDescriptor<T, U> dupeDesc()
ซึ่งแสดงผล AIDL MQDescriptor