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
- @FixedSize AIDL tipe
parcelable
- Tipe
enum
AIDL - Tipe integral AIDL
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
.