第1章 开发环境部署 1
1.1 获取Android源代码 1
1.2 Android的编译 3
1.3 在IDE中导入Android源代码 4
1.3.1 将Android源代码导入Eclipse 4
1.3.2 将Android源代码导入SourceInsight 5
1.4 调试Android源代码 6
1.4.1 使用Eclipse调试Android Java源代码 6
1.4.2 使用gdb调试Android C/C++源代码 8
1.5 本章小结 9
第2章 深入理解Java Binder和MessageQueue 10
2.1 概述 11
2.2 Java层中的Binder分析 11
2.2.1 Binder架构总览 11
2.2.2 初始化Java层Binder框架 13
2.2.3 窥一斑,可见全豹乎 16
2.2.4 理解AIDL 25
2.2.5 Java层Binder架构总结 28
2.3 心系两界的MessageQueue 28
2.3.1 MessageQueue的创建 29
2.3.2 提取消息 29
2.3.3 nativePollOnce函数分析 32
2.3.4 MessageQueue总结 42
2.4 本章小结 44
第3章 深入理解AudioService 45
3.1 概述 46
3.2 音量管理 47
3.2.1 音量键的处理流程 47
3.2.2 通用的音量设置函数setStreamVolume() 61
3.2.3 静音控制 63
3.2.4 音量控制小结 67
3.3 音频外设的管理 68
3.3.1 WiredAccessoryObserver设备状态的监控 68
3.3.2 AudioService的外设状态管理 73
3.3.3 音频外设管理小结 78
3.4 AudioFocus机制的实现 78
3.4.1 AudioFocus最简单的例子 79
3.4.2 AudioFocus实现原理简介 81
3.4.3 申请AudioFocus 82
3.4.4 释放AudioFocus 86
3.4.5 AudioFocus小结 87
3.5 AudioService的其他功能 88
3.6 本章小结 89
第4章 深入理解WindowManager-Service 90
4.1 初识WindowManagerService 91
4.1.1 一个从命令行启动的动画窗口 91
4.1.2 WMS的构成 99
4.1.3 初识WMS的小结 103
4.2 WMS的窗口管理结构 104
4.2.1 理解WindowToken 107
4.2.2 理解WindowState 111
4.2.3 理解DisplayContent 112
4.3 理解窗口的显示次序 112
4.3.1 主序、子序和窗口类型 112
4.3.2 通过主序与子序确定窗口的次序 114
4.3.3 更新显示次序到Surface 119
4.3.4 关于显示次序的小结 119
4.4 窗口的布局 119
4.4.1 从relayoutWindow()开始 120
4.4.2 布局操作的外围代码分析 124
4.4.3 初探performLayoutAndPlace-SurfacesLockedInner() 127
4.4.4 布局的前期处理 128
4.4.5 布局DisplayContent 130
4.4.6 布局的最终阶段 150
4.5 WMS的动画系统 150
4.5.1 Android动画原理简介 151
4.5.2 WMS的动画系统框架 155
4.5.3 WindowAnimator分析 156
4.5.4 深入理解窗口动画 160
4.5.5 交替运行的布局系统与动画系统 173
4.5.6 动画系统总结 174
4.6 本章小结 174
第5章 深入理解Android输入系统 176
5.1 初识Android输入系统 177
5.1.1 getevent与sendevent工具 178
5.1.2 Android输入系统简介 179
5.1.3 IMS的构成 181
5.2 原始事件的读取与加工 185
5.2.1 基础知识:INotify与Epoll 186
5.2.2 InputReader的总体流程 189
5.2.3 深入理解EventHub 191
5.2.4 深入理解InputReader 205
5.2.5 原始事件的读取与加工总结 225
5.3 输入事件的派发 225
5.3.1 通用事件派发流程 226
5.3.2 按键事件的派发 237
5.3.3 DispatcherPolicy与InputFilter 247
5.3.4 输入事件的派发总结 250
5.4 输入事件的发送、接收与反馈 250
5.4.1 深入理解InputChannel 251
5.4.2 连接InputDispatcher和窗口 252
5.4.3 事件的发送 260
5.4.4 事件的接收 263
5.4.5 事件的反馈与发送循环 264
5.4.6 输入事件的发送、接收与反馈总结 267
5.5 关于输入系统的其他重要话题 267
5.5.1 输入事件ANR的产生 267
5.5.2 焦点窗口的确定 270
5.5.3 以软件方式模拟用户操作 273
5.6 本章小结 273
第6章 深入理解控件系统 275
6.1 初识Android的控件系统 276
6.1.1 另一种创建窗口的方法 277
6.1.2 控件系统的组成 278
6.2 深入理解WindowManager 279
6.2.1 WindowManager的创建与体系结构 279
6.2.2 通过WindowManagerGlobal添加窗口 282
6.2.3 更新窗口的布局 284
6.2.4 删除窗口 285
6.2.5 WindowManager的总结 285
6.3 深入理解ViewRootImpl 286
6.3.1 ViewRootImpl的创建及其重要的成员 286
6.3.2 控件系统的心跳:performTraversals() 290
6.3.3 ViewRootImpl总结 317
6.4 深入理解控件树的绘制 317
6.4.1 理解Canvas 317
6.4.2 View.invalidate()与脏区域 320
6.4.3 开始绘制 321
6.4.4 软件绘制的原理 323
6.4.5 硬件加速绘制的原理 334
6.4.6 使用绘图缓存 346
6.4.7 控件动画 356
6.4.8 绘制控件树的总结 360
6.5 深入理解输入事件的派发 361
6.5.1 触摸模式 361
6.5.2 控件焦点 363
6.5.3 输入事件派发的综述 376
6.5.4 按键事件的派发 381
6.5.5 触摸事件的派发 388
6.5.6 输入事件派发的总结 404
6.6 Activity与控件系统 405
6.6.1 理解PhoneWindow 405
6.6.2 Activity窗口的创建与显示 414
6.7 本章小结 416
第7章 深入理解SystemUI 418
7.1 初识SysternUI 419
7.1.1 SystemUIService的启动 420
7.1.2 状态栏与导航栏的创建 422
7.1.3 理解IStatusBarService 425
7.1.4 SystemUI的体系结构 427
7.2 深入理解状态栏 428
7.2.1 状态栏窗口的创建与控件树结构 429
7.2.2 通知信息的管理与显示 434
7.2.3 系统状态图标区的管理与显示 448
7.2.4 状态栏总结 452
7.3 深入理解导航栏 452
7.3.1 导航栏的创建 453
7.3.2 虚拟按键的工作原理 459
7.3.3 SearchPanel 462
7.3.4 关于导航栏的其他话题 465
7.3.5 导航栏总结 471
7.4 禁用状态栏与导航栏的功能 472
7.4.1 如何禁用状态栏与导航栏的功能 472
7.4.2 StatusBarManagerService对禁用标记的维护 473
7.4.3 状态栏与导航栏对禁用标记的响应 474
7.5 理解SystemUIVisibility 475
7.5.1 SystemUIVisibility在系统中的漫游过程 476
7.5.2 SystemUIVisibility发挥作用 482
7.5.3 SystemUIVisibility总结 494
7.6 本章小结 495
第8章 深入理解Android壁纸 496
8.1 初识Android壁纸 497
8.2 深入理解动态壁纸 498
8.2.1 启动动态壁纸的方法 498
8.2.2 壁纸服务的启动原理 498
8.2.3 理解UpdateSurface()方法 510
8.2.4 壁纸的销毁 515
8.2.5 理解Engine的回调 516
8.3 深入理解静态壁纸——ImageWallpaper 519
8.3.1 获取用作静态壁纸的位图 519
8.3.2 静态壁纸位图的设置 522
8.3.3 连接静态壁纸的设置与获取——WallpaperObserver 524
8.4 WMS对壁纸窗口的特殊处理 526
8.4.1 壁纸窗口Z序的确定 527
8.4.2 壁纸窗口的可见性 533
8.4.3 壁纸窗口的动画 535
8.4.4 壁纸窗口总结 538
8.5 本章小结 539