Android: 是否只有一次 HAL 模块实例?

Android: Is there just once instance of a HAL module?

我对 HAL 模块的生命周期和使用感到困惑。传统上,一个 HAL 模块被实现为一组对各种函数的挂钩,并被编译到一个共享库中。假设我有两个 link 到 libhardware 的应用程序,并且都在其代码中的某处调用了 hw_get_module()

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

如果我在一个应用程序中递增 count 变量,它对另一个应用程序可见吗?即,my_audio_stream 模块是否只有一个全局实例?

hw_get_module() 最终只是调用了一个 dlopen()

dlopen() 将为调用它的特定进程加载库。尽管 .text(可执行代码)在共享对象的进程之间共享,但 .so 所需的存储空间(例如 global/static 对象)是按进程分配的

因此,如果两个进程调用 hw_get_module(),那么在 .so 中声明的全局变量将不会在这些进程之间共享。

因此,在一个进程中递增的计数不会被其他进程看到。

话虽如此,Android 将只加载 HAL 模块的一个实例,并在内部永远使用它。 (只有一个音频服务器实例)

如果您需要从 app/process 访问 HAL 的内部结构,您应该在 HAL 中实现某种 IPC。