2016-08-01 27 views
0

Ich bin verwirrt über die Lebensdauer und Verwendung von HAL-Modulen. Herkömmlicherweise wird ein HAL-Modul als ein Satz von Hooks für verschiedene Funktionen implementiert und in eine gemeinsam genutzte Bibliothek kompiliert. Angenommen, ich habe zwei Anwendungen, die mit libhardware verknüpfen und beide hw_get_module() irgendwo in ihrem Code aufrufen.Android: Gibt es nur einmal Instanz eines HAL-Moduls?

struct my_audio_stream { 
    struct audio_stream base;  /* base HAL */ 
    int count; 
} 

struct audio_module HAL_MODULE_INFO_SYM = { 
    .base = 
     .common = { 
      .tag = HARDWARE_MODULE_TAG, 
      .module_api_version = AUDIO_MODULE_API_VERSION_0_1, 
      .hal_api_version = HARDWARE_HAL_API_VERSION, 
      .id = AUDIO_HARDWARE_MODULE_ID, 
      .name = "USB audio HW HAL", 
      .author = "The Android Open Source Project", 
      .methods = &hal_module_methods, 
     }, 
} 

Wenn ich die Zählvariable in einer Anwendung inkrementiere, wird sie für die andere Anwendung sichtbar sein? Dh, gibt es nur eine globale Instanz des Moduls my_audio_stream?

Antwort

1

hw_get_module() schließlich nennt nur ein dlopen()

dlopen() wird Bibliothek für den jeweiligen Prozess laden, die sie aufgerufen. Obwohl .tex (ausführbarer Code) zwischen Prozessen für ein gemeinsames Objekt geteilt wird, werden von .so benötigte Speicher (zB für globale/statische Objekte) pro Prozess zugewiesen nicht zwischen diesen Prozessen geteilt werden.

Es folgt, dass Zählung inkrementiert in einem Prozess wird nicht von anderen Prozess gesehen werden.

Nachdem das gesagt wurde, wird Android nur eine Instanz eines HAL-Moduls laden und das für immer intern verwenden. (Es gibt nur eine Instanz von Audio Server)

Wenn Sie von Ihrer App/Ihrem Prozess auf die Interna Ihrer HAL zugreifen müssen, sollten Sie eine Art IPC in Ihrer HAL implementieren.