AIDL ile Hızlı Mesaj Sırası

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

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.