写在前面的话:快两个月没看书了,颓!决定拿起学习,但害怕失掉坚持,所以写个博客让坚持看得见,也算一种督促吧!加油!
硬件抽象层在Android系统中的位置,以及它和其它层的关系:
- 内核驱动程序路径:kernel/common/drivers
三种访问设备寄存器的方法:
一是通过proc文件系统来访问,
二是通过传统的设备文件的方法来访问,
三是通过devfs文件系统来访问。
hello的Linux内核驱动程序中,创建三个不同的文件节点来供用户空间访问,分别是:
传统的设备文件/dev/hello、
proc系统文件/proc/hello、
devfs系统属性文件/sys/class/hello/hello/val
*.使用C语言编写的可执行程序来访问我们的Linux内核驱动程序
C语言执行程序路径:external/
- 在硬件抽象层中增加硬件模块来和内核驱动程序交互
硬件抽象层模块添加路径
.h文件:hardware/libhardware/include/hardware
.c文件:hardware/libhardware/modules
*.Hello Stub: failed to open /dev/hello -- Permission denied.
- 为Android硬件抽象层接口编写JNI方法
新建com_android_server_HelloService.cpp文件路径:frameworks/base/services/jni
修改同目录下的onload.cpp文件,首先在namespace android增加register_android_server_HelloService函数声明
在JNI_onLoad增加register_android_server_HelloService函数调用
- 在Android系统的Application Frameworks层提供Java接口的硬件服务
定义好通信接口:进入到frameworks/base/core/java/android/os目录,新增IHelloService.aidl接口定义文件
进入到frameworks/base/services/java/com/android/server目录,新增HelloService.java文件
修改同目录的SystemServer.java文件,在ServerThread::run函数中增加加载HelloService的代码
- 通过ServiceManager接口获取指定的服务,然后通过这个服务来获得硬件服务
helloService = IHelloService.Stub.asInterface( ServiceManager.getService("hello"));