一、我们编写的内核驱动模块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等函数,并实现该函数的操作