Kể từ Android 12, bạn có thể sử dụng Fast Message Queue (Hàng đợi tin nhắn nhanh) với các giao diện AIDL bằng cách sử dụng phần phụ trợ NDK. Điều này cho phép các quy trình giao tiếp mà không mất phí và các hạn chế của các giao dịch liên kết sau khi một số thiết lập ngắn. Việc sử dụng AIDL ổn định cho phép giao tiếp giữa hệ thống và các quy trình của nhà cung cấp.
Các loại tải trọng được hỗ trợ
- Loại
parcelable
@FixedSize AIDL - Các loại
enum
AIDL - Các loại tích phân AIDL
Các thông điệp được gửi giữa các quy trình trong hàng đợi thông điệp bộ nhớ dùng chung phải có cùng bố cục bộ nhớ trên các ranh giới quy trình và không được chứa con trỏ. Việc cố gắng tạo một
AidlMessageQueue
thuộc loại không được hỗ trợ sẽ gây ra lỗi biên dịch.
Các loại hàng đợi được hỗ trợ
Cùng một loại hàng đợi từ HIDL, thường có tên là phiên bản, được hỗ trợ với AIDL. Các đối số này được dùng làm đối số mẫu cho hàng đợi và chỉ số mô tả.
Loại HIDL | Các loại AIDL |
---|---|
android::hardware::kSynchronizedReadWrite |
android.hardware.common.fmq.SynchronizedReadWrite |
android::hardware::kUnsynchronizedWrite |
android.hardware.common.fmq.UnsynchronizedWrite |
How to use
Xác định giao diện AIDL sẽ truyền MQDescriptor
sang quy trình khác.
Bạn có thể sử dụng MQDescriptor
ở mọi nơi có thể đóng gói.
Các đối số mẫu bắt buộc cho MQDescriptor
là loại tải trọng và phiên bản hàng đợi.
import android.hardware.common.fmq.MQDescriptor
import android.hardware.common.fmq.SynchronizedReadWrite
void getQueue(out MQDescriptor<int, SynchronizedReadWrite> mqDesc);
Quá trình thiết lập mỗi bên của hàng đợi thông báo gần giống với quy trình này bằng HIDL, chỉ sử dụng các loại 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);
Quy trình nhận sẽ tạo phía còn lại của hàng đợi bằng mã mô tả nhận được từ giao diện 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()) {
...
}
Việc sử dụng AidlMessageQueue
sau khi thiết lập giống như HIDL MessageQueue
.
Tất cả API được mô tả trong bài viết Sử dụng MessageQueue
được hỗ trợ đầy đủ với AidlMessageQueue
với một ngoại lệ:
const MQDescriptor<T, flavor>* getDesc()
được thay thế bằng MQDescriptor<T, U> dupeDesc()
Hàm này sẽ trả về MQDescriptor
AIDL.