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。
我对 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。