本书在京东,当当,亚马逊上都有出售。
本书的QQ交流群:216840480
【本书简介】
《深入解析Android 5.0系统》详细剖析了最新Android 5.0 系统主要框架的原理和具体实现。本书共24章,覆盖了Android 5.0 系统中、下层重要的模块,对于每个模块都详细介绍了它们的架构、原理及代码实现等各个方面,尽量让读者知其然,又知其所以然,达到学以致用的目的。主要内容为:
Android Build系统核心、Android的Bionic、系统调用的实现方法、Android的Binder、Binder应用层的核心类、Android 的JNI、Android的同步和消息机制、进程间的消息传递、Android的Init进程、Android的Zygote进程、Android的资源管理、Android的SystemServer进程、Android的应用管理、Android的组件管理、Android的多用户模式、Android的图形显示系统、Android的窗口系统、Android 的输入管理、Android的电源管理、Android的存储系统、Android的网络管理框架、Android的音频系统、Android的SELinux模块、Dalvik和ART虚拟机、Android的Recovery模块、Android的调试方法、内存泄露的分析、Android的自动化测试等系统的核心知识。
在书中尽可能详细地给出了代码的注释、各种属性和常量的解释,以及各种系统中使用的文件格式的介绍,希望读者能通过本书,获得对Android 5.0系统进行二次开发的能力,本书是进行系统开发人员的案头必备书。
《深入解析Android 5.0系统》面向的读者主要是进行系统开发的工程师,包括应用开发工程师、ROM开发工程师和各种使用Android作为开发平台的TV和可穿戴式设备(Wear)的开发工程师。本书也可以作为大专院校相关专业师生的学习用书及培训学校教材。
【本书目录】
导读 1
第1章 建立系统开发环境 3
1.1 安装操作系统 3
1.1.1 安装方式的选择 3
1.1.2 下载和安装Ubuntu 4
1.1.3 使用Ubuntu遇到的问题 4
1.2 安装开发包 5
1.2.1 安装JDK1.6 5
1.2.2 安装OpenJDK1.7 6
1.2.3 安装编译需要的开发包 6
1.3 安装一些有用的工具 6
1.3.1 安装Android SDK 7
1.3.2 安装Android Studio 7
1.3.3 安装Source Insight 7
1.3.4 安装比较工具Meld 7
1.4 下载源码 8
1.4.1 Git and Repo简介 8
1.4.2 源码版本历史 9
1.4.3 下载Android 源码 10
1.4.4 下载Kernel 源码 11
第2章 Android的Build系统 15
2.1 Android Build系统核心 15
2.1.1 编译环境的建立 16
2.1.2 Build相关的环境变量 20
2.1.3 Build系统的层次关系 21
2.1.4 分析main.mk文件 24
2.1.5 Build系统的编译目标介绍 28
2.1.6 分析config.mk文件 29
2.1.7 分析product_config.mk文件 32
2.1.8 Android5.0中的64位编译 35
2.2 Android的产品配置文件 36
2.2.1 分析hammerhead的配置文件 36
2.2.2 编译类型eng,user和userdebug 40
2.2.3 产品的Image文件 41
2.2.4 如何加快编译速度 43
2.2.5 如何编译Android的模拟器 44
2.3 编译Android的模块 44
2.3.1 模块编译变量简介 45
2.3.2 常用模块定义实例 46
2.3.3 预编译模块的目标定义 48
2.3.4 常用“LOCAL_” 变量 50
2.4 Android中的签名 52
2.4.1 Android应用签名方法 53
2.4.2 Android系统签名介绍 55
2.4.3 Android签名漏洞分析 56
第3章 Android的Bionic 59
3.1 Bionic简介 59
3.1.1 Bionic的特性 59
3.1.2 Bionic中的模块简介 62
3.2 Bionic C库中的系统调用 64
3.2.1 系统调用简介 64
3.2.2 系统调用的实现方法 65
3.3 Bionic中的内存管理函数 66
3.3.1 系统调用brk和mmap 66
3.3.2 dlmalloc简介 67
3.3.3 dlmalloc函数用法指南 69
3.4 管道 73
3.4.1 匿名管道PIPE和命名管道FIFO 73
3.4.2 匿名管道的使用方法 74
3.5 Bionic中的线程管理函数 74
3.5.1 Bionic线程函数的特性 75
3.5.2 创建线程和线程的属性 75
3.5.3 退出线程的方法 77
3.5.4 线程本地存储TLS 79
3.5.5 线程的互斥量(Mutex)函数 79
3.5.6 线程的条件量(Condition)函数 81
3.6 Futex同步机制 82
3.6.1 Futex的系统调用 82
3.6.2 Futex的用户态操作 83
3.6.3 Mutex类使用Futex实现同步 84
3.7 Android的 Log模块 85
3.7.1 Android Log 系统的架构 85
3.7.2 Log系统的接口和用法 87
3.7.3 Log系统的实现分析 89
3.8 可执行文件格式分析 93
3.8.1 ELF格式简介 93
3.8.2 ELF文件头格式 94
3.8.3 程序头部表 96
3.8.4 DYNAMIC段 98
3.8.5 函数的重定位过程 101
3.9 Bionic中的Linker模块 104
3.9.1 可执行程序的装载 105
3.9.2 可执行程序的初始化 106
3.9.3 Linker装载动态库 108
3.10 Ptrace和Hook API 113
3.10.1 ptrace函数简介 113
3.10.2 Hook API的原理 114
3.10.3 利用ptrace实现Hook API 115
第4章 Android的Binder 121
4.1 Binder简介 121
4.1.1 Binder对象定义 122
4.1.2 Binder的架构 122
4.1.3 组件Service和匿名Binder服务 124
4.1.4 Binder的层次 124
4.2 如何使用Binder 125
4.2.1 使用Binder服务 125
4.2.2 Binder的混合调用 126
4.2.3 用Jave开发Binder服务 127
4.2.4 用C++开发Binder服务 128
4.3 Binder应用层的核心类 130
4.3.1 IInterface中的两个宏 131
4.3.2 Binder核心类的关系 132
4.3.3 函数asInterface的奥秘 134
4.3.4 Binder的“死亡通知” 135
4.3.5 Jave层的Binder类 136
4.4 Binder的实现原理 140
4.4.1 Binder的线程模型 141
4.4.2 Binder对象的传递 145
4.4.3 分析IPCThreadState类 149
4.5 Binder驱动 154
4.5.1 应用层和驱动的消息协议 154
4.5.2 Binder驱动分析 158
4.5.3 Binder的内存共享机制 160
4.5.4 驱动的ioctl操作 161
4.5.5 Binder调用过程 163
4.5.6 处理传递的Binder对象 169
4.6 ServiceManager的作用 172
4.6.1 ServiceManager的架构 172
4.6.2 ServiceManger提供的服务 175
4.7 匿名共享内存ashmem 179
4.7.1 ashmem的作用和用法 179
4.7.2 ashmem驱动的实现原理 181
4.7.3 ashemem驱动的代码分析 182
4.7.4 进程间传递文件描述符 186
第5章 Android 的JNI 189
5.1 JNI的作用 189
5.2 JNI用法介绍 190
5.2.1 从Java到C/C++ 190
5.2.2 从C/C++到Java的调用 194
5.3 JNI环境 196
5.3.1 结构JNIEnv 196
5.3.2 JNIEnv的创建和初始化 198
5.3.3 JNI中的异常处理 200
5.3.4 JNI中的引用 200
5.3.5 "CheckJNI"的作用 201
5.4 ART带来的JNI变化 202
5.4.1 垃圾回收的影响 202
5.4.2 错误处理的变化 203
5.4.3 堆栈可能引发的问题 203
第6章 Android的同步和消息机制 205
6.1 原子操作 205
6.1.1 Android的原子操作函数 205
6.1.2 原子操作的实现原理 206
6.1.3 内存屏障和编译屏障 207
6.2 Android native层的同步方法 209
6.2.1 互斥体Mutex和自动锁Autolock 210
6.2.2 条件类Condition 212
6.3 Android Java层的同步机制 213
6.3.1 同步关键字synchronized 213
6.3.2 Object类在同步中的作用 215
6.4 Android的消息机制 216
6.4.1 消息模型 216
6.4.2 理解Looper类 218
6.4.3 理解Handler类 220
6.4.4 Message类的setAsynchronous()方法 222
6.4.5 分析MessageQueue类 222
6.5 进程间的消息传递 228
6.5.1 理解Messenger类 228
6.5.2 AsyncChannel类的作用 229
第7章 Android的Init进程 235
7.1 Init进程的初始化过程 237
7.1.1 main函数的流程 237
7.1.2 启动Service进程 243
7.2 解析启动脚本init.rc 246
7.2.1 init.rc文件格式介绍 246
7.2.2 Init脚本的关键字定义 247
7.2.3 脚本文件的解析过程 249
7.2.4 init中启动的守护进程 254
7.3 Init进程对信号的处理 256
7.3.1 “僵尸”(Zombie)进程介绍 256
7.3.2 初始化SIGCHLD信号 257
7.3.3 响应子进程死亡事件 258
7.4 属性系统 260
7.4.1 属性系统介绍 261
7.4.2 创建属性系统的共享空间 263
7.4.3 初始化属性系统的值 265
7.4.4 用户进程初始化属性系统 266
7.4.5 响应修改属性的请求 267
7.5 ueventd介绍 269
7.5.1 ueventd的初始化 269
7.5.2 Netlink Socket简介 271
7.5.3 创建设备节点文件 272
7.6 watchdogd介绍 274
第8章 Android的Zygote进程 277
8.1 Zygote简介 277
8.2 Zygote进程的初始化 277
8.2.1 app_porcess的main函数 279
8.2.2 AndroidRuntime类 282
8.2.3 启动虚拟机 282
8.2.4 ZygoteInit类 285
8.3 Zygote启动应用程序 286
8.3.1 注册Zygote的socket 287
8.3.2 请求启动应用 288
8.3.3 处理启动应用的请求 289
8.3.4 Fork应用进程 290
8.3.5 子进程的初始化 292
8.4 预加载系统类和资源 295
8.4.1 预加载Java类 296
8.4.2 preload-classes文件 297
8.4.3 预加载系统资源 298
8.4.4 预加载共享库 299
第9章 Android的资源管理 301
9.1 资源系统简介 301
9.1.1 缺省资源和候选资源 301
9.1.2 常用术语和单位 302
9.1.3 资源类型 302
9.1.4 系统资源定义 303
9.2 Android资源的制作 305
9.2.1 资源的存储目录 305
9.2.2 候选资源目录的命名规则 306
9.2.3 资源匹配算法 310
9.3 Android资源的使用 311
9.3.1 常规的资源使用方法 311
9.3.2 使用公开和非公开资源 312
9.3.3 图片资源的缩放问题 313
9.4 Android资源管理的实现原理 315
9.4.1 Resources类的作用 315
9.4.2 AssetManager类的作用 319
9.4.3 理解AssetManager的设计 321
9.5 Android 5.0的Material Design 328
9.5.1 Material Design的设计原则 328
9.5.2 Material主题 329
9.5.3 View的阴影 330
第10章 Android的SystemServer进程 333
10.1 SystemServer的创建过程 333
10.1.1 创建SystemServer进程 333
10.1.2 SystemServer初始化 336
10.1.3 SystemServer的服务大全 339
10.2 SystemServer中的Watchdog 342
10.2.1 启动Watchdog 342
10.2.2 Watchdog监控的服务和线程 343
10.2.3 Watchdog监控的原理 345
第11章 Android的应用管理 349
11.1 了解PackageManagerService 350
11.1.1 理解Packages.xml和Settings类 351
11.1.2 服务的初始化过程 354
11.1.3 处理permission文件 363
11.1.4 扫描应用目录的过程 365
11.1.5 解析APK文件 370
11.2 安装应用 372
11.2.1 PackageManagerInstallerService 373
11.2.2 应用安装第一阶段:拷贝文件 374
11.2.3 应用安装第二阶段:装载应用 381
11.3 系统运行时的应用管理 385
11.3.1 卸载应用 385
11.3.2 通过Intent查询组件 388
11.4 守护进程installd 390
11.4.1 installd的初始化 391
11.4.2 变更installd进程的权限 392
11.4.3 installd中支持的命令 393
11.4.4 分析install(安装)命令 394
11.4.5 分析patchoat(优化)命令 396
11.4.6 分析movefiles(移动)命令 398
第12章 Android的组件管理 399
12.1 应用进程的组成 399
12.1.1 ApplicationThread的作用 400
12.1.2 理解应用的Context 401
12.1.3 Application类 402
12.2 ActivityManagerService服务 405
12.2.1 ActivityManagerService的初始化 406
12.2.2 理解setSystemProcess()方法 408
12.2.3 理解systemReady()方法 409
12.3 Process管理 413
12.3.1 如何启动进程 413
12.3.2 调整进程的位置 415
12.3.3 ProcessList的常量 419
12.3.4 调整进程的oom_adj值 420
12.4 Activity管理 423
12.4.1 Activity的生命周期 424
12.4.2 理解Intent 425
12.4.3 Task和LauncherMode 426
12.5 应用的启动过程 429
12.5.1 启动Activity 429
12.5.2 resumeTopActivitiesLocked方法 433
12.5.3 ActivityThread的main方法 436
12.5.4 AMS的attachApplication方法 437
12.5.5 应用的handleBindApplication方法 439
12.6 Service管理 441
12.6.1 Service 的生命周期 442
12.6.2 理解Service的管理类 443
12.6.3 Service的启动过程 444
12.7 ContentProvider管理 449
12.7.1 理解ContentProvider 449
12.7.2 获取ContentProvider 452
12.7.3 应用中安装ContentProvider 456
12.7.4 发布ContentProvider 458
12.8 BroadcastReceiver管理 460
12.8.1 理解BroadcastReceiver 460
12.8.2 广播的种类 462
12.8.3 广播的数据结构 462
12.8.4 广播的注册过程 463
12.8.5 广播的发送过程 466
第13章 Android的多用户模式 475
13.1 UserManagerService服务 475
13.1.1 初始化 475
13.1.2 用户的UserInfo定义 477
13.1.3 用户限制(Restriction) 478
13.1.4 添加用户 479
13.1.5 删除用户 481
13.1.6 Guest用户 483
13.2 PackageManagerService和多用户 484
13.2.1 创建用户的应用数据 484
13.2.2 删除用户的应用数据 485
13.3 AcitivtyManagerServier和多用户 486
13.3.1 用户的状态 486
13.3.2 切换当前用户 486
13.3.3 停止用户运行 492
第14章 Android的图形显示系统 495
14.1 理解Surface 495
14.1.1 应用中Surface的创建过程 495
14.1.2 WMS中Surface的创建过程 498
14.1.3 ComposerService的作用 501
14.1.4 SurfaceFlinger中创建Surface 503
14.1.5 管理图像缓冲区 507
14.1.6 创建GraphicBuffer对象 510
14.2 图像显示原理 514
14.2.1 Project Buffer简介 515
14.2.2 VSync信号的生成 518
14.2.3 Framebuffer的工作原理 521
14.2.4 分配图像缓冲区的内存 524
14.3 SurfaceFlinger服务 528
14.3.1 SurfaceFlinger的启动过程 529
14.3.2 MessageQueue和EventThread 531
14.3.3 理解DisplayDevice类 533
14.3.4 VSync信号的分发过程 537
14.4 图像的输出过程 542
14.4.1 图像的输出过程 542
14.4.2 理解handleTransaction函数 544
14.4.3 理解handlePageFlip函数 550
14.4.4 理解rebuildLayerStacks函数 552
14.4.5 理解setUpHWComposer函数 556
14.4.6 理解doComposition函数 557
14.4.7 理解postFramebuffer函数 559
14.5 总结 560
第15章 Android的窗口系统 561
15.1 应用进程和WMS的联系 561
15.1.1 应用中的Window对象 561
15.1.2 应用中的WindowManager类 562
15.1.3 建立应用和WMS的联系 564
15.1.4 WMS中建立和应用的联系 567
15.1.5 理解DecorView 569
15.2 WindowManagerService服务 570
15.2.1 PhoneWindowManager对象 571
15.2.2 WindowToken对象 571
15.2.3 窗口类型定义 572
15.2.4 新增窗口的过程 574
15.2.5 确定窗口的Z轴位置 579
15.3 确定窗口尺寸 584
15.3.1 Overscan区域 584
15.3.2 表示窗口尺寸的数据结构 585
15.3.3 计算窗口的尺寸 587
15.4 窗口动画管理 591
15.4.1 接收VSync信号 592
15.4.2 动画的显示过程 595
15.4.3 WindowStateAnimator 599
15.4.4 生成动画并显示 601
15.5 总结 602
第16章 Android 的输入管理 603
16.1 InputManagerService 603
16.1.1 服务的启动过程 603
16.1.2 EventHub的作用 606
16.1.3 读取RawEvent 609
16.1.4 处理RawEvent 611
16.1.5 分发输入消息 615
16.2 应用进程处理Input消息 618
16.2.1 理解InputChannel 619
16.2.2 接收Input消息 623
16.2.3 理解InputStage 627
16.2.4 流水线处理Input消息 632
16.3 总结 637
第17章 Android的电源管理 639
17.1 PowerManagerService 639
17.1.1 初始化过程 640
17.1.2 SystemReady方法 641
17.1.3 userActivity接口 643
17.1.4 gotoSleep接口 644
17.2 控制系统休眠的机制 645
17.2.1 PMS中WakeLock相关接口 645
17.2.2 WakeLock的native层实现 647
17.2.3 理解updatePowerStateLocked方法 649
17.2.4 管理显示设备 654
17.3 电池管理服务 657
17.3.1 BatteryService类的作用 657
17.3.2 Healthd守护进程 659
17.3.3 BatteryMonitor类 662
第18章 Android的存储系统 665
18.1 Vold守护进程 666
18.1.1 Vold的main函数 666
18.1.2 Vold的NetlinkManager对象 667
18.1.3 处理block类型的uevent 668
18.1.4 处理MountService的命令 673
18.1.5 VolumeManager的作用 675
18.2 MountService服务 680
18.2.1 MountService的启动过程 680
18.2.2 NativeDaemonConnector 681
18.2.3 Obb文件系统 684
18.3 其它存储相关的服务 688
18.3.1 DeviceStorageMonitorService 688
18.3.2 DiskStatsService 691
第19章 Android的网络管理框架 693
19.1 Netd守护进程 693
19.1.1 Netd的架构 694
19.1.2 处理net 类型的uevent 695
19.1.3 处理NMS的命令 697
19.1.4 DNS服务代理 698
19.1.5 MDnsSdListener的作用 700
19.2 ConnectivityService服务 700
19.2.1 初始化过程 701
19.2.2 网络连接类型 702
19.2.3 NetworkStateTracker对象的作用 704
19.3 NetworkManagementService服务 707
19.4 总结 710
第20章 Android的音频系统 711
20.1 音频系统简介 711
20.1.1 Linux的音频架构 711
20.1.2 手机中的音频设备 712
20.1.3 Audio系统的架构 713
20.2 AudioPolicyService服务 714
20.2.1 服务的创建过程 714
20.2.2 管理音频路由策略 717
20.2.3 管理输入输出设备 722
20.3 AudioFlinger服务 725
20.3.1 AudioFlinger的创建过程 725
20.3.2 AudioFlinger中的线程 727
20.3.3 MixerThread线程 729
20.3.4 OpenOutput函数 732
20.4 一次完整的播放过程 734
20.4.1 创建AudioTrack对象 734
20.4.2 在native层的AudioTrack 738
20.4.3 开始播放 744
20.4.4 传递音频数据 747
20.4.5 AudioFlinger的播放线程 752
第21章 Android的SELinux模块 757
21.1 SELinux简介 757
21.1.1 DAC和MAC 757
21.1.2 SELinux的架构 758
21.1.3 安全上下文 759
21.1.4 域的转移 761
21.1.5 常用命令 763
21.2 SEAndroid简介 763
21.2.1 SEAndroid的组成 764
21.2.2 理解各种策略文件 765
21.3 Android如何使用SELinux 769
21.3.1 Init进程设置SELinux的Policy 769
21.3.2 Init进程初始化安全上下文 772
21.3.3 设置守护进程的安全上下文 775
21.3.4 设置应用进程的安全上下文 776
21.4 总结 781
第22章 Dalvik和ART虚拟机 783
22.1 Dalvik虚拟机简介 783
22.1.1 Dalvik虚拟机的特点 783
22.1.2 即时编译JIT 784
22.2 Dalvik的启动和初始化 785
22.2.1 启动的流程分析 785
22.2.2 初始化gDvm 786
22.3 Dalvik字节码的执行过程 789
22.3.1 执行流程 789
22.3.2 代码分析 790
22.4 Dalvik的内存管理机制 793
22.4.1 堆的初始化过程 793
22.4.2 Dalvik内存分配机制 801
22.4.3 软引用,弱引用和虚引用 805
22.4.4 Dalvik的内存回收机制 806
22.5 ART模式简介 815
22.5.1 两种模式的区别 816
22.5.2 ART的初始化 817
22.5.3 ART开始运行 821
第23章 Android的Recovery模块 824
23.1 Recovery模块的执行 825
23.1.1 Recovery模块的启动 825
23.1.2 如何传递启动参数 828
23.1.3 执行菜单命令 831
23.2 Recovery的升级过程 833
23.2.1 sideload方式安装 833
23.2.2 升级的入口函数 834
23.3 update-binary模块 837
23.3.1 update-binary的执行流程 838
23.3.2 update-script的语法规则 840
第24章 Android的调试方法 843
24.1 获取和分析系统Log 843
24.1.1 Logcat使用说明 843
24.1.2 如何分析Android Log 845
24.1.3 如何分析ANR 849
24.2 内存泄露的分析方法 852
24.2.1 DDMS的AllocationTracker 852
24.2.2 DDMS的DumpHeap工具 853
24.2.3 使用MAT分析内存泄露 854
24.2.4 使用Valgrind分析内存泄露 855
24.3 Android的自动化测试 857
24.3.1 Monkey 857
24.3.2 Monkeyrunner 859
24.3.3 uiAutomator工具 862