Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1082930
  • 博文数量: 135
  • 博客积分: 10182
  • 博客等级: 上将
  • 技术积分: 1565
  • 用 户 组: 普通用户
  • 注册时间: 2006-08-07 16:05
文章分类

全部博文(135)

文章存档

2011年(5)

2010年(20)

2009年(3)

2008年(16)

2007年(91)

分类: LINUX

2010-03-04 14:22:29

 

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文件了。

阅读(3726) | 评论(0) | 转发(0) |
0

上一篇:Android HAL

下一篇:android模拟器使用

给主人留下些什么吧!~~