AIDL ile Hızlı Mesaj Sırası

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

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.