第1篇 基础知识篇 1
第1章 Android驱动开发基础 1
1.1 认识什么是驱动 1
1.1.1 驱动程序的作用 1
1.1.2 PC中的驱动 2
1.1.3 手机中的驱动程序 2
1.2 开源还是不开源 2
1.2.1 雾里看花的开源 3
1.2.2 从为什么选择Java谈为什么不开源驱动程序 3
1.2.3 对驱动开发者来说是一把双刃剑 4
1.3 Linux开发基础 4
1.3.1 Linux历史简介 4
1.3.2 主要版本 5
1.3.3 Linux的巨大前景 5
1.4 Android和Linux的关系 6
1.4.1 Android继承于Linux 6
1.4.2 Android和Linux内核的区别 6
1.5 简析Linux内核 8
1.5.1 Linux内核的体系结构 8
1.5.2 和Android密切相关的Linux内核知识 10
1.6 分析Linux内核源码 14
1.6.1 源码目录结构 14
1.6.2 浏览源码的工具 16
1.6.3 Linux内核的显著特性 18
1.6.4 学习Linux内核的方法 24
第2章 获取并编译Android源码 29
2.1 获取Android源码 29
2.1.1 在Linux系统获取Android源码 29
2.1.2 在Windows平台获取Android源码 30
2.2 分析Android源码结构 36
2.3 编译Android源码 37
2.3.1 搭建编译环境 38
2.3.2 开始编译 39
2.3.3 在模拟器中运行 40
2.3.4 常见的错误分析 40
2.3.5 实践演练——演示两种编译Android程序的方法 41
2.4 编译Android Kernel 44
2.4.1 获取Goldfish内核代码 45
2.4.2 获取MSM内核代码 47
2.4.3 获取OMAP内核代码 47
2.4.4 编译Android的Linux内核 48
第3章 Android驱动移植基础 50
3.1 驱动开发需要做的工作 50
3.2 Android移植基础 52
3.2.1 移植的任务 52
3.2.2 需要移植的内容 53
3.2.3 驱动开发需要做的工作 54
3.3 Android对Linux的改造 55
3.3.1 Android的独有驱动 55
3.3.2 Android的核心驱动 55
3.3.3 Android对Linux内核文件的改动 57
3.3.4 为Android构建Linux的操作系统 58
3.4 内核空间和用户空间之间接口 59
3.4.1 内核空间和用户空间的相互作用 59
3.4.2 系统和硬件之间的交互 59
3.4.3 使用Relay实现内核到用户空间的数据传输 61
3.5 三类驱动程序 65
3.5.1 字符设备驱动 65
3.5.2 块设备驱动 72
3.5.3 网络设备驱动 75
第4章 分析三大内核系统 77
4.1 Goldfish内核和驱动解析 77
4.1.1 Goldfish基础 78
4.1.2 Android专用驱动简介 79
4.1.3 Ashmem驱动介绍 82
4.1.4 Pmem驱动介绍 82
4.1.5 Alarm驱动程序 83
4.1.6 USB Gadget驱动程序 83
4.1.7 Paranoid驱动介绍 84
4.1.8 Goldfish的设备驱动 85
4.2 MSM内核和驱动解析 87
4.2.1 MSM基础 87
4.2.2 移植MSM内核简介 90
4.2.3 移植MSM 91
4.3 OMAP内核和驱动解析 98
4.3.1 OMAP基础 98
4.3.2 OMAP内核 100
4.3.3 移植OMAP体系结构 101
4.3.4 移植Android专用驱动和组件 108
4.3.5 OMAP的设备驱动 109
第2篇 专用驱动篇 114
第5章 分析JNI 114
5.1 JNI的本质 114
5.2 分析Java层 116
5.2.1 加载JNI库 116
5.2.2 实现扫描工作 118
5.2.3 读取并保存信息 119
5.2.4 删除不是SD卡中的文件信息 121
5.2.5 processDirectory 121
5.2.6 扫描函数scanFile() 122
5.2.7 JNI中的异常处理 122
5.3 分析JNI层 123
5.3.1 将Native对象的指针保存到Java对象 123
5.3.2 创建Native层的MediaScanner对象 124
5.4 Native(本地)层 124
5.4.1 注册JNI函数 124
5.4.2 完成注册工作 126
5.4.3 动态注册 128
5.4.4 处理路径参数 130
5.4.5 扫描文件 130
5.4.6 添加TAG信息 131
5.4.7 总结函数JNI_OnLoad()与函数JNI_OnUnload()的用途 131
5.4.8 Java与JNI基本数据类型转换 132
5.4.9 JNIEnv接口 133
5.4.10 JNI中的环境变量 135
5.5 Camera模块的JNI实例分析 135
5.5.1 Java层预览接口 135
5.5.2 注册预览的JNI函数 137
5.5.3 C/C++层的预览函数 140
5.6 开发自己的JNI程序 140
第6章 硬件设备驱动程序 143
6.1 初识HAL层 143
6.1.1 HAL层简介 144
6.1.2 HAL_legacy和HAL的对比 145
6.2 分析HAL层源码 145
6.2.1 分析HAL moudle 146
6.2.2 丈件hardware.h 146
6.2.3 文件hardware.c 148
6.3 分析硬件抽象层的加载过程 151
6.4 分析硬件访问服务 153
6.4.1 定义硬件访问服务接口 153
6.4.2 实现硬件访问服务 154
6.5 分析mokoid工程 155
6.5.1 直接调用service方法的实现代码 156
6.5.2 通过Manager调用service的实现代码 160
6.6 分析Sensor(传感器)在HAL层的实现 163
6.6.1 HAL层的Sensor代码 163
6.6.2 Sensor编程的流程 165
6.7 HAL和系统移植 166
6.7.1 移植各个Android部件的方式 166
6.7.2 辅助工作 166
第7章 Binder驱动程序 172
7.1 引出Binder机制 172
7.2 Binder机制概述 173
7.3 分析Binder驱动程序的数据结构 175
7.4 设备初始化 185
7.5 打开Binder设备文件 186
7.6 实现内存映射 188
7.6.1 分析流程 188
7.6.2 分析具体代码 188
7.7 释放物理页面 193
7.8 处理内核缓冲区 193
7.8.1 分配内核缓冲区函数 193
7.8.2 添加到红黑树 195
7.8.3 释放内核缓冲区 196
7.8.4 查询内核缓冲区 198
7.9 Binder封装库 198
7.9.1 类BBinder 199
7.9.2 类BpRefBase 202
7.9.3 类IPCThreadState 203
第8章 Logger日志驱动 207
8.1 Logger系统基础 207
8.2 分析Logger驱动程序 207
8.2.1 分析文件logger.h 208
8.2.2 分析文件logger.c 209
8.3 日志库liblog 223
8.4 分析日志写入接口 227
8.4.1 分析C/C++层的写入接口 228
8.4.2 分析Java层的写入接口 229
第9章 内存系统驱动 238
9.1 分析Android的进程通信机制 238
9.1.1 Android的进程间通信(IPC)机制Binder 238
9.1.2 Service Manager是Binder机制的上下文管理者 240
9.2 分析Ashmem驱动程序 241
9.2.1 基础数据结构 241
9.2.2 初始化处理 242
9.2.3 打开匿名共享内存设备文件 244
9.2.4 内存映射 246
9.2.5 读/写操作 247
9.2.6 锁定和解锁 249
9.2.7 回收内存块 254
9.3 分析C++访问接口层 255
9.3.1 接口MemoryBase 255
9.3.2 接口MemoryBase 264
9.4 分析Java访问接口层 267
第10章 分析电源管理模块 271
10.1 Android Power Management基础 271
10.2 Framework层分析 272
10.2.1 文件PowerManager.java 272
10.2.2 文件PowerManagerService.java 273
10.3 JNI层分析 294
10.3.1 文件android_os_Power.cpp 294
10.3.2 文件power.c 295
10.4 Kemel(内核)层分析 296
10.4.1 文件power.c 296
10.4.2 文件earlysuspend.c 298
10.4.3 文件wakelock.c 299
10.4.4 文件resume.c 301
10.4.5 文件suspend.c 301
10.4.6 文件main.c 302
10.4.7 proc文件 303
10.5 wakelock和early suspend 303
10.5.1 wake lock的原理 303
10.5.2 early_suspend的原理 304
10.5.3 Android休眠 305
10.5.4 Android唤醒 307
第11章 分析低内存管理模块 308
11.1 分析OOM机制 308
11.1.1 OOM机制基础 308
11.1.2 分析OOM机制的具体实现 309
11.2 分析Low Memory killer的原理和机制 315
11.3 分析Low Memory Killer驱动 316
11.3.1 Low Memory Killer驱动基础 316
11.3.2 分析核心功能 317
11.3.3 设置用户接口 320
第12章 分析物理内存驱动 323
12.1 PMEM基础 323
12.1.1 PMEM概述 323
12.1.2 Platform设备基础 324
12.1.3 PMEM与Ashmem的区别 325
12.2 分析PMEM系统驱动程序 325
12.2.1 分析设备实现 325
12.2.2 分析驱动的具体实现 327
12.2.3 总结PMEM驱动的调用流程 350
12.3 分析用户接口空间 350
12.3.1 释放位图内存 351
12.3.2 释放位图内存空间 351
12.3.3 获取位图占用内存 352
第13章 分析Time Device驱动 354
13.1 分析Timed Output驱动程序 354
13.1.1 设备类 354
13.1.2 分析Timed Output驱动的具体实现 359
13.1.3 实现timed_output_dev设备的读写操作 361
13.2 分析Timed Gpio驱动程序 362
13.2.1 Timed Gpio驱动的基本原理 363
13.2.2 分析Timed Gpio驱动的实现文件 363
第14章 分析调试机制驱动Ram Console 368
14.1 Ram Console基础 368
14.2 分析Ram Console的具体实现 369
14.2.1 分析文件ram console.h 369
14.2.2 分析文件ram console.c 369
第15章 分析时钟系统驱动Alarm 379
15.1 Alarm系统基础 379
15.1.1 Alarm层次结构介绍 379
15.1.2 需要移植的内容 381
15.2 分析RTC驱动程序 381
15.3 分析Alarm驱动程序 381
15.3.1 分析文件android_alarm.h 382
15.3.2 分析文件alarm.c 383
15.3.3 分析文件alarm-dev.c 394
15.4 分析JNI层 402
15.5 分析Java层 403
15.5.1 分析AlarmManagerService类 404
15.5.2 分析AlarmManager类 412
15.6 模拟器环境的具体实现 413
第16章 分析USB Gadget驱动 415
16.1 分析Linux内核的USB驱动程序 415
16.1.1 USB设备基础 415
16.1.2 分析USB和sysfs的联系 419
16.1.3 分析urb通信方式 422
16.1.4 分析USB驱动的例程 427
16.2 分析USB Gadget驱动 438
16.2.1 分析软件结构 438
16.2.2 层次整合 447
16.2.3 USB设备枚举 457
第3篇 设备驱动篇 473
第17章 FrameBuffer显示系统驱动 473
17.1 显示系统介绍 473
17.2 分析内核层 474
17.2.1 分析接口文件fb.h 474
17.2.2 分析内核实现文件fbmem.c 477
17.3 分析硬件抽象层 499
17.3.1 分析头文件 500
17.3.2 分析硬件帧缓冲区 501
17.3.3 实现缓冲区的分配 503
17.3.4 显示缓冲映射 504
17.3.5 分析管理库文件LayerBuffer.cpp 505
第18章 输入系统驱动应用 507
18.1 输入系统介绍 507
18.1.1 Android输入系统结构元素介绍 507
18.1.2 移植工作 509
18.2 分析Input(输入)系统驱动 509
18.2.1 分析头文件 510
18.2.2 分析核心文件input.c 513
18.2.3 分析event机制 527
18.3 分析硬件抽象层 530
18.3.1 分析文件KeycodeLabels.h 530
18.3.2 分析文件KeyCharacterMap.h 534
18.3.3 分析Kl格式文件 535
18.3.4 分析KCM格式文件 536
18.3.5 分析文件EventHub.cpp 536
第19章 音频系统驱动 541
19.1 音频系统基础 541
19.2 分析音频系统的层次 542
19.2.1 层次说明 543
19.2.2 Media库中的Audio框架 543
19.2.3 本地代码 545
19.2.4 分析JNI代码 548
19.2.5 Java层代码简介 549
19.3 移植Audio系统的工作 549
19.3.1 我们的工作 549
19.3.2 分析硬件抽象层 550
19.3.3 分析AudioFlinger中的Audio硬件抽象层的实现 551
19.3.4 真正实现Audio硬件抽象层 556
19.4 在MSM平台实现Audio驱动系统 557
19.4.1 实现Audio驱动程序 557
19.4.2 实现硬件抽象层 558
第20章 视频输出系统驱动 562
20.1 视频输出系统结构 562
20.2 需要移植的部分 564
20.3 分析硬件抽象层 564
20.3.1 Overlay系统硬件抽象层的接口 564
20.3.2 实现Overlay系统的硬件抽象层 566
20.3.3 实现接口 567
20.4 实现Overlay硬件抽象层 568
第21章 振动器系统驱动 571
21.1 振动器系统结构 571
21.2 分析硬件抽象层 572
21.3 分析JNI层部分 574
21.4 分析Java层部分 575
21.5 实现移植工作 578
21.5.1 移植振动器驱动程序 578
21.5.2 实现硬件抽象层 579
21.6 在MSM平台实现振动器驱动 580
第22章 传感器系统驱动 583
22.1 传感器系统的结构 583
22.2 分析需要移植的内容 585
22.2.1 移植驱动程序 585
22.2.2 移植硬件抽象层 586
22.2.3 实现上层部分 587
22.3 在模拟器中实现传感器驱动 591
第23章 照相机系统 596
23.1 Camera系统的结构 596
23.2 分析需要移植的内容 598
23.3 移植和调试 599
23.3.1 V4L2驱动程序 599
23.3.2 硬件抽象层 605
23.4 实现Camera系统的硬件抽象层 609
23.4.1 Java程序部分 609
23.4.2 Camera的Java本地调用部分 610
23.4.3 Camera的本地库libui.so 610
23.4.4 Camera服务libcameraservice.so 611
第24章 Wi-Fi系统、蓝牙系统和GPS系统 616
24.1 Wi-Fi系统 616
24.1.1 Wi-Fi系统的结构 616
24.1.2 分析需要移植的内容 618
24.1.3 分析本地实现 618
24.1.4 分析JNI层 621
24.1.5 分析Java FrameWork层 623
24.1.6 分析Setting中的Wi-Fi设置 624
24.2 蓝牙系统 625
24.2.1 蓝牙系统的结构 625
24.2.2 分析需要移植的内容 627
24.2.3 分析驱动程序 628
24.2.4 分析本地代码 628
24.2.5 在MSM平台实现蓝牙驱动系统 630
24.3 定位系统 631
24.3.1 分析定位系统的结构 631
24.3.2 分析需要移植的内容 633
24.3.3 分析驱动程序 633
24.3.4 分析硬件抽象层 633
24.3.5 分析上层应用部分 635