Android 12 sürümünden itibaren Hızlı Mesaj Sırası, NDK arka ucunu kullanan AIDL arayüzleriyle kullanılır. Böylece süreçler bağlayıcı işlemlerin ek yükü ve kısıtlamaları olmadan kurulum yapabilirsiniz. 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 integral türleri
Paylaşılan anı mesajı sırasındaki işlemler arasında gönderilen mesajların aynı olması gerekir.
işlem sınırlarının üzerinde kalan bellek düzenidir ve işaretçi içeremez. Bir dosya oluşturulmaya çalışılıyor.
Desteklenmeyen bir türe sahip AidlMessageQueue
, derleme hatasına neden olur.
Desteklenen sıra türleri
HIDL'deki sıra türleri genellikle gibi özellikler AIDL ile destekleniyor. Bunlar, değerler için şablon bağımsız değişkeni olarak kullanılır sıralar ve tanımlayıcılardı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
, paket öğesinin olduğu 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);
İleti sırasının her iki tarafını da ayarlama süreci, HIDL ile işlem, yalnızca AIDL türlerini kullanarak.
#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 başlıklı makalede açıklanan tüm API'ler
AidlMessageQueue
ile tam olarak desteklenir. Bunun bir istisnası vardır:
const MQDescriptor<T, flavor>* getDesc()
, MQDescriptor<T, U> dupeDesc()
ile değiştirildi
AIDL MQDescriptor
değerini döndürür.