Android HAL实例解析Word格式文档下载.docx

上传人:b****2 文档编号:5085198 上传时间:2023-05-04 格式:DOCX 页数:20 大小:937.30KB
下载 相关 举报
Android HAL实例解析Word格式文档下载.docx_第1页
第1页 / 共20页
Android HAL实例解析Word格式文档下载.docx_第2页
第2页 / 共20页
Android HAL实例解析Word格式文档下载.docx_第3页
第3页 / 共20页
Android HAL实例解析Word格式文档下载.docx_第4页
第4页 / 共20页
Android HAL实例解析Word格式文档下载.docx_第5页
第5页 / 共20页
Android HAL实例解析Word格式文档下载.docx_第6页
第6页 / 共20页
Android HAL实例解析Word格式文档下载.docx_第7页
第7页 / 共20页
Android HAL实例解析Word格式文档下载.docx_第8页
第8页 / 共20页
Android HAL实例解析Word格式文档下载.docx_第9页
第9页 / 共20页
Android HAL实例解析Word格式文档下载.docx_第10页
第10页 / 共20页
Android HAL实例解析Word格式文档下载.docx_第11页
第11页 / 共20页
Android HAL实例解析Word格式文档下载.docx_第12页
第12页 / 共20页
Android HAL实例解析Word格式文档下载.docx_第13页
第13页 / 共20页
Android HAL实例解析Word格式文档下载.docx_第14页
第14页 / 共20页
Android HAL实例解析Word格式文档下载.docx_第15页
第15页 / 共20页
Android HAL实例解析Word格式文档下载.docx_第16页
第16页 / 共20页
Android HAL实例解析Word格式文档下载.docx_第17页
第17页 / 共20页
Android HAL实例解析Word格式文档下载.docx_第18页
第18页 / 共20页
Android HAL实例解析Word格式文档下载.docx_第19页
第19页 / 共20页
Android HAL实例解析Word格式文档下载.docx_第20页
第20页 / 共20页
亲,该文档总共20页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

Android HAL实例解析Word格式文档下载.docx

《Android HAL实例解析Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《Android HAL实例解析Word格式文档下载.docx(20页珍藏版)》请在冰点文库上搜索。

Android HAL实例解析Word格式文档下载.docx

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部份)以directcall使用HALmodule。

通过直接函数调用的方式,来操作驱动程序。

当然,应用程序也可以不需要通过JNI的方式进行,直接加载*.so(dlopen)的做法调用*.so里的符号(symbol)也是一种方式。

总而言之是没有经过封装,上层可以直接操作硬件。

现在的libhardware架构,就有stub的味道了。

HALstub是一种代理人(proxy)的概念,stub虽然仍是以*.so檔的形式存在,但HAL已经将*.so档隐藏起来了。

Stub向HAL提供操作函数(operations),而runtime则是向HAL取得特定模块(stub)的operations,再callback这些操作函数。

这种以indirectcall的架构,让HALstub变成是一种包含关系,即HAL里包含了许许多多的stub(代理人)。

Runtime只要说明类型,即moduleID,就可以取得操作函数。

对于目前的HAL,可以认为Android定义了HAL层结构框架,通过几个接口访问硬件从而统一了调用方式。

下面结合实例来分析HAL编程方法。

四、mokoid工程代码下载与结构分析

1、mokid项目概述

modkoid工程提供了一个LedTest示例程序,是台湾的Jollen用于培训的。

对于理解android层次结构、Hal编程方法都非常有意义。

2、下载方法

#svncheckout

3、结构分析

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/works/base/service/jni/com_mokoid_server_LedService.cpp

(3)service(属于work层)

(4)APP测试程序(属于APP层)

apps/LedClient/src/com/mokoid/LedClient/LedClient.java

5、第二种方法:

经过Manager调用service

HAL、JNI两层和第一种方法一样,所以后面只分析其他的层次。

(1)Manager(属于work层)

APP通过这个Manager和service通讯。

mokoid-read-only/works/base/core/java/mokoid/hardware/LedManager.java

因为LedService和LedManager在不同的进程,所以要考虑到进程通讯的问题。

Manager通过增加一个aidl文件来描述通讯接口

mokoid-read-only/works/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.mk

LOCAL_MODULES_TAGS:

=user

而我们的s5pc100系统在配置时tapas时选择的是eng,所以没有装载到目标系统。

所以修改LedTest和LedClient的Android.mk

=usereng

再次编译即可自动装载到目标系统/system/app/目录下。

2、启动后没有图标,找不到应用程序

目标系统启动后找不到两个应用程序的图标。

仔细阅读logcat输出的信息发现:

E/PackageManager(2717):

Packagecom.mokoid.LedClientrequiresunavailablesharedlibrarycom.mokoid.server;

failing!

原因是找不到com.mokoid.server。

检查mokoid-read-only/works/base/Android.mk发现系统将LedManager和LedService编译成mokoid.jar库文件。

为了让应用程序可以访问到这个库,需要通过com.mokoid.server.xml来设定其对应关系。

解决方法:

拷贝com.mokoid.server.xml到目标系统的system/etc/permissions/目录下。

此时两个应用的程序的图标都正常出现了。

3、提示找不到JNI_

按照以前的实验加入下列代码:

4、需要针对你的目标平台修改HAL的Makefile

修改mokoid-read-only/hardware/modules/led/Android.mk

LOCAL_MODULE:

=led.default

5、在eclipse中编译不了LedSystemServer.java

原因是程序中要用到ServiceManager.addService,这需要系统权限。

解决方法可以把应用程序放入Android源码中编译,并确保以下两点:

(1)在应用程序的AndroidManifest.xml中的manifest节点中加入android:

sharedUserId="

android.uid.system"

这个属性。

(2)修改Android加入LOCAL_CERTIFICATE:

=platform.

当然:

mokoid工程源码中已经做了这些。

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2