原著作者: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(); …