Antrian Pesan Cepat dengan AIDL

Mulai Android 12, Fast Message Queue dapat digunakan dengan antarmuka AIDL menggunakan backend NDK. Hal ini memungkinkan proses untuk berkomunikasi tanpa overhead dan pembatasan transaksi pengikat setelah beberapa pengaturan singkat. Menggunakan AIDL Stabil memungkinkan komunikasi antara proses sistem dan vendor.

Jenis muatan yang didukung

Pesan yang dikirim antar proses dalam antrian pesan memori bersama harus memiliki tata letak memori yang sama melintasi batas proses dan tidak boleh berisi pointer. Mencoba membuat AidlMessageQueue dengan tipe yang tidak didukung akan menyebabkan kesalahan kompilasi.

Jenis antrean yang didukung

Tipe antrean yang sama dari HIDL, sering disebut ragam, didukung dengan AIDL. Ini digunakan sebagai argumen template untuk antrian dan deskriptor.

Tipe HIDL Tipe AIDL
android::hardware::kSynchronizedReadWrite android.hardware.common.fmq.SynchronizedReadWrite
android::hardware::kUnsynchronizedWrite android.hardware.common.fmq.UnsynchronizedWrite

Cara Penggunaan

Tentukan antarmuka AIDL yang akan meneruskan MQDescriptor ke proses lainnya. MQDescriptor dapat digunakan di mana pun paketnya berada.

Argumen templat yang diperlukan untuk MQDescriptor adalah tipe payload dan ragam antrian.

import android.hardware.common.fmq.MQDescriptor
import android.hardware.common.fmq.SynchronizedReadWrite

void getQueue(out MQDescriptor<int, SynchronizedReadWrite> mqDesc);

Proses pengaturan setiap sisi antrian pesan hampir sama dengan proses menggunakan HIDL , hanya menggunakan tipe 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);

Proses penerimaan akan membuat sisi lain antrian dengan deskriptor yang diterima dari antarmuka 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()) {
   ...
}

Menggunakan AidlMessageQueue setelah pengaturan sama dengan HIDL MessageQueue . Semua API yang dijelaskan di Menggunakan MessageQueue didukung sepenuhnya dengan AidlMessageQueue dengan satu pengecualian:

const MQDescriptor<T, flavor>* getDesc() digantikan oleh MQDescriptor<T, U> dupeDesc() yang mengembalikan AIDL MQDescriptor .