读书:《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系统源代码情景分析光盘资料 目录 第1篇初识Android系统 第1章 准备知识................................................................ 2 1.1 Linux内核参考书籍.................................................. 2 1.2 Android应用程序参考书籍....................................... 3 1.3 下载、编译和运行Android源代码........................... 3 1.3.1 下载Android源代码........................................... 4 1.3.2 编译Android源代码........................................... 4 1.3.3 运行Android模拟器........................................... 5 1.4 下载、编译和运行Android内核源代码............................................................ 6 1.4.1 下载Android内核源代码................................... 6 1.4.2 编译Android内核源代码................................... 7 1.4.3 运行Android模拟器........................................... 8 1.5 开发第一个Android应用程序................................... 8 1.6 单独编译和打包Android应用程序模块.......................................................... 11 1.6.1 导入单独编译模块的mmm命令............................................................... 11 1.6.2 单独编译Android应用程序模块............................................................... 12 1.6.3 重新打包Android系统镜像文件............................................................... 12 第2章 硬件抽象层....................................................... 13 2.1 开发Android硬件驱动程序..................................... 14 2.1.1 实现内核驱动程序模块.................................. 14 2.1.2 修改内核Kconfig文件...................................... 21 2.1.3 修改内核Makefile文件..................................... 22 2.1.4 编译内核驱动程序模块.................................. 22 2.1.5 验证内核驱动程序模块.................................. 23 2.2 开发C可执行程序验证Android硬件驱动程序............................................... 24 2.3 开发Android硬件抽象层模块................................. 26 2.3.1 硬件抽象层模块编写规范............................... 26 2.3.2 编写硬件抽象层模块接口............................... 29 2.3.3 硬件抽象层模块的加载过程........................... 33 2.3.4 处理硬件设备访问权限问题........................... 36 2.4 开发Android硬件访问服务..................................... 38 2.4.1 定义硬件访问服务接口.................................. 38 2.4.2 实现硬件访问服务.......................................... 39 2.4.3 实现硬件访问服务的JNI方法.......................... 40 2.4.4 启动硬件访问服务.......................................... 43 2.5 开发Android应用程序来使用硬件访问服务.................................................. 44 第3章 智能指针............................................................... 49 3.1 轻量级指针............................................................. 50 3.1.1 实现原理分析................................................ 50 3.1.2 应用实例分析................................................ 53 3.2 强指针和弱指针..................................................... 54 3.2.1 强指针的实现原理分析.................................. 55 3.2.2 弱指针的实现原理分析.................................. 61 3.2.3 应用实例分析................................................ 67 第2篇Android专用驱动系统 第4章 Logger日志系统............................................. 74 4.1 Logger日志格式....................................................... 75 4.2 Logger日志驱动程序.............................................. 76 4.2.1 基础数据结构................................................ 77 4.2.2 日志设备的初始化过程.................................. 78 4.2.3 日志设备文件的打开过程............................... 83 4.2.4 日志记录的读取过程...................................... 84 4.2.5 日志记录的写入过程...................................... 88 4.3 运行时库层日志库................................................. 93 4.4 C/C++日志写入接口............................................. 100 4.5 Java日志写入接口................................................ 104 4.6 Logcat工具分析..................................................... 110 4.6.1 基础数据结构.............................................. 111 4.6.2 初始化过程.................................................. 115 4.6.3 日志记录的读取过程.................................... 127 4.6.4 日志记录的输出过程.................................... 132 第5章 Binder进程间通信系统............................... 144 5.1 Binder驱动程序..................................................... 145 5.1.1 基础数据结构.............................................. 146 5.1.2 Binder设备的初始化过程.............................. 164 5.1.3 Binder设备文件的打开过程.......................... 165 5.1.4 Binder设备文件的内存映射过程............................................................ 166 5.1.5 内核缓冲区管理........................................... 173 5.2 Binder进程间通信库............................................. 183 5.3 Binder进程间通信应用实例................................. 188 5.4 Binder对象引用计数技术..................................... 196 5.4.1 Binder本地对象的生命周期.......................... 197 5.4.2 Binder实体对象的生命周期.......................... 201 5.4.3 Binder引用对象的生命周期.......................... 204 5.4.4 Binder代理对象的生命周期.......................... 209 5.5 Binder对象死亡通知机制..................................... 212 5.5.1 注册死亡接收通知........................................ 213 5.5.2 发送死亡接收通知........................................ 216 5.5.3 注销死亡接收通知........................................ 221 5.6 Service Manager的启动过程.................................. 224 5.6.1 打开和映射Binder设备文件.......................... 226 5.6.2 注册为Binder上下文管理者.......................... 227 5.6.3 循环等待Client进程请求............................... 231 5.7 Service Manager代理对象的获取过程........................................................... 238 5.8 Service组件的启动过程........................................ 244 5.8.1 注册Service组件............................................ 245 5.8.2 启动Binder线程池......................................... 289 5.9 Service代理对象的获取过程................................ 291 5.10 Binder进程间通信机制的Java接口............................................................. 300 5.10.1 Service Manager的Java代理对象的获取过程.......................................... 300 5.10.2 Java服务接口的定义和解析.................................................................. 310 5.10.3 Java服务的启动过程.................................... 313 5.10.4 Java服务代理对象的获取过程.............................................................. 320 5.10.5 Java服务的调用过程.................................... 323 第6章 Ashmem匿名共享内存系统.............................................................. 327 6.1 Ashmem驱动程序................................................. 328 6.1.1 基础数据结构.............................................. 328 6.1.2 匿名共享内存设备的初始化过程........................................................... 330 6.1.3 匿名共享内存设备文件的打开过程....................................................... 332 6.1.4 匿名共享内存设备文件的内存映射过程................................................ 334 6.1.5 匿名共享内存块的锁定和解锁过程....................................................... 336 6.1.6 匿名共享内存块的回收过程.................................................................. 344 6.2 运行时库cutils的匿名共享内存访问接口.................................................... 345 6.3 匿名共享内存的C++访问接口............................. 349 6.3.1 MemoryHeapBase......................................... 349 6.3.2 MemoryBase................................................. 359 6.3.3 应用实例..................................................... 364 6.4 匿名共享内存的Java访问接口............................. 370 6.4.1 MemoryFile.................................................. 370 6.4.2 应用实例..................................................... 375 6.5 匿名共享内存的共享原理.................................... 386 第3篇Android应用程序框架 第7章 Activity组件的启动过程............................. 392 7.1 Activity组件应用实例............................................ 392 7.2 根Activity组件的启动过程.................................... 398 7.3 子Activity组件在进程内的启动过程............................................................ 432 7.4 子Activity组件在新进程中的启动过程........................................................ 440 第8章 Service组件的启动过程............................ 443 8.1 Service组件应用实例............................................. 443 8.2 Service组件在新进程中的启动过程............................................................. 451 8.3 Service组件在进程内的绑定过程................................................................. 463 第9章 Android系统广播机制................................. 486 9.1 广播机制应用实例............................................... 487 9.2 广播接收者的注册过程........................................ 493 9.3 广播的发送过程................................................... 501 第10章 Content Provider组件的实现原理................................................. 524 10.1 Content Provider组件应用实例........................... 525 10.1.1 ArticlesProvider........................................... 525 10.1.2 Article......................................................... 535 10.2 Content Provider组件的启动过程................................................................ 550 10.3 Content Provider组件的数据共享原理........................................................ 573 10.3.1 数据共享模型............................................. 573 10.3.2 数据传输过程............................................. 576 10.4 Content Provider组件的数据更新通知机制................................................ 596 10.4.1 注册内容观察者.......................................... 597 10.4.2 发送数据更新通知...................................... 603 第11章 Zygote和System进程的启动过程................................................. 611 11.1 Zygote进程的启动脚本........................................ 611 11.2 Zygote进程的启动过程........................................ 614 11.3 System进程的启动过程....................................... 622 第12章 Android应用程序进程的启动过程................................................. 630 12.1 应用程序进程的创建过程.................................. 630 12.2 Binder线程池的启动过程................................... 639 12.3 消息循环的创建过程.......................................... 641 第13章 Android应用程序的消息处理机制................................................. 645 13.1 创建线程消息队列............................................. 645 13.2 线程消息循环过程............................................. 650 13.3 线程消息发送过程............................................. 655 13.4 线程消息处理过程............................................. 660 第14章 Android应用程序的键盘消息处理机制....................................... 667 14.1 键盘消息处理模型............................................. 667 14.2 InputManager的启动过程.................................... 670 14.2.1 创建InputManager...................................... 670 14.2.2 启动InputManager...................................... 673 14.2.3 启动InputDispatcher.................................... 675 14.2.4 启动InputReader........................................ 677 14.3 InputChannel的注册过程..................................... 688 14.3.1 创建InputChannel....................................... 689 14.3.2 注册Server端InputChannel........................... 697 14.3.3 注册系统当前激活的应用程序窗口..................................................... 701 14.3.4 注册Client端InputChannel........................... 706 14.4 键盘消息的分发过程.......................................... 709 14.4.1 InputReader获得键盘事件........................... 710 14.4.2 InputDispatcher分发键盘事件............................................................... 717 14.4.3 系统当前激活的应用程序窗口获得键盘消息....................................... 727 14.4.4 InputDispatcher获得键盘事件处理完成通知......................................... 743 14.5 InputChannel的注销过程..................................... 746 14.5.1 销毁应用程序窗口...................................... 747 14.5.2 注销Client端InputChannel........................... 756 14.5.3 注销Server端InputChannel........................... 758 第15章 Android应用程序线程的消息循环模型....................................... 764 15.1 应用程序主线程消息循环模型.......................... 765 15.2 与界面无关的应用程序子线程消息循环模型.......................................... 766 15.3 与界面相关的应用程序子线程消息循环模型.......................................... 769 第16章 Android应用程序的安装和显示过程............................................ 778 16.1 应用程序的安装过程......................................... 778 16.2 应用程序的显示过程.......................................... 814
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值