Android 12'den itibaren Hızlı Mesaj Kuyruğu, NDK arka ucunu kullanan AIDL arayüzleriyle birlikte kullanılabilir. Bu sayede işlemler, kısa bir kurulumun ardından bağlayıcı işlemlerin ek yükü ve kısıtlamaları olmadan iletişim kurabilir. Stable AIDL kullanılarak sistem ve satıcı süreçleri arasında iletişim kurulabilir.
Desteklenen yük türleri
- @FixedSize AIDL
parcelable
türleri - AIDL
enum
türleri - AIDL tam sayı türleri
Paylaşılan bellek mesajı kuyruğunda işlemler arasında gönderilen mesajlar, işlem sınırları boyunca 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.
Desteklenen sıra türleri
HIDL'deki aynı kuyruk türleri (genellikle tatlar 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 aktaracak AIDL arayüzünü tanımlayın.
MQDescriptor
, parcelable'ın kullanılabildiği her yerde kullanılabilir.
MQDescriptor
için gerekli şablon bağımsız değişkenleri, yük türü ve kuyruk türü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ı 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.
Using the MessageQueue 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()
kullanılır. Bu, AIDL MQDescriptor
değerini döndürür.