HAL MODULE 执行过程分析

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值