2016-08-01 2 views
0

Я смущен о жизни и использовании модулей HAL. Традиционно модуль HAL реализован как набор перехватов для различных функций и скомпилирован в общую библиотеку. Предположим, у меня есть два приложения, которые ссылаются на libhardware и оба звонят hw_get_module() где-то в своем коде.Android: Есть ли только один экземпляр модуля HAL?

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, 
     }, 
} 

Если я увеличиваю счетчик в одном приложении, будет ли он виден другому приложению? I.e, есть ли только один глобальный экземпляр модуля my_audio_stream?

ответ

1

hw_get_module() в конце концов, просто называет dlopen()

dlopen() будет загружать библиотеку для конкретного процесса, который назвал его. Хотя .text (исполняемый код) разделяется между процессами для общего объекта, хранилища, требуемые .so (например, для глобальных/статических объектов), выделяются для каждого процесса

Так что если два процесса вызывают hw_get_module(), тогда глобальные объявленные в .so будут не разделяться между этими процессами.

Из этого следует, что счет, увеличиваемый в одном процессе, не будет рассматриваться другим процессом.

Сказав, что Android будет загружать только один экземпляр модуля HAL и использовать его навсегда внутри. (Существует только один экземпляр Audio Server)

Если вам нужно получить доступ к внутренностям вашего HAL из вашего приложения/процесса, вы должны реализовать какой-то IPC в своем HAL.

Смежные вопросы