版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实例解析AndroidHAL的开发方法本篇文章为大家带来的是,通过分析台湾的Jollen的mokoid工程代码,和在s5pc100平台上实现过程种遇到的问题,解析AndoridHAL的开发方法。我相信,看完本篇文章,对你的学习非常有帮助。因为本篇文章来自华清远见,最具权威!一、我们需要做个HAL介绍,现有HAL架构由PatrickBrady(Google)在2008GoogleI/O演讲中提出的,如下图。Android的HAL是为了保护一些硬件提供商的知识产权而提出的,是为了避开linux的GPL束缚。思路是把控制硬件的动作都放到了AndroidHAL中,而linuxdriver仅仅完成一些简单的数据交互作用,甚至把硬件寄存器空间直接映射到userspace。而Android是基于Aparch的license,因此硬件厂商可以只提供二进制代码,所以说Android只是一个开放的平台,并不是一个开源的平台。也许也正是因为Android不遵从GPL,所以GregKroah-Hartman才在2.6.33内核将Andorid驱动从linux中删除。GPL和硬件厂商目前还是有着无法弥合的裂痕。Android想要把这个问题处理好也是不容易的。二、总结下来,AndroidHAL存在的原因主要有:1.并不是所有的硬件设备都有标准的linuxkernel的接口2.KERNELDRIVER涉及到GPL的版权。某些设备制造商并不原因公开硬件驱动,所以才去用HAL方式绕过GPL。3.针对某些硬件,An有一些特殊的需求。三、HAL内容1、HAL主要的储存于以下目录:(注意:HAL在其它目录下也可以正常编译)●libhardware_legacy/-旧的架构、采取链接库模块的观念进行●libhardware/-新架构、调整为HALstub的观念●ril/-RadioInterfaceLayer●msm7kQUAL平台相关主要包含以下一些模块:Gps、Vibrator、Wifi、Copybit、Audio、Camera、Lights、Ril、Overlay等。2、两种HAL架构比较目前存在两种HAL架构,位于libhardware_legacy目录下的“旧HAL架构”和位于libhardware目录下的“新HAL架构”。两种框架如下图所示。图3.1旧HAL架构图3.2新HAL架构libhardware_legacy是将*.so文件当作sharedlibrary来使用,在runtime(JNI部份)以directfunctioncall使用HALmodule。通过直接函数调用的方式,来操作驱动程序。当然,应用程序也可以不需要通过JNI的方式进行,直接加载*.so(dlopen)的做法调用*.so里的符号(symbol)也是一种方式。总而言之是没有经过封装,上层可以直接操作硬件。现在的libhardware架构,就有stub的味道了。HALstub是一种代理人(proxy)的概念,stub虽然仍是以*.so檔的形式存在,但HAL已经将*.so档隐藏起来了。Stub向HAL提供操作函数(operations),而runtime则是向HAL取得特定模块(stub)的operations,再callback这些操作函数。这种以indirectfunctioncall的架构,让HALstub变成是一种包含关系,即HAL里包含了许许多多的stub(代理人)。Runtime只要说明类型,即moduleID,就可以取得操作函数。对于目前的HAL,可以认为Android定义了HAL层结构框架,通过几个接口访问硬件从而统一了调用方式。下面结合实例来分析HAL编程方法。四、mokoid工程代码下载与结构分析1、mokid项目概述modkoid工程提供了一个LedTest示例程序,是台湾的Jollen用于培训的。对于理解android层次结构、Hal编程方法都非常有意义。2、下载方法#svncheckout/svn/trunk/mokoid-read-only3、结构分析Android的HAL的实现需要通过JNI(JavaNativeInterface),JNI简单来说就是java程序可以调用C/C++写的动态链接库,这样的话,HAL可以使用C/C++语言编写,效率更高。在Android下访问HAL大致有以下两种方式:(1)Android的app可以直接通过service调用.so格式的jni(2)经过Manager调用service上面两种方法应该说是各有优缺点,第一种方法简单高效,但不正规。第二种方法实现起来比较复杂,但更符合目前的Android框架。第二种方法中,LegManager和LedService(java)在两个进程中,需要通过进程通讯的方式来通讯。mokoid工程中实现了上述两种方法。下面将详细介绍这两种方法的实现原理。4、第一种方法:直接调用service方法的实现过程下面分析第一种方法中,各层的关键代码。(1)HAL层一般来说HALmoudle需要涉及的是三个关键结构体:structhw_module_t;structhw_module_methods_t;structhw_device_t;下面结合代码说明这3个结构的用法。部分代码经过修改,后面的章节会给出修改的原因。文件:mokoid-read-only/hardware/modules/include/mokoid/led.h/***************************************************************************/structled_module_t{structhw_module_tcommon;};//HAL规定不能直接使用hw_module_t结构,因此需要做这么一个继承。structled_control_device_t{//自定义的一个针对Led控制的结构,包含hw_device_t和支持的API操作structhw_device_tcommon;/*attributes*/intfd;//可用于具体的设备描述符/*supportingcontrolAPIsgohere*/int(*set_on)(structled_control_device_t*dev,int32_tled);int(*set_off)(structled_control_device_t*dev,int32_tled);};#defineLED_HARDWARE_MODULE_ID"led"//定义一个MODULE_ID,HAL层可以根据这个ID找到我们这个HALstub文件:mokoid-read-only/hardware/modules/led/led.c(2)JNI层文件:mokoid-read-only/frameworks/base/service/jni/com_mokoid_server_LedService.cpp(3)service(属于Framework层)(4)APP测试程序(属于APP层)文件:apps/LedClient/src/com/mokoid/LedClient/LedClient.java5、第二种方法:经过Manager调用serviceHAL、JNI两层和第一种方法一样,所以后面只分析其他的层次。(1)Manager(属于Framework层)APP通过这个Manager和service通讯。文件:mokoid-read-only/frameworks/base/core/java/mokoid/hardware/LedManager.java因为LedService和LedManager在不同的进程,所以要考虑到进程通讯的问题。Manager通过增加一个aidl文件来描述通讯接口文件:mokoid-read-only/frameworks/base/core/java/mokoid/hardware/ILedService.aidl(2)SystemServer(属于APP层)文件:mokoid-read-only/apps/LedTest/src/com/mokoid/LedTest/LedSystemServer.java(3)APP测试程序(属于APP层)文件:mokoid-read-only/apps/LedTest/src/com/mokoid/LedTest/LedTest.java五、实验中需要注意的问题将下载后的源码放到你的android源码目录下,然后编译系统。本实验用的android版本为2.1。实验的过程中大致出现过以下几个问题:1、目标系统中没有生成LedClient.apk或LedTest.apk应用程序编译完成后,没有在目标系统的system/app/目录下找到LedClient.apk或LedTest应用程序。只有通过单独编译LedClient或LedTest才能在目标目录中生成。方法如下:#mmmmokoid-read-only/apps/LedTest/检查原因后发现mokoid-read-only/apps/LedTest/Android.mkLOCAL_MODULES_TAGS:=user而我们的s5pc100系统在配置时tapas时选择的是eng,所以没有装载到目标系统。所以修改LedTest和LedClient的Android.mkLOCAL_MODULES_TAGS:=usereng再次编译即可自动装载到目标系统/system/app/目录下。2、启动后没有图标,找不到应用程序目标系统启动后找不到两个应用程序的图标。仔细阅读logcat输出的信息发现:E/PackageManager(2717):Packagecom.mokoid.LedClientrequiresunavailablesharedlibrarycom.mokoid.server;failing!原因是找不到com.mokoid.server。检查mokoid-read-only/frameworks/base/Android.mk发现系统将LedManager和LedService编译成mokoid.jar库文件。为了让应用程序可以访问到这个库,需要通过com.mokoid.server.xml来设定其对应关系。解决方法:拷贝com.mokoid.server.xml到目标系统的system/etc/permissions/目录下。此时两个应用的程序的图标都正常出现了。3、提示找不到JNI_OnLoad按照以前的实验加入下列代码:4、需要针对你的目标平台修改HAL的Makefile修改mokoid-read-only/hardware/modules/led/Android.mkLOCAL_MODULE:=led.default5、在eclipse中编译不了LedSystemServer.java原因是程序中要用到ServiceManager.addService,这需要系统权限。解决方法可以把应用程序放
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 包抓联工作制度
- 信息工作制度
- 传染病工作制度
- 中成药工作制度
- 初中团工作制度
- 包楼栋工作制度
- 优抚工作制度
- 医美科工作制度
- 修剪队工作制度
- 三站工作制度
- 移动模架施工安全监理实施细则
- 中兴新云2026年测评-B套题
- 分岗设权内部控制制度
- 2026年全国体育单招考试时事政治(2025.6-2026.1)-2026届中职高考
- 2026年山西经贸职业学院单招职业技能考试题库及答案解析
- 2026年丽水职业技术学院单招职业适应性考试题库带答案详解(基础题)
- 2025年广东中烟工业机电岗位笔试及答案
- 野生动物种源基地及繁育中心建设项目可行性实施报告
- M30注浆砂浆配合比计算资料
- 《现代汉语语法词类》PPT课件(完整版)
- 云南普通初中学生成长记录-基本素质发展初一-初三备课讲稿
评论
0/150
提交评论