HAL MODULE 执行过程分析

本文详细剖析了HAL(硬件抽象层)模块的加载流程,包括系统库加载、JNI注册及HAL模块实例化等关键步骤,并深入探讨了如何通过读取硬件属性确定具体的HAL库。

HAL module 执行过程分析

1. 其初始化过程如下:

System.loadLibrary("led_runtime")->JNI_OnLoad()->registerMethods()-> ->env->RegisterNatives(clazz,gMethods,sizeof(gMethods)/sizeof(gMethods[0]))

 

onCreate () -> led_srv = new LedService() ->_init()->led_init() -> hw_get_module(LED_HARDWARE_MODULE_ID, (const hw_module_t**)&module) ->

  led_control_open(&module->common,&sLedDevice)-> module->methods->open(module,LED_HARDWARE_MODULE_ID,(struct hw_device_t**)device) -> led_device_open ()

如此就完成了 app 到底层的初始化工作。

2. 接下来看一下 hw_get_module() 函数。

hw_get_module()->property_get(variant_keys[i],prop,NULL)->__system_property_get(key, value) ->__system_property_find(const char *name)-> __system_property_read(pi, 0, value)-> load(id, prop, &hmi)->snprintf(path,sizeof(path), "%s/%s.%s.so", HAL_LIBRARY_PATH, id, variant )-> handle = dlopen (path, RTLD_NOW)-> const char *sym = HAL_MODULE_INFO_SYM_AS_STR ; hmi = (const struct hw_module_t *) dlsym (handle, sym)

3. 最后我们看一下 property_get(variant_keys[i],prop,NULL)

这个其实就是获取 ro.hardware 属性,我们关心的就是这个值是什么。在 system/core/init/init.c 文件中的 main 函数中有这么一句: property_set("ro.hardware", hardware); 无疑 ro.hardware 的值就是 hardware 中的内容了。我们再找一下 hardware 赋的什么值,就 ok 了。其实就是在这个函数中完成的 get_hardware_name()

open("/proc/cpuinfo", O_RDONLY)

hw = strstr(data, "/nHardware")

while (*x && !isspace(*x))

{ 

   hardware[n++] = tolower(*x);

   x++;

   if (n == 31) break;

  }

Ok ,我们看到了,它是从 /proc/cpuinfo 中读出来的。我们再打开 cpuinfo 文件看一下: Hardware Goldfish 。好了,我们确定了 property_get ()得到的是 goldfish ,那么 snprintf(path, sizeof(path), "%s/%s.%s.so", HAL_LIBRARY_PATH, id, variant ) 构造出来的 path 就是 /system/lib/hw/led.goldfish.so 。终于找到咱们的 so 文件了。

详细地址:http://blog.chinaunix.net/u/22630/article_105768.html

### Android Camera HAL 代码详解及架构分析 #### 1. 基本概念与背景 Android 的相机功能实现依赖于硬件抽象层 (Hardware Abstraction Layer, HAL),它作为连接上层应用和服务与底层驱动程序的关键桥梁[^1]。HAL 提供了一组标准化接口,使得不同厂商的硬件可以通过统一的方式被访问。 在 Android 系统中,Camera HAL 是一个重要的组成部分,负责管理摄像头设备并提供给应用程序调用的功能支持。随着版本迭代,Google 对 Camera HAL 进行了多次升级,目前主流使用的有 **Legacy HAL** 和 **Camera2 HAL**[^2]。 --- #### 2. Camera HAL 架构概述 Camera HAL 主要分为以下几个部分: - **Application 层**: 应用通过 `android.hardware.Camera` 或者更高阶的 `camera2` API 来控制摄像机。 - **Framework 层**: 包括 AOSP 中的 Java 接口定义和 Native 实现逻辑,位于 `frameworks/av/camera` 路径下。 - **HAL 层**: 定义了标准接口文件(如 `.hal` 文件),允许不同的 SoC 制造商实现自己的 HAL 驱动。 - **Driver 层**: 摄像头的具体操作由硬件供应商提供的驱动完成。 对于现代 Android 设备而言,通常采用的是基于 HIDL 的 HAL 结构,这提供了更好的兼容性和可扩展性[^3]。 --- #### 3. 关键组件及其作用 ##### 3.1 ICameraService 这是整个 camera 子系统的入口点,在服务启动时创建实例,并注册到 Binder Service Manager 上等待客户端请求绑定。其主要职责包括初始化各个物理相机设备对象以及维护全局状态信息等。 ##### 3.2 ICameraDeviceUser / ICameraDeviceSession 当某个进程成功打开特定 ID 所对应的相机之后会获得该类别的代理句柄用于进一步通信;而后者则代表一次完整的拍摄流程期间所建立起来的一条专用通道[^4]。 ##### 3.3 CaptureRequest & CaptureResult 这两个数据结构分别描述了一个捕获动作所需参数集合及其执行完毕后的反馈报告。前者可能包含诸如曝光时间、增益设置之类的属性值列表;后者除了返回上述调整的实际效果之外还附带一些额外诊断资料以便调试使用。 --- #### 4. 数据流处理机制 从高层视角来看,图像采集过程大致遵循如下路径: 1. 用户界面触发事件 -> 发送命令至 CameraService; 2. 根据目标配置组装合适的 Request 并传递下去直至到达最终目的地即具体的 Sensor 控制单元; 3. 经过一系列内部运算得出初步成果后再逐级向上汇报直到呈现给前端展示出来。 此过程中涉及到多线程同步问题解决办法比如利用条件变量或者信号量来协调资源竞争状况确保整体运行流畅稳定可靠。 --- #### 5. 示例代码片段 以下是简化版如何通过 native 方法获取当前可用的所有相机ID列表的一个例子: ```cpp #include <hardware/hardware.h> #include <hardware/camera_common.h> int main() { hw_module_t* module; int ret = hw_get_module(CAMERA_HARDWARE_MODULE_ID, (const hw_module_t**)&module); if (ret != 0 || !module) { printf("Failed to load camera module.\n"); return -1; } camera_device_t* device; ret = module->methods->open(module, CAMERA_ID_DEFAULT, &device); if (ret != 0 || !device) { printf("Failed to open default camera.\n"); return -1; } } ``` 以上展示了最基本的加载模块与开启默认相机的操作方式。 --- ####
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值