Android 12'den itibaren Hızlı Mesaj Kuyruğu, NDK arka ucu kullanılarak AIDL arayüzleriyle kullanılabilir. Bu sayede, kısa bir kurulumdan sonra süreçler, bağlayıcı işlemler için gereken ek maliyet ve kısıtlamalar olmadan iletişim kurabilir. Kararlı AIDL kullanmak, sistem ve tedarikçi firma 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 bütünsel türleri
Paylaşılan bellek mesaj kuyruğundaki işlemler arasında gönderilen mesajlar, 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.
Desteklenen sıra türleri
HIDL'deki aynı sıralı liste türleri (genellikle lezzet olarak adlandırılır) AIDL ile desteklenir. Bunlar, ardışık düzenler ve tanımlayıcılara yönelik ş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
öğesini diğer işleme aktaracak 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 sıra ç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 işlemi, yalnızca AIDL türlerini kullanarak HIDL'yi kullanma işlemine 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);
Alıcı süreç, 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
kullanımı HIDL MessageQueue
ile aynıdır.
MessageQueue'yu 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()
, MQDescriptor
AIDL'sini döndüren MQDescriptor<T, U> dupeDesc()
ile değiştirilir.