内容简介
第1篇 基础知识篇
第1章 Android底层开发基础
1.1 Android系统介绍
1.2 Android系统架构介绍
1.2.1 底层操作系统层(OS)
1.2.2 各种库(Libraries)和Android运行环境(RunTime)
1.2.3 应用程序框架(Application Framework)
1.2.4 顶层应用程序(Application)
1.3 获取Android源码
1.3.1 在Linux系统中获取Android源码
1.3.2 在Windows平台上获取Android源码
1.4 分析Android源码结构
1.4.1 总体结构
1.4.2 应用程序部分
1.4.3 应用程序框架部分
1.4.4 系统服务部分
1.4.5 系统程序库部分
1.4.6 系统运行库部分
1.4.7 硬件抽象层部分
1.5 编译源码
1.5.1 搭建编译环境
1.5.2 在模拟器中运行
1.5.3 编译源码生成SDK
第2章 Android驱动开发基础
2.1 驱动程序基础
2.1.1 什么是驱动程序
2.1.2 驱动开发需要做的工作
2.2 Linux开发基础
2.2.1 Linux简介
2.2.2 Linux的发展趋势
2.2.3 Android基于Linux系统
2.2.4 Android和Linux内核的区别
2.2.5 Android独有的驱动
2.2.6 为Android构建Linux的操作系统
2.3 Linux内核结构
2.3.1 Linux内核的体系结构
2.3.2 和Android驱动开发相关的内核知识
2.4 分析Linux内核源码
2.4.1 源码目录结构
2.4.2 浏览源码的工具
2.4.3 GCC特性
2.4.4 链表的重要性
2.4.5 Kconfig和Makefile
2.5 学习Linux内核的方法
2.5.1 分析USB子系统的代码
2.5.2 分析USB系统的初始化代码
2.6 Linux中的3类驱动程序
2.6.1 字符设备驱动
2.6.2 块设备驱动
2.6.3 网络设备驱动
2.7 Android系统移植基础
2.7.1 移植的任务
2.7.2 需要移植的内容
2.7.3 驱动开发需要做的工作
2.8 内核空间和用户空间之间的接口
2.8.1 内核空间和用户空间的相互作用
2.8.2 实现系统和硬件之间的交互
2.8.3 从内核到用户空间传输数据
2.9 编写J NI方法
第3章 主流内核系统解析
3.1 Goldfish内核和驱动解析
3.1.1 Goldfish基础
3.1.2 Logger驱动
3.1.3 Low Memory Killer组件
3.1.4 Timed Output驱动
3.1.5 Timed Gpio驱动
3.1.6 Ram Console驱动
3.1.7 Ashmem驱动
3.1.8 Pmem驱动
3.1.9 Alarm驱动
3.1.10 USB Gadget驱动
3.1.11 Paranoid驱动介绍
3.1.12 Goldfish的设备驱动
3.2 MSM内核和驱动架构
3.2.1 高通公司介绍
3.2.2 常见的MSM处理器产品
3.2.3 MSM内核移植
3.2.4 Makefile文件
3.2.5 驱动和组件
3.2.6 设备驱动
3.2.7 高通特有的组件
第2篇 Android专有驱动篇
第4章 分析硬件抽象层
4.1 HAL基础
4.1.1 推出HAL的背景
4.1.2 HAL的基本结构
4.2 分析HAL module架构
4.2.1 结构体hw_module_t
4.2.2 结构体hw_module_methods_t
4.2.3 结构体hw_device_t
4.3 分析文件hardware.c
4.3.1 寻找动态链接库的地址
4.3.2 数组variant_keys
4.3.3 载入相应的库
4.3.4 获得hw_module_t结构体
4.4 分析硬件抽象层的加载过程
4.5 分析硬件访问服务
4.5.1 定义硬件访问服务接口
4.5.2 具体实现
4.6 分析Mokoid实例
4.6.1 获取实例工程源码
4.6.2 直接调用service方法的实现代码
4.6.3 通过Manager调用service的实现代码
4.7 HAL和系统移植
4.7.1 移植各个Android部件的方式
4.7.2 设置设备权限
4.7.3 init.rc初始化
4.7.4 文件系统的属性
4.8 开发自己的HAL驱动程序
4.8.1 封装HAL接口
4.8.2 开始编译
第5章 Binder通信驱动详解
5.1 分析Binder驱动程序
5.1.1 数据结构binder_work
5.1.2 结构体binder_node
5.1.3 结构体binder_ref
5.1.4 通知结构体binder_ref_death
5.1.5 结构体binder_buffer
5.1.6 结构体binder_proc
5.1.7 结构体binder_thread
5.1.8 结构体binder_transaction
5.1.9 结构体binder_write_read
5.1.10 Binder驱动协议
5.1.11 枚举BinderDriverReturnProtocol
5.1.12 结构体binder_ptr_cookie和binder_transaction_data
5.1.13 结构体flat_binder_object
5.1.14 设备初始化
5.1.15 打开Binder设备文件
5.1.16 实现内存映射
5.1.17 释放物理页面
5.1.18 分配内核缓冲区
5.1.19 释放内核缓冲区
5.1.20 查询内核缓冲区
5.2 Binder封装库驱动
5.2.1 Binder的3层结构
5.2.2 Binder驱动的同事——类BBinder
5.2.3 BpRefBase代理类
5.2.4 驱动交互类IPCThreadState
5.3 初始化Java层Binder框架
5.3.1 搭建交互关系
5.3.2 实现Binder类的初始化
5.3.3 实现BinderProxy类的初始化
5.4 实体对象binder_node的驱动
5.4.1 定义实体对象
5.4.2 增加引用计数
5.4.3 减少引用计数
5.5 本地对象BBinder驱动
5.5.1 引用运行的本地对象
5.5.2 处理接口协议
5.6 引用对象binder_ref驱-动
5.7 代理对象BpBinder驱动
5.7.1 创建Binder代理对象
5.7.2 销毁Binder代理对象
第6章 Logger驱动架构详解
6.1 分析Logger驱动程序
6.1.1 分析头文件
6.1.2 驱动实现文件
6.2 日志库Liblog驱动
6.2.1 定义指针的初始化操作
6.2.2 记录日志
6.2.3 设置写入日志记录的类型
6.2.4 向Logger日志驱动程序写入日志记录
6.2.5 记录日志数据函数
6.3 日志写入接口驱动
6.3.1 C/C++层的写入接口
6.3.2 Java层的写入接口
第7章 Ashmem驱动详解
7.1 分析Ashmem驱动程序
7.1.1 基础数据结构
7.1.2 驱动初始化
7.1.3 打开匿名共享内存设备文件
7.1.4 内存映射
7.1.5 读写操作
7.1.6 锁定和解锁
7.1.7 回收内存块
7.2 C++访问接口层
7.2.1 接口MemoryHeapBase的服务器端实现
7.2.2 接口MemoryHeapBase的客户端实现
7.2.3 接口MemoryBase的服务器端实现
7.2.4 接口MemoryBase的客户端实现
7.3 实现Java访问的接口层
7.4 实战演练——读取内核空间的数据
第8章 搭建测试环境
8.1 搭建S3C6410开发环境
8.1.1 S3C6410介绍
8.1.2 OK6410介绍
8.1.3 安装minicom
8.1.4 烧写Android系统
8.2 其他开发环境介绍
8.2.1 基于Cortex-A8的DMA-210XP开发板
8.2.2 基于Cortex-A8的QT210开发板
8.2.3 X210CV3开发板
8.3 测试驱动的方法
8.3.1 使用Ubuntu Linux测试驱动
8.3.2 在Android模拟器中测试驱动
第9章 低内存管理驱动
9.1 OOM机制
9.1.1 OOM机制基础
9.1.2 分析OOM机制的具体实现
9.2 Android系统的Low Memory Killer 架构机制
9.3 Low Memory Killer驱动详解
9.3.1 Low Memory Killer驱动基础
9.3.2 分析核心功能
9.3.3 设置用户接口
9.4 实战演练——从内存池获取对象
9.5 实战演练——使用用户程序读取内核空间的数据
第3篇 典型驱动移植篇
第10章 电源管理驱动
10.1 Power Management架构基础
10.2 分析Framework层
10.2.1 文件PowerManager.java
10.2.2 提供PowerManager功能
10.3 JNI层架构分析
10.3.1 定义两层之间的接口函数
10.3.2 与Linux Kernel层进行交互
10.4 Kernel(内核)层架构分析
10.4.1 文件power.c
10.4.2 文件earlysuspend.c
10.4.3 文件wakelock.c
10.4.4 文件resume.c
10.4.5 文件suspend.c
10.4.6 文件main.c
10.4.7 proc文件
10.5 wakelock和early_suspend
10.5.1 wakelock的原理
10.5.2 early_suspend原理
10.5.3 Android休眠
10.5.4 Android唤醒
10.6 Battery电池系统架构和管理
10.6.1 实现驱动程序
10.6.2 实现JNI本地代码
10.6.3 Java层代码
10.6.4 实现Uevent部分
10.7 JobScheduler节能调度机制
10.7.1 JobScheduler机制的推出背景
10.7.2 JobScheduler的实现
10.7.3 实现操作调度
10.7.4 封装调度任务
第11章 PMEM内存驱动架构
11.1 PMEM初步
11.1.1 什么是PMEM
11.1.2 Platform设备基础
11.2 PMEM 驱动架构
11.2.1 设备实现
11.2.2 PMEM驱动的具体实现
11.2.3 调用PMEM驱动的流程
11.3 用户空间接口
11.3.1 释放位图内存
11.3.2 释放位图内存空间
11.3.3 获取位图占用内存
11.4 实战演练——将PMEM加入到内核中
11.5 实战演练——将PMEM加入到内核中
11.6 实战演练——PMEM在Camera中的应用
11.7 实战演练——PMEM的移植与测试
第12章 调试机制驱动Ram Console
12.1 Ram Console介绍
12.2 实现Ram Console
12.2.1 定义结构体ram_console_platform_data
12.2.2 实现具体功能
第13章 USB Gadget驱动
13.1 分析Linux内核的USB驱动程序
13.1.1 USB设备基础
13.1.2 USB和sysfs
13.1.3 urb通信
13.2 USB Gadget 驱动架构详解
13.2.1 分析软件结构
13.2.2 层次整合
13.2.3 USB设备枚举
13.3 实战演练——USB驱动例程分析
13.3.1 结构体usb_device_id
13.3.2 结构体usb_driver
13.3.3 注册USB驱动程序
13.3.4 加载和卸载USB骨架程序模块
13.3.5 探测回调函数
13.3.6 清理数据
13.3.7 函数skel_write()和skel_write_bulk_callback()
13.3.8 获取USB的接口
13.3.9 释放不需要的资源
13.3.10 字符设备函数
13.3.11 读取的数据量
13.4 实战演练
13.4.1 移植USB Gadget驱动
13.4.2 移植USB HOST驱动
第14章 Time Device驱动
14.1 Timed Output驱动架构
14.1.1 设备类
14.1.2 分析Timed Output驱动的具体实现
14.1.3 实战演练——实现设备的读写操作
14.2 Timed Gpio驱动架构
14.2.1 分析文件timed_gpio.h
14.2.2 分析文件timed_gpio.c
第15章 警报器系统驱动Alarm
15.1 Alarm系统基础
15.1.1 Alarm层次结构介绍
15.1.2 需要移植的内容
15.2 RTC驱动程序架构
15.3 Alarm驱动架构
15.3.1 分析文件android_alarm.h
15.3.2 分析文件alarm.c
15.3.3 分析文件alarm-dev.c
15.4 JNI层详解
15.5 Java层详解
15.5.1 分析AlarmManagerService类
15.5.2 分析AlarmManager类
15.6 模拟器环境的具体实现
15.7 实战演练
15.7.1 编写PCF8563芯片的RTC驱动程序
15.7.2 在2440移植RTC驱动程序
15.7.3 在mini2440开发板上的移植
15.7.4 实现一个秒表定时器
第16章 振动器驱动架构和移植
16.1 振动器系统架构
16.2 硬件抽象层架构
16.3 JNI层架构
16.4 Java层架构
16.5 实战演练——移植振动器系统
16.5.1 移植振动器驱动程序
16.5.2 实现硬件抽象层
16.6 实战演练——在MSM平台实现振动器驱动
16.7 实战演练——在MTK平台实现振动器驱动
16.8 实战演练——移植振动器驱动
第17章 输入系统驱动
17.1 输入系统架构分析
17.2 移植输入系统驱动的方法
17.3 Input(输入)系统驱动详解
17.3.1 分析头文件
17.3.2 分析核心文件input.c
17.3.3 event机制详解
17.4 硬件抽象层详解
17.4.1 处理用户空间
17.4.2 定义按键的字符映射关系
17.4.3 KL格式的按键布局文件
17.4.4 KCM格式的按键字符映射文件
17.4.5 分析文件EventHub.cpp
17.5 实战演练
17.5.1 在内置模拟器中实现输入驱动
17.5.2 在MSM高通处理器中实现输入驱动
17.5.3 在Zoom平台中实现输入驱动
第18章 LCD显示驱动
18.1 LCD系统介绍
18.2 FrameBuffer内核层详解
18.2.1 分析接口文件fb.h
18.2.2 内核实现文件
18.3 硬件抽象层详解
18.3.1 Gralloc模块的头文件
18.3.2 硬件帧缓冲区
18.3.3 显示缓冲区的分配
18.3.4 显示缓冲映射
18.3.5 分析管理库文件LayerBuffer.cpp
18.4 Goldfish中的FrameBuffer驱动程序详解
18.5 使用Gralloc模块的驱动程序
18.5.1 文件gralloc.cpp
18.5.2 文件mapper.cpp
18.5.3 文件framebuffer.cpp
18.6 MSM高通处理器中的显示驱动
18.6.1 msm fb设备的文件操作函数接口
18.6.2 高通msm fb的driver接口
18.6.3 特殊的iocttl
18.7 MSM中的Gralloc驱动程序详解
18.7.1 文件gralloc.cpp
18.7.2 文件framebuffer.cpp
18.7.3 文件gralloc.cpp
18.8 OMAP处理器中的显示驱动实现
18.8.1 文件omapfb-main.c
18.8.2 文件omapfb.h
18.9 实战演练
18.9.1 S3C2440上的LCD驱动
18.9.2 编写访问FrameBuffer设备文件的驱动
18.9.3 在S3C6410下移植FrameBuffer驱动
第19章 音频系统驱动
19.1 音频系统架构基础
19.1.1 层次说明
19.1.2 Media库中的Audio框架
19.2 音频系统层次详解
19.2.1 本地代码详解
19.2.2 JNI代码详解
19.2.3 Java层代码详解
19.3 移植Audio系统
19.3.1 移植需要做的工作
19.3.2 硬件抽象层移植分析
19.3.3 AudioFlinger中的Audio硬件抽象层
19.3.4 真正实现Audio硬件抽象层
19.4 实战演练——在MSM平台实现Audio驱动
19.4.1 实现Audio驱动程序
19.4.2 实现硬件抽象层
19.5 实战演练——在OSS平台实现Audio驱动
19.5.1 OSS驱动基础
19.5.2 函数mixer()
19.6 实战演练——在ALSA平台实现Audio系统
19.6.1 注册音频设备和音频驱动
19.6.2 在Android中使用ALSA声卡
19.6.3 在OMAP平台移植Android的ALSA声卡驱动
19.6.4 基于ARM的AC97音频驱动
第20章 Overlay系统驱动详解
20.1 视频输出系统结构
20.2 移植Overlay系统
20.3 硬件抽象层详解
20.3.1 Overlay系统硬件抽象层的接口
20.3.2 实现Overlay系统的硬件抽象层
20.3.3 实现Overlay接口
20.4 实现Overlay硬件抽象层
20.5 实战演练——在OMAP平台实现Overlay系统
20.5.1 实现输出视频驱动程序
20.5.2 实现Overlay硬件抽象层
20.6 实战演练——在系统层调用Overlay HAL
20.6.1 测试文件
20.6.2 在Android系统中创建Overlay
20.6.3 管理Overlay HAL模块
20.6.4 S3C6410 Android Overlay的测试代码
第21章 照相机驱动
21.1 Camera系统的结构
21.1.1 Java程序部分
21.1.2 Camera的Java本地调用部分
21.1.3 Camera的本地库libui.so
21.1.4 Camera服务libcameraservice.so
21.2 移植Camera系统
21.2.1 实现V4L2驱动
21.2.2 实现硬件抽象层
21.3 实战演练——在MSM平台实现Camera驱动
21.4 实战演练——在OMAP平台实现Camera驱动
21.5 Android实现S5PV210 FIMC驱动
第22章 蓝牙系统驱动
22.1 Android系统中的蓝牙模块
22.2 分析蓝牙模块的源码
22.2.1 初始化蓝牙芯片
22.2.2 蓝牙服务
22.2.3 管理蓝牙电源
22.3 低功耗蓝牙协议栈详解
22.3.1 低功耗蓝牙协议栈基础
22.3.2 低功耗蓝牙API详解
22.4 Android中的BlueDroid
22.4.1 Android系统中BlueDroid的架构
22.4.2 Application Framework层分析
22.4.3 分析Bluetooth System Service层
22.4.4 JNI层详解
22.4.5 HAL硬件抽象层详解
22.5 Android蓝牙模块的运作流程
22.5.1 打开蓝牙设备
22.5.2 搜索蓝牙
22.5.3 传输OPP文件