读书:《Android系统源代码情景分析》- 简述从应用层执行硬件访问

原著作者:http://blog.csdn.net/column/details/androidluo.html 
 

- 访问硬件驱动程序的步骤:

1. 打开设备文件

2. 进行read/write操作

3. 关闭设备文件

- 硬件抽象层

硬件抽象层以模块形式管理各个硬件访问接口。

每个模块对应一个按一定规则命名的so

硬件抽象层最终还是通过上面的步骤来访问设备。

硬件抽象层由系统统一加载,调用者通过ID调用。

- 应用程序框架中的硬件访问服务

服务由Java语言实现

通过JNI调用HAL接口

硬件访问服务通常运行再System进程中

应用程序通过进程间通信访问这些服务 - Binder机制

硬件访问接口:服务提供方和调用方须遵循的统一接口

实例:

硬件访问服务:FregService

服务接口:IFregService

通过AIDL定义接口:frameworks/base/core/java/andrioid/os/IFregService.aidl

android.os.IInterface

本地实现:Stub extends Binder - Server

代理:Proxy - Client

FregService:扩展Stub,实现访问硬件对应的操作

这组操作通过调用JNI本地方法来实现:init, get, set

本地接口方法表:JNI函数到Java层方法的映射

HAL模块在init时加载

- 硬件访问服务的启动

1. 应用程序孵化进程Zygote在系统启动时启动

2. Zygote进程启动System进程

3. 硬件访问服务在System进程中运行

frameworks/base/services/java: com.android.server.SystemServer.java:

1. init1(): Zygoted调用此方法来初始化系统,启动一些本地服务 - SurfaceFlinger, AudioFlinger

2. 之后,回调init2()来启动Android的服务

3. init2()中启动一个系统线程SystemThread,其中向ServiceManager添加所有的Android服务,例如:

accountManager = new AccountManagerService(context);
ServiceManager.addService(Context.ACCOUNT_SERVICE, accountManager);



4. 最终,通过SystemManagerNative与SystemService进行进程间通信,从而完成服务的注册。

* 所谓服务的注册,实质上是在注册Binder

5. 关于服务启动的细节,需要对Binder机制和SystemService进行深入了解。


- 从应用程序调用硬件访问服务

IFregService fregService = IFregService.Stub.asInterface(ServiceManager.getService("freg"));
fregService.getVal();
…




你可能感兴趣的:(读书:《Android系统源代码情景分析》- 简述从应用层执行硬件访问)