第1章 Android系统介绍 1
1.1 Android是一款智能手机 1
1.1.1 什么是智能手机 1
1.1.2 当前主流的智能手机系统 2
1.2 Android的巨大优势 3
1.3 在电脑上启动Android虚拟机 4
1.3.1 安装Android SDK 4
1.3.2 安装JDK、Eclipse、Android SDK 5
1.3.3 设定Android SDK Home 12
1.4 Android模拟器 13
1.4.1 Android模拟器简介 14
1.4.2 模拟器和仿真机究竟有何区别 14
1.4.3 创建Android虚拟设备(AVD) 14
1.4.4 模拟器的总结 16
1.5 搭建环境过程中的常见问题 18
1.5.1 不能在线更新 18
1.5.2 显示“Project name must be specified”提示 20
1.5.3 Target列表中没有Target选项 21
第2章 Android系统的结构 23
2.1 Android安装文件简介 23
2.1.1 Android SDK目录结构 23
2.1.2 android.iar及内部结构 24
2.1.3 SDK帮助文档 25
2.1.4 解析Android SDK实例 26
2.2 分析Android的系统架构 26
2.2.1 Android体系结构介绍 27
2.2.2 Android工程文件结构 29
2.2.3 应用程序的生命周期 32
2.3 简析Android内核 34
2.3.1 Android继承于Linux 34
2.3.2 Android内核和Linux内核的区别 35
2.4 简析Android源码 37
2.4.1 获取并编译Android源码 37
2.4.2 Android对Linux的改造 38
2.4.3 为Android构建Linux的操作系统 39
2.4.4 分析Android源码结构 39
2.4.5 编译Android源码 44
2.4.6 运行Android源码 45
2.5 实践演练——演示两种编译Android程序的方法 46
2.5.1 编译Native C的helloworld模块 46
2.5.2 手工编译C模块 47
第3章 虚拟机概述 51
3.1 虚拟机的作用 51
3.2 Java虚拟机 51
3.2.1 理解Java虚拟机 51
3.2.2 Java虚拟机的数据类型 52
3.2.3 Java虚拟机的体系结构 53
3.2.4 Java虚拟机的生命周期 58
3.3 Android虚拟机——Dalvik VM 59
3.3.1 Dalvik架构 59
3.3.2 和Java虚拟机的差异 60
3.3.3 Dalvik VM的主要特征 61
3.3.4 Dalvik VM的代码结构 61
3.4 Dalvik控制VM详解 63
3.5 Dalvik VM架构 66
3.5.1 Dalvik的进程管理 67
3.5.2 Android的初始化流程 67
第4章 编译和调试 68
4.1 Windows环境编译Dalvik 68
4.2 GDB调试Dalvik 71
4.2.1 准备工作 71
4.2.2 GDB调试C程序 72
4.2.3 GDB调试Dalvik 74
4.3 使用dexdump 75
4.3.1 dexdump的反编译功能 75
4.3.2 使用dexdump查看jar文件 76
4.4 Dalvik虚拟机编译脚本 80
4.4.1 Android.mk文件 80
4.4.2 ReconfigureDvm.mk文件 81
4.4.3 dvm.mk文件 84
4.5 Android 4.0.1源码下载、模拟器编译和运行 85
第5章 Dalvik虚拟机的运作流程 88
5.1 Dalvik虚拟机相关的可执行程序 88
5.1.1 dalvikvm 88
5.1.2 dvz 89
5.1.3 app_process 90
5.2 Dalvik虚拟机的初始化 92
5.2.1 开始虚拟机的准备工作 92
5.2.2 初始化跟踪显示系统 93
5.2.3 初始化垃圾回收器 93
5.2.4 初始化线程列表和主线程环境参数 93
5.2.5 分配内部操作方法的表格内存 95
5.2.6 初始化虚拟机的指令码相关的内容 95
5.2.7 分配指令寄存器状态的内存 95
5.2.8 分配指令寄存器状态的内存 96
5.2.9 初始化虚拟机最基本用的Java库 96
5.2.10 进一步使用的Java类库线程类 97
5.2.11 初始化虚拟机使用的异常Java类库 99
5.2.12 释放字符串哈希表 100
5.2.13 初始化本地方法库的表 101
5.2.14 初始化内部本地方法 101
5.2.15 初始化JNI调用表 101
5.2.16 缓存Java类库里的反射类 104
5.2.17 最后的工作 106
5.3 启动zygote 110
5.3.1 在init.rc中配置zygote启动参数 111
5.3.2 启动Socket服务端口 111
5.3.3 加载preload-classes 113
5.3.4 加载preload-resources 114
5.3.5 使用folk启动新进程 115
5.4 启动SystemServer进程 116
5.4.1 启动各种系统服务线程 117
5.4.2 启动第一个Activity 119
5.5 class类文件的加载 119
5.5.1 DexFile在内存中的映射 119
5.5.2 ClassObject——Class在加载后的表现形式 121
5.5.3 findClassNoInit——加载Class并生成相应ClassObject的函数 122
5.5.4 加载基本类库文件 123
5.5.5 加载用户类文件 124
5.6 解释执行类 124
5.6.1 Dalvik虚拟机字节码和JVM字节码的区别 124
5.6.2 Davik虚拟机的解释器优化 125
第6章 dex的优化和安全管理 127
6.1 Android dex文件优化简介 127
6.2 dex文件的格式 128
6.2.1 map_list 129
6.2.2 string_id_item 131
6.2.3 type_id_item 135
6.2.4 proto_id_item 136
6.2.5 field_id_item 137
6.2.6 method_id_item 137
6.2.7 class_def_item 138
6.3 dex文件结构 141
6.3.1 文件头(File Header) 142
6.3.2 魔数字段 143
6.3.3 检验码字段 143
6.3.4 SHA-1签名字段 145
6.3.5 map_off字段 146
6.3.6 string_ids_size和off字段 147
6.4 Android的DexFile接口 149
6.4.1 构造函数 149
6.4.2 公共方法 149
6.5 Dex和动态加载类机制 151
6.5.1 类加载机制 151
6.5.2 Dalvik虚拟机类加载机制 151
6.5.3 具体的实际操作 153
6.5.4 代码加密 153
6.6 Android动态加载jar和DEX 154
6.6.1 Android的动态加载 154
6.6.2 演练动态加载 154
6.7 dex文件的再优化 157
第7章 生命周期管理 158
7.1 Android程序的生命周期 158
7.1.1 进程和线程 158
7.1.2 进程的类型 159
7.2 Activity的生命周期 160
7.2.1 Activity的几种状态 160
7.2.2 分解剖析Activity 161
7.2.3 几个典型的场景 162
7.2.4 管理Activity的生命周期 163
7.2.5 Activity的实例化与启动 163
7.2.6 Activity的暂停与继续 164
7.2.7 Activity的关闭/销毁与重新运行 165
7.2.8 Activity的启动模式 166
7.3 Android进程与线程 166
7.3.1 进程 167
7.3.2 线程 167
7.3.3 线程安全的方法 167
7.4 测试生命周期 168
7.5 Service的生命周期 172
7.5.1 Service的基本概念和用途 172
7.5.2 Service的生命周期详解 172
7.5.3 Service与Activity通信 172
7.6 Android广播的生命周期 178
7.7 Dalvik的进程管理 180
7.7.1 Zygote 180
7.7.2 Dalvik的进程模型 191
7.7.3 Dalvik虚拟机的进程通信 196
第8章 内存分配策略 201
8.1 Java的内存分配管理 201
8.1.1 内存分配中的栈和堆 201
8.1.2 堆和栈的合作 204
8.2 运行时的数据区域 207
8.2.1 程序计数器(Program Counter Register) 208
8.2.2 Java的虚拟机栈VM Stack 209
8.2.3 本地方法栈Native Method Stack 209
8.2.4 Java堆(Java Heap) 210
8.2.5 方法区 210
8.2.6 运行时常量池 211
8.2.7 直接内存 212
8.3 对象访问 212
8.3.1 对象访问基础 213
8.3.2 具体测试 214
8.4 内存泄漏 220
8.4.1 内存泄漏的分类 221
8.4.2 内存泄漏的定义 221
8.4.3 内存泄漏的常见问题和后果 221
8.4.4 检测内存泄漏 223
8.5 Davlik虚拟机的内存分配 223
8.6 分析Dalvik虚拟机的内存管理机制源码 225
8.6.1 表示堆的结构体 225
8.6.2 表示位图堆的结构体数据 226
8.6.3 HeapSource结构体 226
8.6.4 和mark bits相关的结构体 227
8.6.5 结构体GcHeap 228
8.6.6 初始化垃圾回收器 230
8.6.7 初始化和Heap相关的信息 230
8.6.8 创建GcHeap 231
8.6.9 追踪位置 233
8.6.10 实现空间分配 234
8.6.11 其他模块 237
8.7 优化Dalvik虚拟机的堆内存分配 242
8.8 查看Android内存泄漏的工具——MAT 243
第9章 垃圾收集 247
9.1 初探Java虚拟机中的垃圾收集 247
9.1.1 何谓垃圾收集 247
9.1.2 常见的垃圾收集策略 247
9.1.3 Java虚拟机的垃圾收集策略 249
9.2 Java虚拟机垃圾收集的算法 250
9.2.1 “标记-清除”算法 251
9.2.2 复制算法 251
9.2.3 标记-整理算法 252
9.2.4 分代收集算法 253
9.3 垃圾收集器 253
9.3.1 Serial收集器 254
9.3.2 ParNew收集器 255
9.3.3 Parallel Scavenge收集器 256
9.3.4 Serial Old收集器 256
9.3.5 Parallel Old收集器 257
9.3.6 CMS收集器 257
9.3.7 G1收集器 258
9.3.8 垃圾收集器参数总结 259
9.4 Android中的垃圾回收 260
9.4.1 sp和wp简析 260
9.4.2 详解智能指针(android refbase类(sp和wp)) 262
9.5 Dalvik垃圾收集的三种算法 264
9.5.1 引用计数 264
9.5.2 Mark Sweep算法 264
9.5.3 和垃圾收集算法有关的函数 266
9.5.4 在什么时候进行垃圾回收 275
9.5.5 调试信息 276
9.6 Dalvik虚拟机和Java虚拟机垃圾收集机制的区别 277
第10章 线程管理 279
10.1 Java中的线程机制 279
10.1.1 Java的多线程 279
10.1.2 线程的实现 280
10.1.3 线程调度 282
10.1.4 线程状态间的转换 283
10.1.5 线程安全 287
10.1.6 线程安全的实现方法 290
10.1.7 无状态类 294
10.2 Android的线程模型 296
10.2.1 Android的单线程模型 297
10.2.2 Message Queue 297
10.2.3 AsyncTask 298
10.3 分析Android的进程通信机制 299
10.3.1 Android的进程间通信(IPC)机制Binder 299
10.3.2 Service Manager是Binder机制的上下文管理者 301
10.3.3 分析Server和Client获得Service Manager的过程 319
第11章 JNI接口 323
11.1 JNI技术基础 323
11.1.1 JNI概述 323
11.1.2 JNI带来了什么 323
11.1.3 JNI的结构 324
11.1.4 JNI的实现方式 325
11.1.5 JNI的代码实现和调用 325
11.2 JNI技术的功能 326
11.2.1 解决性能问题 326
11.2.2 解决本机平台接口调用问题 327
11.2.3 嵌入式开发应用 327
11.3 在Android中使用JNI 328
11.3.1 使用JNI的流程 328
11.3.2 使用JNI技术来进行二次封装 328
11.3.3 Android JNI使用的数据结构JNINativeMethod 330
11.3.4 通过JNI实现Java对C/C++函数的调用 331
11.3.5 调用Native(本地)方法传递参数并且返回结果 335
11.3.6 使用JNI调用C/C++开发的共享库 337
11.3.7 使用线程及回调更新UI 341
11.3.8 使用JNI实现Java与C之间传递数据 343
11.4 Dalvik虚拟机的JNI测试函数 348
11.5 总结Android中JNI编程的一些技巧 349
11.5.1 传递Java的基本类型 349
11.5.2 传递String参数 350
11.5.3 传递数组类型 351
11.5.4 二维数组和String数组 351
第12章 JIT编译 356
12.1 JIT简介 356
12.1.1 JIT概述 356
12.1.2 Java虚拟机主要的优化技术 358
12.1.3 Dalvik虚拟机中JIT的实现 359
12.2 Dalvik虚拟机对JIT的支持 359
12.3 汇编代码和改动 360
12.3.1 汇编部分代码 361
12.3.2 对C文件的改动 361
12.4 Dalvik虚拟机中的源码分析 361
12.4.1 入口文件 362
12.4.2 核心函数 373
12.4.3 编译文件 376
12.4.4 BasicBlock处理 387
12.4.5 内存初始化 388
12.4.6 对JIT源码的总结 392
第13章 异常管理 394
13.1 Java中的异常处理 394
13.1.1 认识异常 394
13.1.2 Java的异常处理机制 395
13.1.3 Java提供的异常处理类 397
13.2 处理Java异常的方式 398
13.2.1 使用try...catch处理异常 398
13.2.2 在异常中使用finally关键字 399
13.2.3 访问异常信息 399
13.2.4 抛出异常 400
13.2.5 自定义异常 401
13.2.6 Java异常处理语句的规则 402
13.3 Java虚拟机的异常处理机制 404
13.3.1 Java异常处理机制基础 404
13.3.2 COSIX虚拟机异常处理的设计与实现 405
13.4 分析Dalvik虚拟机异常处理的源码 409
13.4.1 初始化虚拟机使用的异常Java类库 409
13.4.2 抛出一个线程异常 410
13.4.3 持续抛出进程 411
13.4.4 抛出异常名 413
13.4.5 找出异常的原因 413
13.4.6 清除挂起的异常和等待初始化的异常 417
13.4.7 包装“现在等待”异常的不同例外 417
13.4.8 输出跟踪当前异常的错误信息 418
13.4.9 搜索和当前异常相匹配的方法 419
13.4.10 获取匹配的捕获块 421
13.4.11 进行堆栈跟踪 423
13.4.12 生成堆栈跟踪元素 425
13.4.13 将内容添加到堆栈跟踪日志中 426
13.4.14 打印输出为堆栈跟踪信息 427