现在的位置: 首页 > 综合 > 正文

android内核字符驱动设备实战之———-总结篇

2018年06月10日 ⁄ 综合 ⁄ 共 2632字 ⁄ 字号 评论关闭

一、我们编写的内核驱动模块testdev.o,通过内核编译后,被编译打包进kernel/goldfish/arch/arm/boot/zImage中

二、android系统编译输出目录out/target/product/generic说明

内含三个主要目录:

root:打包成 ramdisk.img镜像文件,安装到实际系统后,是系统的根目录root

data:打包成userdata.img镜像文件,安装到实际系统后,是根目录下的data目录:root/data

system:打包成system.img镜像文件,安装到实际系统后,是根目录下的system目录:root/system

android系统根目录下文件目录说明:

mnt:挂载点目录

etc:系统主要配置文件

sys:Linux内核文件

proc:运行时文件

init.rc:启动脚本

default.prop:系统属性配置文件

data:用户程序目录

dev:设备文件

system:android系统文件

三、system系统目录文件夹说明:

app:这个里面主要存放的是常规下载的应用程序,可以看到都是以APK格式结尾的文件。在这个文件夹下的程序为系统默认的组件,自己安装的软件将不会出现在这里,而是\data\文件夹中,我们编写的系统级应用程序:TestDev.apk测试程序就在这里。

bin:系统工具,比如 ps/cp/pm 等,系统的本地程序,一般是C语言的,我们编写的系统级的C语言测试程序test这里。

etc:系统的配置文件,比如APN接入点设置等核心配置等。

fonts:系统字体目录。

media:媒体文件目录

build.prop :Android 系统属性配置文件

tts:

usr:用户文件夹,包含共享、键盘布局、时间区域文件

vendor:厂商定制目录

xbin:常用开发工具,比如 tcpdump/sqlite3 等

lib:系统底层库,如平台运行时库等,我们编写的HAL层的库test.default.so,在system/lib/hw目录中;我们添加了JNI内容的运行库层库的libandroid_servers.so就在这里

framework:系统API,从后缀名为jar可以看出是系统平台框架,应用框架层,我们添加了内容的services.jar包就在这里

\system\framework\am.jar
\system\framework\android.awt.jar AWT库
\system\framework\android.policy.jar
\system\framework\android.test.runner.jar
\system\framework\com.google.android.gtalkservice.jar GTalk服务
\system\framework\com.google.android.maps.jar 电子地图库
\system\framework\core.jar 核心库,启动桌面时首先加载这个
\system\framework\ext.jar
\system\framework\framework-tests.jar
\system\framework\framework.jar
\system\framework\input.jar 输入库
\system\framework\itr.jar
\system\framework\monkey.jar
\system\framework\pm.jar 包管理库
\system\framework\services.jar
\system\framework\ssltest.jar
\system\framework\svc.jar 系统服务

四、架构、目录、测试程序对应关系:

应用层-----------app-------------TestDev.apk

应用框架层-----framework---包含了设备服务的services.jar

应用框架层JNI库-----lib---------------添加了设备JNI内容的库的libandroid_servers.so

硬件抽象层-----lib/hw----------HAL层的库test.default.so

内核层------内核驱动模块testdev.o被编译打包进kernel/goldfish/arch/arm/boot/zImage中

注:没有运行库层,通过应用框架层JNI库直接调用HAL的库

五、实现流程

1、应用层程序TestDev.apk,通过服务管理器获取test服务(ServiceManager.getService("test")),然后通过服务获取它提供的接口ITestService,通过接口可以调用应用框架层接口函数:getVal、setVal;

2、应用框架层services.jar:

  声明其要调用的jni函数:native
init_native();    
native  setVal_native(int val);  native
getVal_native(); 

  加载包含设备jni的库libandroid_servers.so:由系统自动加载,我们编写的设备jni方法通过方法表已向系统注册

  调用native函数:进而调用运行库层jni对应的方法test_init、test_setVal、test_getVal

3、应用框架层JNI库libandroid_servers.so:

  根据硬件抽象层的设备模块ID(TEST_HARDWARE_MODULE_ID),用hw_get_module,获取硬件抽象层的设备模块,进而获取HAL设备test_device_t

  本层的函数test_init、test_setVal、test_getVal,通过这个设备,调用硬件抽象层的函数:test_device->set_val、get_val

4、硬件抽象层test.default.so:

 硬件抽象层的test_device_t,调用内核系统函数open,打开设备,dev->fd = open(“/dev/testdev”, O_RDWR)

 调用系统内核函数  read(dev->fd)、write(dev->fd),实现读写

5、内核驱动层直接打包进zImage

  根据linux驱动编写标准,向系统提供read、write等函数,并实现该函数的操作

抱歉!评论已关闭.