Android 12'den itibaren Fast Message Queue, NDK arka ucunu kullanan AIDL arayüzleriyle kullanılabilir. Bu sayede, kısa bir kurulumun ardından süreçler, bağlayıcı işlemlerin ek yükü ve kısıtlamaları olmadan iletişim kurabilir. Kararlı AIDL kullanmak, sistem ve satıcı süreçleri arasında iletişime olanak tanır.
Desteklenen yük türleri
FixedSizeAIDLparcelabletürleri (cpparka ucundan kullanılamaz)- AIDL
uniontürleri (cpparka ucunda kullanılamaz) - AIDL
enumtürleri - AIDL tam sayı türleri
Paylaşılan bellek ileti kuyruğundaki işlemler arasında gönderilen iletiler, işlem sınırları genelinde aynı bellek düzenine sahip olmalı ve işaretçiler içermemelidir. Desteklenmeyen bir türde AidlMessageQueue oluşturmaya çalışmak derleme hatasına neden olur. cpp arka ucundaki AIDL parcelable ve union türleri, sanal işlevlere sahip olan android::Parcelable'den devralındıkları için Fast Message Queue ile kullanılamaz.
Desteklenen sıra türleri
HIDL'deki aynı kuyruk türleri (genellikle "çeşitler" olarak adlandırılır) AIDL ile desteklenir. Bunlar, kuyruklar ve tanımlayıcılar için şablon bağımsız değişkenleri olarak kullanılır.
| HIDL Türleri | AIDL Türleri |
|---|---|
android::hardware::kSynchronizedReadWrite |
android.hardware.common.fmq.SynchronizedReadWrite |
android::hardware::kUnsynchronizedWrite |
android.hardware.common.fmq.UnsynchronizedWrite |
Nasıl kullanılır?
MQDescriptor değerini diğer işleme ileten AIDL arayüzünü tanımlayın. MQDescriptor, paketlenebilir öğelerin kullanılabildiği her yerde kullanılabilir.
MQDescriptor için gerekli şablon bağımsız değişkenleri yük türü ve kuyruk
çeşididir.
import android.hardware.common.fmq.MQDescriptor
import android.hardware.common.fmq.SynchronizedReadWrite
void getQueue(out MQDescriptor<int, SynchronizedReadWrite> mqDesc);
Mesaj kuyruğunun her iki tarafını ayarlama süreci, HIDL kullanma süreciyle neredeyse aynıdır. Tek fark, AIDL türlerinin kullanılmasıdır.
#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);
Alma işlemi, AIDL arayüzünden alınan tanımlayıcıyla kuyruğun diğer tarafını oluşturur.
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()) {
...
}
Kurulumdan sonra AidlMessageQueue kullanmak, HIDL MessageQueue kullanmakla aynıdır.
Use the MessageQueue (Mesaj Kuyruğunu Kullanma) bölümünde açıklanan tüm API'ler, bir istisna dışında AidlMessageQueue ile tam olarak desteklenir:
const MQDescriptor<T, flavor>* getDesc() yerine MQDescriptor<T, U> dupeDesc()
AIDL MQDescriptor değerini döndüren ifade kullanılır.