终于调通了从上到下,从驱动到应用,android

来源:互联网 发布:js在线解密 编辑:程序博客网 时间:2024/05/16 10:13


先上图,再次感谢罗升阳的博客,然后还有下面这个地址,貌似是一个在线的罗升阳的书,我还是买了罗升阳的书,把里面的源码拷了出来,在这个帮助下,重现了罗升阳的实验。

http://book.2cto.com/201210/6727.html

ps:用的罗升阳的书带的源码,之前一直出现错误,发现报错是在systemservices.java那,后来比着书复制的,就搞定了。。。



logcat之后,看到的log。

总结一下整个过程:

首先是驱动程序的编写,编写按照格式编写之后,验证了驱动程序freg所提供的proc和devfs文件系统访问接口是正确的,我们还需要进一步验证它所提供的dev文件系统访问接口也是正确的,即能正常读写设备文件/dev/freg的内容。由于设备文件/dev/freg的内容是二进制格式的,因此,使用cat和echo命令来读写它的内容不够直观,编写一个C可执行程序来直观地验证它的dev文件系统访问接口的正确性。

其实在Android源代码工程环境中,不仅可以用C/C++语言来开发可执行程序,还可以开发动态链接库,即so文件。使用adb工具命令连接上Android模拟器之后,进入到/system/bin或者/system/lib目录中,就可以看到很多可执行程序或者动态链接库文件。使用编译和打包后得到的system.img文件启动Android模拟器,然后使用adb工具连接上它,并且进入到/system/bin目录中,执行里面的freg文件来验证驱动程序freg的dev文件系统访问接口的正确性。
Android系统的硬件抽象层以模块的形式来管理各个硬件访问接口。每一个硬件模块都对应有一个动态链接库文件,这些动态链接库文件的命令需要符合一定的规范。同时,在系统内部,每一个硬件抽象层模块都使用结构体hw_module_t来描述,而硬件设备则使用结构体hw_device_t来描述。我们将硬件抽象层模块freg对应的文件名称定义为freg.default,编译成功后,系统就会自动在后面加后缀.so,于是就得到了一个freg.default.so文件。根据硬件抽象层模块文件的命名规范,当我们要加载硬件抽象层模块freg时,只需要指定它的ID值,即“freg”,系统就会根据一定的规则成功地找到要加载的freg.default.so文件。

开发好硬件抽象层模块之后,我们通常还需要在应用程序框架层中实现一个硬件访问服务。硬件访问服务通过硬件抽象层模块来为应用程序提供硬件读写操作。由于硬件抽象层模块是使用C++语言开发的,而应用程序框架层中的硬件访问服务是使用Java语言开发的,因此,硬件访问服务必须通过Java本地接口(Java Native Interface,JNI)来调用硬件抽象层模块的接口。

Android系统的硬件访问服务通常运行在系统进程System5中,而使用这些硬件访问服务的应用程序运行在另外的进程中,即应用程序需要通过进程间通信机制来访问这些硬件访问服务。Android系统提供了一种高效的进程间通信机制——Binder进程间通信机制6,应用程序就是通过它来访问运行在系统进程System中的硬件访问服务的。Binder进程间通信机制要求提供服务的一方必须实现一个具有跨进程访问能力的服务接口,以便使用服务的一方可以通过这个服务接口来访问它。因此,在实现硬件访问服务之前,我们首先要定义它的服务接口。

在本节接下来的内容中,我们将为在2.1小节中介绍的虚拟硬件设备freg开发一个硬件访问服务FregService,它所实现的硬件访问服务接口为IFregService。首先介绍硬件访问服务接口IFregService的定义,然后介绍硬件访问服务FregService的实现,包括它的内部实现以及调用硬件抽象层模块的JNI实现,最后介绍如何在系统进程System中启动硬件访问服务FregService。

我们就将硬件访问服务FregService从IFregService.Stub类继承下来,并且实现IFregService接口的成员函数setVal和getVal。在2.5小节中,我们再介绍如何在应用程序中获得硬件访问服务FregService的一个Binder代理对象接口,即IFregService.Stub.Proxy接口。

硬件访问服务FregService继承了IFregService.Stub类,并且实现了IFregService接口的成员函数setVal和getVal。

编译后得到的libandroid_servers.so文件就包含有init_native、setVal_native和getVal_native这三个JNI方法了。

系统进程System在启动时,会创建一个ServerThread线程来启动系统中的关键服务,其中就包括一些硬件访问服务。在ServerThread类的成员函数run中,首先创建一个FregService实例,然后把它注册到Service Manager中。Service Manager是Android系统的Binder进程间通信机制的一个重要角色,它负责管理系统中的服务对象。注册到Service Manager中的服务对象都有一个对应的名称,使用这些服务的Client进程就是通过这些名称来向Service Manager请求它们的Binder代理对象接口的,以便可以访问它们所提供的服务。硬件访问服务FregService注册到Service Manager之后,它的启动过程就完成了。

在Android应用程序框架层开发硬件访问服务的目的是为了让上层的Android应用程序能够访问对应的硬件设备。在本节中,我们将在Android源代码工程环境中开发一个应用程序Freg,它通过硬件访问服务FregService来访问虚拟硬件设备freg的寄存器val的值。

   一. 在Android内核源代码工程中编写硬件驱动程序。


     二. 在Android系统中增加C可执行程序来访问硬件驱动程序。


     三. 在Android硬件抽象层增加接口模块访问硬件驱动程序。


     四. 在Android系统中编写JNI方法在应用程序框架层提供Java接口访问硬件。


     五. 在Android系统的应用程序框架层增加硬件服务接口。


     六. 在Android系统中编写APP通过应用程序框架层访问硬件服务。


1 0