WEB开发网      濠电娀娼ч崐濠氬疾椤愶附鍋熸い鏍ㄧ〒闂勫嫰鏌﹀Ο渚Ц闁诲氦顕ч湁婵犲﹤楠告禍鍓х磼鏉堛劌绗氶柟宄版嚇閹晠宕归銈嗘濠电偞鍨堕幐鎾磻閹捐秮褰掓偐閻戞﹩妫勯梺鎼炲妼鐎涒晝绮嬪澶樻晝闁挎繂鏌婇敃鍌涚厵閻庢稒锚閻忥絾绻濇繝鍐ㄧ伌闁诡垰鍟村畷鐔碱敂閸♀晙绱樺┑鐐差嚟婵儳螞閸曨剚鍙忛柍鍝勬噹缁€澶嬬箾閹存繄锛嶆鐐灲閹綊宕惰濡插鏌涢妸銉ヮ劉缂佸倸绉归弫鎾绘晸閿燂拷 ---闂備焦瀵уú鈺呭箯閿燂拷
开发学院手机开发Android 开发 Android HAL 分析 阅读

Android HAL 分析

 2010-05-26 06:40:00 来源:WEB开发网 闂備線娼уΛ鎾箯閿燂拷闂備礁鎲¢崹鐢垫崲閹扮増鍎嶆い鎺戝€甸崑鎾斥槈濞嗗秳娌紓鍌氱▌閹凤拷濠电姭鎷冮崨顓濈捕闂侀潧娲ゅú銊╁焵椤掍胶鈯曢柕鍥╁仧缁辩偤鏁撻敓锟�闂備線娼уΛ鎾箯閿燂拷  闂備胶枪缁绘鈻嶉弴銏犳瀬闁绘劕鐏氱€氼剟姊洪崹顕呭剰闁逞屽墮缁夊綊寮婚妸褉鍋撻棃娑欏暈闁伙綀浜埀顒傛暬閸嬪﹪宕伴弽褏鏆﹂柨鐕傛嫹
核心提示:图3:Android HAL / libhardware现在的 libhardware 作法,就有「stub」的味道了,Android HAL 分析(2),HAL stub 是一种代理人(proxy)的概念,stub 虽然仍是以 *.so?的形式存在,上层通过HAL module提供的统一接口获取并操作HAL stub

图3:Android HAL / libhardware

现在的 libhardware 作法,就有「stub」的味道了。HAL stub 是一种代理人(proxy)的概念,stub 虽然仍是以 *.so?的形式存在,但 HAL 已经将 *.so 档隐藏起来了。Stub 向 HAL「提供」操作函数(operations),而 runtime 则是向 HAL 取得特定模块(stub)的 operations,再 callback 这些操作函数。这种以 indirect function call 的实作架构,让HAL stub 变成是一种「包含」关系,即 HAL 里包含了许许多多的 stub(代理人)。Runtime 只要说明「类型」,即 module ID,就可以取得操作函数。对于目前的HAL,可以认为Android定义了HAL层结构框架,通过几个接口访问硬件从而统一了调用方式。

4 HAL_legacy和HAL的对比

HAL_legacy:旧式的HAL是一个模块,采用共享库形式,在编译时会调用到。由于采用function

call形式调用,因此可被多个进程使用,但会被mapping到多个进程空间中,造成浪费,同时需要考虑代码能否安全重入的问题(thread safe)。

HAL:新式的HAL采用HAL module和HAL stub结合形式,HAL stub不是一个share library,编译时上层只拥有访问HAL stub的函数指针,并不需要HAL stub。上层通过HAL module提供的统一接口获取并操作HAL stub,so文件只会被mapping到一个进程,也不存在重复mapping和重入问题。

5 HAL module架构

HAL moudle主要分为三个结构:

struct hw_module_t;

struct hw_module_methods_t;

struct hw_device_t;

他们的继承关系如下图:

<a target=Android HAL 分析 - On<wbr>ce - 许兴旺的博客" src="http://tech.cncms.com/tech/UploadPic/2010911/20109110170673.jpg" width="432" height="525" border="0" onload="return imgzoom(this,550);" style="cursor:pointer;" onclick="javascript:window.open(this.src);"/>

图4:Android HAL结构继承关系

6 HAL使用方法

(1)Native code通过hw_get_module调用获取HAL stub:

hw_get_module (LED_HARDWARE_MODULE_ID, (const hw_module_t**)&module)

(2)通过继承hw_module_methods_t的callback来open设备:

module->methods->open(module,

LED_HARDWARE_MODULE_ID, (struct hw_device_t**)device);

(3)通过继承hw_device_t的callback来控制设备:

sLedDevice->set_on(sLedDevice, led);

上一页  1 2 3 4  下一页

Tags:Android HAL 分析

编辑录入:coldstar [复制链接] [打 印]
赞助商链接