A partire da Android 12, Fast Message Queue può essere utilizzato con le interfacce AIDL utilizzando il backend NDK. Ciò consente ai processi di comunicare senza il sovraccarico e le restrizioni delle transazioni dei raccoglitori dopo una breve configurazione. L'utilizzo di AIDL stabile consente la comunicazione tra i processi del sistema e del fornitore.
Tipi di carico utile supportati
- Tipi
parcelable
AIDL @FixedSize - Tipi
enum
AIDL - Tipi integrali AIDL
I messaggi inviati tra processi nella coda dei messaggi della memoria condivisa devono avere lo stesso layout di memoria oltre i limiti del processo e non possono contenere puntatori. Il tentativo di creare un AidlMessageQueue
con un tipo non supportato causerà un errore di compilazione.
Tipi di coda supportati
Gli stessi tipi di coda di HIDL, spesso chiamati sapori, sono supportati da AIDL. Questi vengono utilizzati come argomenti modello per le code e i descrittori.
Tipi HIDL | Tipi AIDL |
---|---|
android::hardware::kSynchronizedReadWrite | android.hardware.common.fmq.SynchronizedReadWrite |
android::hardware::kUnsynchronizedWrite | android.hardware.common.fmq.UnsynchronizedWrite |
Come usare
Definire l'interfaccia AIDL che passerà MQDescriptor
all'altro processo. MQDescriptor
può essere utilizzato ovunque possa trovarsi un parcelable.
Gli argomenti del modello richiesti per MQDescriptor
sono il tipo di payload e la tipologia della coda.
import android.hardware.common.fmq.MQDescriptor
import android.hardware.common.fmq.SynchronizedReadWrite
void getQueue(out MQDescriptor<int, SynchronizedReadWrite> mqDesc);
Il processo di impostazione di ciascun lato della coda di messaggi è quasi identico al processo che utilizza HIDL , utilizzando solo i tipi AIDL.
#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);
Il processo di ricezione creerà l'altro lato della coda con il descrittore ricevuto dall'interfaccia AIDL.
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()) {
...
}
L'utilizzo di AidlMessageQueue
dopo l'installazione equivale a HIDL MessageQueue
. Tutte le API descritte in Utilizzo di MessageQueue sono completamente supportate con AidlMessageQueue
con un'eccezione:
const MQDescriptor<T, flavor>* getDesc()
è sostituito da MQDescriptor<T, U> dupeDesc()
che restituisce AIDL MQDescriptor
.