Android 12'den itibaren Hızlı Mesaj Kuyruğu , NDK arka ucunu kullanan AIDL arayüzleriyle kullanılabilir. Bu, kısa bir kurulumdan sonra süreçlerin ciltleme işlemlerinin ek yükü ve kısıtlamaları olmadan iletişim kurmasına olanak tanır. Stabil AIDL'nin kullanılması, sistem ve satıcı süreçleri arasında iletişime olanak tanır.
Desteklenen yük türleri
- @FixedSize AIDL
parcelable
türleri - AIDL
enum
türleri - AIDL integral türleri
Paylaşılan hafıza mesaj kuyruğundaki işlemler arasında gönderilen mesajlar, işlem sınırları boyunca aynı hafıza düzenine sahip olmalı ve işaretçiler içeremez. Desteklenmeyen bir türle AidlMessageQueue
oluşturulmaya çalışılması derleme hatasına neden olur.
Desteklenen kuyruk türleri
HIDL'den gelen ve genellikle tatlar olarak adlandırılan aynı kuyruk türleri , AIDL tarafından desteklenir. Bunlar kuyruklar ve tanımlayıcılar için şablon argümanları 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
diğer işleme aktaracak AIDL arayüzünü tanımlayın. MQDescriptor
bir parsellenebilirin olabileceği her yerde kullanılabilir.
MQDescriptor
için gerekli şablon argümanları veri yükü türü ve kuyruk tadıdır.
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ı da ayarlama işlemi, yalnızca AIDL türlerini kullanan HIDL kullanan işlemle neredeyse aynı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ı ile kuyruğun diğer tarafını oluşturacaktır.
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
ile aynıdır. TextQueue'yu Kullanma bölümünde açıklanan tüm API'ler, bir istisna dışında AidlMessageQueue
tarafından tam olarak desteklenir:
const MQDescriptor<T, flavor>* getDesc()
yerine AIDL MQDescriptor
değerini döndüren MQDescriptor<T, U> dupeDesc()
gelir.