HAL MODULE 執行過程分析

2021-05-22 00:08:16 字數 1990 閱讀 6192

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()

如此就完成了

到底層的初始化工作。

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))

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檔案了。

sql執行過程分析

我們總是寫sql語句,資料庫把結果返回給我們,那中間過程又是什麼?如果了解oracle是怎麼執行sql語句的中間過程,對我們優化sql有很大的幫助 首先了解一下執行sql,需要消耗什麼資源,cpu,記憶體,io,我們要了解什麼情況下會消耗cpu,什麼情況下消耗記憶體,什麼情況下消耗io,只有了解了這...

mysql sql執行慢 分析過程

為了驗證select 1 與 select 1 from tablename 與 select from tablename的執行效率,需要測試一下各自執行的時間。於是總結一下,檢視mysql語句執行時間的方法。方法一 show profiles。1.show profiles是5.0.37之後新增...

flume sink執行過程簡單分析

沒有執行,直接看原始碼得到sink簡單執行過程 sinkrunner負責執行sink程式 內部類pollingrunner implements runnable private sinkprocessor policy 負責執行sink run方法 while shouldstop.get els...