第1篇 基础知识篇 2
第1章 Android底层开发基础 2
1.1 Android系统介绍 2
1.2 Android系统架构介绍 2
1.2.1 底层操作系统层(OS) 3
1.2.2 各种库(Libraries)和Android运行环境(RunTime) 3
1.2.3 应用程序框架(Application Framework) 4
1.2.4 顶层应用程序(Application) 4
1.3 获取Android源码 5
1.3.1 在Linux系统中获取Android源码 5
1.3.2 在Windows平台上获取Android源码 7
1.4 分析Android源码结构 9
1.4.1 总体结构 10
1.4.2 应用程序部分 11
1.4.3 应用程序框架部分 13
1.4.4 系统服务部分 13
1.4.5 系统程序库部分 15
1.4.6 系统运行库部分 18
1.4.7 硬件抽象层部分 19
1.5 编译源码 20
1.5.1 搭建编译环境 20
1.5.2 在模拟器中运行 22
1.5.3 编译源码生成SDK 23
第2章 Android驱动开发基础 28
2.1 驱动程序基础 28
2.1.1 什么是驱动程序 28
2.1.2 驱动开发需要做的工作 29
2.2 Linux开发基础 30
2.2.1 Linux简介 30
2.2.2 Linux的发展趋势 31
2.2.3 Android基于Linux系统 31
2.2.4 Android和Linux内核的区别 32
2.2.5 Android独有的驱动 34
2.2.6 为Android构建Linux的操作系统 35
2.3 Linux内核结构 35
2.3.1 Linux内核的体系结构 35
2.3.2 和Android驱动开发相关的内核知识 37
2.4 分析Linux内核源码 40
2.4.1 源码目录结构 40
2.4.2 浏览源码的工具 42
2.4.3 GCC特性 43
2.4.4 链表的重要性 46
2.4.5 Kconfig和Makefile 48
2.5 学习Linux内核的方法 50
2.5.1 分析USB子系统的代码 50
2.5.2 分析USB系统的初始化代码 50
2.6 Linux中的3类驱动程序 54
2.6.1 字符设备驱动 54
2.6.2 块设备驱动 61
2.6.3 网络设备驱动 65
2.7 Android系统移植基础 65
2.7.1 移植的任务 65
2.7.2 需要移植的内容 66
2.7.3 驱动开发需要做的工作 67
2.8 内核空间和用户空间之间的接口 67
2.8.1 内核空间和用户空间的相互作用 67
2.8.2 实现系统和硬件之间的交互 67
2.8.3 从内核到用户空间传输数据 69
2.9 编写J NI方法 72
第3章 主流内核系统解析 76
3.1 Goldfish内核和驱动解析 76
3.1.1 Goldfish基础 77
3.1.2 Logger驱动 78
3.1.3 Low Memory Killer组件 79
3.1.4 Timed Output驱动 79
3.1.5 Timed Gpio驱动 80
3.1.6 Ram Console驱动 80
3.1.7 Ashmem驱动 81
3.1.8 Pmem驱动 81
3.1.9 Alarm驱动 81
3.1.10 USB Gadget驱动 82
3.1.11 Paranoid驱动介绍 82
3.1.12 Goldfish的设备驱动 83
3.2 MSM内核和驱动架构 85
3.2.1 高通公司介绍 85
3.2.2 常见的MSM处理器产品 86
3.2.3 MSM内核移植 87
3.2.4 Makefile文件 88
3.2.5 驱动和组件 90
3.2.6 设备驱动 92
3.2.7 高通特有的组件 94
第2篇 Android专有驱动篇 98
第4章 分析硬件抽象层 98
4.1 HAL基础 98
4.1.1 推出HAL的背景 98
4.1.2 HAL的基本结构 99
4.2 分析HAL module架构 101
4.2.1 结构体hw_module_t 101
4.2.2 结构体hw_module_methods_t 102
4.2.3 结构体hw_device_t 103
4.3 分析文件hardware.c 103
4.3.1 寻找动态链接库的地址 103
4.3.2 数组variant_keys 104
4.3.3 载入相应的库 104
4.3.4 获得hw_module_t结构体 105
4.4 分析硬件抽象层的加载过程 106
4.5 分析硬件访问服务 109
4.5.1 定义硬件访问服务接口 109
4.5.2 具体实现 110
4.6 分析Mokoid实例 111
4.6.1 获取实例工程源码 112
4.6.2 直接调用service方法的实现代码 113
4.6.3 通过Manager调用service的实现代码 117
4.7 HAL和系统移植 120
4.7.1 移植各个Android部件的方式 120
4.7.2 设置设备权限 121
4.7.3 init.rc初始化 125
4.7.4 文件系统的属性 125
4.8 开发自己的HAL驱动程序 126
4.8.1 封装HAL接口 126
4.8.2 开始编译 129
第5章 Binder通信驱动详解 130
5.1 分析Binder驱动程序 130
5.1.1 数据结构binder_work 130
5.1.2 结构体binder_node 131
5.1.3 结构体binder_ref 132
5.1.4 通知结构体binder_ref_death 133
5.1.5 结构体binder_buffer 133
5.1.6 结构体binder_proc 134
5.1.7 结构体binder_thread 135
5.1.8 结构体binder_transaction 136
5.1.9 结构体binder_write_read 136
5.1.10 Binder驱动协议 137
5.1.11 枚举BinderDriverReturnProtocol 137
5.1.12 结构体binder_ptr_cookie和binder_transaction_data 138
5.1.13 结构体flat_binder_object 139
5.1.14 设备初始化 139
5.1.15 打开Binder设备文件 141
5.1.16 实现内存映射 142
5.1.17 释放物理页面 147
5.1.18 分配内核缓冲区 148
5.1.19 释放内核缓冲区 150
5.1.20 查询内核缓冲区 152
5.2 Binder封装库驱动 153
5.2.1 Binder的3层结构 153
5.2.2 Binder驱动的同事——类BBinder 154
5.2.3 BpRefBase代理类 157
5.2.4 驱动交互类IPCThreadState 158
5.3 初始化Java层Binder框架 160
5.3.1 搭建交互关系 161
5.3.2 实现Binder类的初始化 161
5.3.3 实现BinderProxy类的初始化 162
5.4 实体对象binder_node的驱动 163
5.4.1 定义实体对象 164
5.4.2 增加引用计数 165
5.4.3 减少引用计数 166
5.5 本地对象BBinder驱动 167
5.5.1 引用运行的本地对象 167
5.5.2 处理接口协议 173
5.6 引用对象binder_ref驱-动 177
5.7 代理对象BpBinder驱动 180
5.7.1 创建Binder代理对象 180
5.7.2 销毁Binder代理对象 181
第6章 Logger驱动架构详解 185
6.1 分析Logger驱动程序 185
6.1.1 分析头文件 185
6.1.2 驱动实现文件 186
6.2 日志库Liblog驱动 201
6.2.1 定义指针的初始化操作 202
6.2.2 记录日志 203
6.2.3 设置写入日志记录的类型 204
6.2.4 向Logger日志驱动程序写入日志记录 205
6.2.5 记录日志数据函数 206
6.3 日志写入接口驱动 206
6.3.1 C/C++层的写入接口 207
6.3.2 Java层的写入接口 208
第7章 Ashmem驱动详解 217
7.1 分析Ashmem驱动程序 217
7.1.1 基础数据结构 217
7.1.2 驱动初始化 218
7.1.3 打开匿名共享内存设备文件 219
7.1.4 内存映射 222
7.1.5 读写操作 223
7.1.6 锁定和解锁 225
7.1.7 回收内存块 230
7.2 C++访问接口层 231
7.2.1 接口MemoryHeapBase的服务器端实现 231
7.2.2 接口MemoryHeapBase的客户端实现 236
7.2.3 接口MemoryBase的服务器端实现 240
7.2.4 接口MemoryBase的客户端实现 242
7.3 实现Java访问的接口层 243
7.4 实战演练——读取内核空间的数据 247
第8章 搭建测试环境 250
8.1 搭建S3C6410开发环境 250
8.1.1 S3C6410介绍 250
8.1.2 OK6410介绍 251
8.1.3 安装minicom 251
8.1.4 烧写Android系统 253
8.2 其他开发环境介绍 257
8.2.1 基于Cortex-A8的DMA-210XP开发板 257
8.2.2 基于Cortex-A8的QT210开发板 258
8.2.3 X210CV3开发板 259
8.3 测试驱动的方法 259
8.3.1 使用Ubuntu Linux测试驱动 262
8.3.2 在Android模拟器中测试驱动 263
第9章 低内存管理驱动 266
9.1 OOM机制 266
9.1.1 OOM机制基础 266
9.1.2 分析OOM机制的具体实现 267
9.2 Android系统的Low Memory Killer 架构机制 273
9.3 Low Memory Killer驱动详解 274
9.3.1 Low Memory Killer驱动基础 274
9.3.2 分析核心功能 275
9.3.3 设置用户接口 278
9.4 实战演练——从内存池获取对象 280
9.5 实战演练——使用用户程序读取内核空间的数据 282
第3篇 典型驱动移植篇 286
第10章 电源管理驱动 286
10.1 Power Management架构基础 286
10.2 分析Framework层 287
10.2.1 文件PowerManager.java 287
10.2.2 提供PowerManager功能 288
10.3 JNI层架构分析 309
10.3.1 定义两层之间的接口函数 309
10.3.2 与Linux Kernel层进行交互 311
10.4 Kernel(内核)层架构分析 311
10.4.1 文件power.c 312
10.4.2 文件earlysuspend.c 314
10.4.3 文件wakelock.c 315
10.4.4 文件resume.c 317
10.4.5 文件suspend.c 317
10.4.6 文件main.c 318
10.4.7 proc文件 319
10.5 wakelock和early_suspend 319
10.5.1 wakelock的原理 319
10.5.2 early_suspend原理 320
10.5.3 Android休眠 321
10.5.4 Android唤醒 323
10.6 Battery电池系统架构和管理 323
10.6.1 实现驱动程序 324
10.6.2 实现JNI本地代码 325
10.6.3 Java层代码 325
10.6.4 实现Uevent部分 327
10.7 JobScheduler节能调度机制 331
10.7.1 JobScheduler机制的推出背景 331
10.7.2 JobScheduler的实现 332
10.7.3 实现操作调度 332
10.7.4 封装调度任务 335
第11章 PMEM内存驱动架构 339
11.1 PMEM初步 339
11.1.1 什么是PMEM 339
11.1.2 Platform设备基础 339
11.2 PMEM 驱动架构 341
11.2.1 设备实现 341
11.2.2 PMEM驱动的具体实现 343
11.2.3 调用PMEM驱动的流程 367
11.3 用户空间接口 367
11.3.1 释放位图内存 368
11.3.2 释放位图内存空间 369
11.3.3 获取位图占用内存 370
11.4 实战演练——将PMEM加入到内核中 370
11.5 实战演练——将PMEM加入到内核中 372
11.6 实战演练——PMEM在Camera中的应用 373
11.7 实战演练——PMEM的移植与测试 375
第12章 调试机制驱动Ram Console 378
12.1 Ram Console介绍 378
12.2 实现Ram Console 378
12.2.1 定义结构体ram_console_platform_data 379
12.2.2 实现具体功能 379
第13章 USB Gadget驱动 389
13.1 分析Linux内核的USB驱动程序 389
13.1.1 USB设备基础 389
13.1.2 USB和sysfs 393
13.1.3 urb通信 396
13.2 USB Gadget 驱动架构详解 401
13.2.1 分析软件结构 401
13.2.2 层次整合 411
13.2.3 USB设备枚举 421
13.3 实战演练——USB驱动例程分析 437
13.3.1 结构体usb_device_id 437
13.3.2 结构体usb_driver 439
13.3.3 注册USB驱动程序 440
13.3.4 加载和卸载USB骨架程序模块 441
13.3.5 探测回调函数 441
13.3.6 清理数据 443
13.3.7 函数skel_write()和skel_write_bulk_callback() 444
13.3.8 获取USB的接口 446
13.3.9 释放不需要的资源 447
13.3.10 字符设备函数 448
13.3.11 读取的数据量 449
13.4 实战演练 450
13.4.1 移植USB Gadget驱动 450
13.4.2 移植USB HOST驱动 452
第14章 Time Device驱动 453
14.1 Timed Output驱动架构 453
14.1.1 设备类 453
14.1.2 分析Timed Output驱动的具体实现 458
14.1.3 实战演练——实现设备的读写操作 460
14.2 Timed Gpio驱动架构 461
14.2.1 分析文件timed_gpio.h 462
14.2.2 分析文件timed_gpio.c 462
第15章 警报器系统驱动Alarm 467
15.1 Alarm系统基础 467
15.1.1 Alarm层次结构介绍 467
15.1.2 需要移植的内容 468
15.2 RTC驱动程序架构 468
15.3 Alarm驱动架构 469
15.3.1 分析文件android_alarm.h 469
15.3.2 分析文件alarm.c 471
15.3.3 分析文件alarm-dev.c 483
15.4 JNI层详解 491
15.5 Java层详解 493
15.5.1 分析AlarmManagerService类 493
15.5.2 分析AlarmManager类 501
15.6 模拟器环境的具体实现 503
15.7 实战演练 504
15.7.1 编写PCF8563芯片的RTC驱动程序 504
15.7.2 在2440移植RTC驱动程序 507
15.7.3 在mini2440开发板上的移植 508
15.7.4 实现一个秒表定时器 509
第16章 振动器驱动架构和移植 512
16.1 振动器系统架构 512
16.2 硬件抽象层架构 513
16.3 JNI层架构 514
16.4 Java层架构 515
16.5 实战演练——移植振动器系统 519
16.5.1 移植振动器驱动程序 519
16.5.2 实现硬件抽象层 520
16.6 实战演练——在MSM平台实现振动器驱动 520
16.7 实战演练——在MTK平台实现振动器驱动 523
16.8 实战演练——移植振动器驱动 526
第17章 输入系统驱动 527
17.1 输入系统架构分析 527
17.2 移植输入系统驱动的方法 528
17.3 Input(输入)系统驱动详解 529
17.3.1 分析头文件 529
17.3.2 分析核心文件input.c 533
17.3.3 event机制详解 548
17.4 硬件抽象层详解 551
17.4.1 处理用户空间 551
17.4.2 定义按键的字符映射关系 555
17.4.3 KL格式的按键布局文件 556
17.4.4 KCM格式的按键字符映射文件 557
17.4.5 分析文件EventHub.cpp 558
17.5 实战演练 561
17.5.1 在内置模拟器中实现输入驱动 562
17.5.2 在MSM高通处理器中实现输入驱动 562
17.5.3 在Zoom平台中实现输入驱动 571
第18章 LCD显示驱动 573
18.1 LCD系统介绍 573
18.2 FrameBuffer内核层详解 573
18.2.1 分析接口文件fb.h 574
18.2.2 内核实现文件 577
18.3 硬件抽象层详解 600
18.3.1 Gralloc模块的头文件 601
18.3.2 硬件帧缓冲区 603
18.3.3 显示缓冲区的分配 604
18.3.4 显示缓冲映射 605
18.3.5 分析管理库文件LayerBuffer.cpp 606
18.4 Goldfish中的FrameBuffer驱动程序详解 607
18.5 使用Gralloc模块的驱动程序 610
18.5.1 文件gralloc.cpp 611
18.5.2 文件mapper.cpp 614
18.5.3 文件framebuffer.cpp 615
18.6 MSM高通处理器中的显示驱动 620
18.6.1 msm fb设备的文件操作函数接口 621
18.6.2 高通msm fb的driver接口 621
18.6.3 特殊的iocttl 621
18.7 MSM中的Gralloc驱动程序详解 623
18.7.1 文件gralloc.cpp 623
18.7.2 文件framebuffer.cpp 624
18.7.3 文件gralloc.cpp 627
18.8 OMAP处理器中的显示驱动实现 630
18.8.1 文件omapfb-main.c 631
18.8.2 文件omapfb.h 633
18.9 实战演练 633
18.9.1 S3C2440上的LCD驱动 633
18.9.2 编写访问FrameBuffer设备文件的驱动 658
18.9.3 在S3C6410下移植FrameBuffer驱动 659
第19章 音频系统驱动 664
19.1 音频系统架构基础 664
19.1.1 层次说明 665
19.1.2 Media库中的Audio框架 665
19.2 音频系统层次详解 668
19.2.1 本地代码详解 668
19.2.2 JNI代码详解 670
19.2.3 Java层代码详解 671
19.3 移植Audio系统 672
19.3.1 移植需要做的工作 672
19.3.2 硬件抽象层移植分析 672
19.3.3 AudioFlinger中的Audio硬件抽象层 674
19.3.4 真正实现Audio硬件抽象层 679
19.4 实战演练——在MSM平台实现Audio驱动 680
19.4.1 实现Audio驱动程序 680
19.4.2 实现硬件抽象层 681
19.5 实战演练——在OSS平台实现Audio驱动 684
19.5.1 OSS驱动基础 685
19.5.2 函数mixer() 685
19.6 实战演练——在ALSA平台实现Audio系统 692
19.6.1 注册音频设备和音频驱动 692
19.6.2 在Android中使用ALSA声卡 693
19.6.3 在OMAP平台移植Android的ALSA声卡驱动 701
19.6.4 基于ARM的AC97音频驱动 704
第20章 Overlay系统驱动详解 710
20.1 视频输出系统结构 710
20.2 移植Overlay系统 711
20.3 硬件抽象层详解 711
20.3.1 Overlay系统硬件抽象层的接口 711
20.3.2 实现Overlay系统的硬件抽象层 714
20.3.3 实现Overlay接口 714
20.4 实现Overlay硬件抽象层 715
20.5 实战演练——在OMAP平台实现Overlay系统 717
20.5.1 实现输出视频驱动程序 717
20.5.2 实现Overlay硬件抽象层 719
20.6 实战演练——在系统层调用Overlay HAL 724
20.6.1 测试文件 724
20.6.2 在Android系统中创建Overlay 725
20.6.3 管理Overlay HAL模块 726
20.6.4 S3C6410 Android Overlay的测试代码 727
第21章 照相机驱动 729
21.1 Camera系统的结构 729
21.1.1 Java程序部分 731
21.1.2 Camera的Java本地调用部分 731
21.1.3 Camera的本地库libui.so 732
21.1.4 Camera服务libcameraservice.so 733
21.2 移植Camera系统 737
21.2.1 实现V4L2驱动 737
21.2.2 实现硬件抽象层 744
21.3 实战演练——在MSM平台实现Camera驱动 747
21.4 实战演练——在OMAP平台实现Camera驱动 750
21.5 Android实现S5PV210 FIMC驱动 751
第22章 蓝牙系统驱动 764
22.1 Android系统中的蓝牙模块 764
22.2 分析蓝牙模块的源码 766
22.2.1 初始化蓝牙芯片 766
22.2.2 蓝牙服务 766
22.2.3 管理蓝牙电源 767
22.3 低功耗蓝牙协议栈详解 767
22.3.1 低功耗蓝牙协议栈基础 767
22.3.2 低功耗蓝牙API详解 768
22.4 Android中的BlueDroid 769
22.4.1 Android系统中BlueDroid的架构 770
22.4.2 Application Framework层分析 770
22.4.3 分析Bluetooth System Service层 778
22.4.4 JNI层详解 778
22.4.5 HAL硬件抽象层详解 783
22.5 Android蓝牙模块的运作流程 783
22.5.1 打开蓝牙设备 783
22.5.2 搜索蓝牙 788
22.5.3 传输OPP文件 793