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
HAL MODULE 执行过程分析
最新推荐文章于 2021-12-06 20:59:00 发布