《深入解析Android 5.0系统》PDF下载

  • 购买积分:20 如何计算积分?
  • 作  者:刘超著
  • 出 版 社:北京:人民邮电出版社
  • 出版年份:2015
  • ISBN:9787115384560
  • 页数:709 页
图书介绍:本书覆盖了Android系统中下层所有重要的模块,如多媒体,Webkit,通信模块等的实现等各个方面,本书有三个特点:一是新,全书基于最新的Android5.0的代码分析讲解;二是全,对Android的覆盖面比较广,5.0中增加的新功能,如ART等都有介绍。同时书基于一套源码分析讲解,很多模块前后能相互印证;三是细,除了对各个模块的功能进行详细的讲解说明外,对书中摘录的源码也做了详细的注释。

第1章 建立Android系统开发环境 1

1.1 安装操作系统 1

1.1.1 安装方式的选择 1

1.1.2 下载和安装Ubuntu 1

1.1.3 使用Ubuntu遇到的问题 2

1.2 安装开发包 3

1.2.1 安装JDK 1.6 3

1.2.2 安装OpenJDK 1.7 4

1.2.3 安装编译需要的开发包 4

1.3 安装一些有用的工具 4

1.3.1 安装Android SDK 4

1.3.2 安装Android Studio 4

1.3.3 安装Source Insight 5

1.3.4 安装比较工具Meld 5

1.4 下载源码 5

1.4.1 Git and Repo简介 5

1.4.2 源码版本历史 6

1.4.3 下载Android源码 7

1.4.4 下载Kernel源码 8

第2章 Android的编译环境——Build系统 10

2.1 Android Build系统核心 10

2.1.1 编译环境的建立 11

2.1.2 Build相关的环境变量 14

2.1.3 Build系统的层次关系 15

2.1.4 分析main.mk文件 17

2.1.5 Build系统的编译目标介绍 20

2.1.6 分析config.mk文件 22

2.1.7 分析product_config.mk文件 24

2.1.8 Android 5.0中的64位编译 26

2.2 Android的产品配置文件 27

2.2.1 分析hammerhead的配置文件 27

2.2.2 编译类型eng、 user和userdebug 31

2.2.3 产品的Image文件 32

2.2.4 如何加快编译速度 33

2.2.5 如何编译Android的模拟器 34

2.3 编译Android的模块 34

2.3.1 模块编译变量简介 35

2.3.2 常用模块定义实例 36

2.3.3 预编译模块的目标定义 37

2.3.4 常用“LOCAL”变量 39

2.4 Android中的签名 40

2.4.1 Android应用签名方法 41

2.4.2 Android系统签名介绍 43

2.4.3 Android签名漏洞分析 44

第3章 连接Android和Linu内核的桥梁——Android的Bionic 46

3.1 Bionic简介 46

3.1.1 Bionic的特性 46

3.1.2 Bionic中的模块简介 49

3.2 Bionic C库中的系统调用 50

3.2.1 系统调用简介 50

3.2.2 系统调用的实现方法 51

3.3 Bionic中的内存管理函数 52

3.3.1 系统调用brk和mmap 52

3.3.2 内存分配器——dlmalloc简介 53

3.3.3 dlmalloc函数用法指南 54

3.4 管道 57

3.4.1 匿名管道PIPE和命名管道FIFO 57

3.4.2 匿名管道的使用方法 58

3.5 Bionic中的线程管理函数 59

3.5.1 Bionic线程函数的特性 59

3.5.2 创建线程和线程的属性 59

3.5.3 退出线程的方法 61

3.5.4 线程本地存储TLS 62

3.5.5 线程的互斥量(Mutex)函数 63

3.5.6 线程的条件量(Condition)函数 65

3.6 Futex同步机制 66

3.6.1 Futex的系统调用 66

3.6.2 Futex的用户态操作 67

3.6.3 Mutex类使用Futex实现同步 68

3.7 Android的Log模块 68

3.7.1 Android Log系统的架构 69

3.7.2 Log系统的接口和用法 70

3.7.3 Log系统的实现分析 71

3.8 可执行文件格式分析 75

3.8.1 ELF格式简介 75

3.8.2 ELF文件头格式 76

3.8.3 程序头部表 77

3.8.4 与重定位相关的“节区”的信息——DYNAMIC段 79

3.8.5 函数的重定位过程 81

3.9 Bionic中的Linker模块 84

3.9.1 可执行程序的装载 84

3.9.2 可执行程序的初始化 85

3.9.3 Linker装载动态库 87

3.10 调试器——Ptrace和Hook API 91

3.10.1 ptrace函数简介 91

3.10.2 Hook API的原理 92

3.10.3 利用ptrace实现Hook API 93

第4章 进程间通信——Android的Binder 98

4.1 Binder简介 98

4.1.1 Binder对象定义 98

4.1.2 Binder的架构 99

4.1.3 组件Service和匿名Binder服务 100

4.1.4 Binder的层次 101

4.2 如何使用Binder 102

4.2.1 使用Binder服务 102

4.2.2 Binder的混合调用 102

4.2.3 用Jave开发Binder服务 103

4.2.4 用C+++开发Binder服务 104

4.3 Binder应用层的核心类 106

4.3.1 IInterface中的两个宏 106

4.3.2 Binder核心类的关系 107

4.3.3 函数asInterface的奥秘 109

4.3.4 Binder的“死亡通知” 110

4.3.5 Jave层的Binder类 111

4.4 Binder的实现原理 115

4.4.1 Binder的线程模型 115

4.4.2 Binder对象的传递 119

4.4.3 分析IPCThreadState类 122

4.5 Binder驱动 126

4.5.1 应用层和驱动的消息协议 126

4.5.2 Binder驱动分析 129

4.5.3 Binder的内存共享机制 130

4.5.4 驱动的ioctl操作 131

4.5.5 Binder调用过程 133

4.5.6 处理传递的Binder对象 138

4.6 解析名称的模块——ServiceManager的作用 140

4.6.1 ServiceManager的架构 141

4.6.2 ServiceManger提供的服务 143

4.7 匿名共享内存ashmem 146

4.7.1 ashmem的作用和用法 146

4.7.2 ashmem驱动的实现原理 148

4.7.3 ashemem驱动的代码分析 149

4.7.4 进程间传递文件描述符 152

第5章 连接Java和C/C+层的关键——Android的JNI 154

5.1 JNI的作用 154

5.2 JNI用法介绍 154

5.2.1 从Java到C/C+++ 154

5.2.2 从C/C+++到Java的调用 158

5.3 JNI环境 160

5.3.1 结构体JNIEnv 160

5.3.2 JNIEnv的创建和初始化 162

5.3.3 JNI中的异常处理 163

5.3.4 JNI中的引用 164

5.3.5 指明错误位置——“CheckJNI”的作用 165

5.4 ART带来的JNI变化 165

5.4.1 垃圾回收的影响 165

5.4.2 错误处理的变化 166

5.4.3 堆栈可能引发的问题 166

第6章 Android的同步和消息机制 167

6.1 原子操作 167

6.1.1 Android的原子操作函数 167

6.1.2 原子操作的实现原理 168

6.1.3 内存屏障和编译屏障 169

6.2 Android native层的同步方法 171

6.2.1 互斥体Mutex和自动锁Autolock 171

6.2.2 解决线程同步——条件类Condition 173

6.3 Android Java层的同步机制 174

6.3.1 同步关键字synchronized 174

6.3.2 Object类在同步中的作用 175

6.4 Android的消息机制 176

6.4.1 消息模型 177

6.4.2 理解Looper类 178

6.4.3 理解Handler类 180

6.4.4 消息的同步——Message类的setAsynchronous()方法 181

6.4.5 分析MessageQueue类 182

6.5 进程间的消息传递 186

6.5.1 理解Messenger类 187

6.5.2 建立通信通道——AsyncChannel类的作用 187

第7章 第一个用户进程——Android的Init进程 192

7.1 Init进程的初始化过程 194

7.1.1 main函数的流程 194

7.1.2 启动Service进程 199

7.2 解析启动脚本init.rc 202

7.2.1 init.rc文件格式介绍 202

7.2.2 Init脚本的关键字定义 203

7.2.3 脚本文件的解析过程 205

7.2.4 Init中启动的守护进程 210

7.3 Init进程对信号的处理 212

7.3.1 “僵尸”(Zombie)进程介绍 212

7.3.2 初始化SIGCHLD信号 212

7.3.3 响应子进程死亡事件 213

7.4 属性系统 215

7.4.1 属性系统介绍 216

7.4.2 创建属性系统的共享空间 218

7.4.3 初始化属性系统的值 219

7.4.4 用户进程初始化属性系统 220

7.4.5 响应修改属性的请求 221

7.5 守护进程ueventd介绍 222

7.5.1 ueventd的初始化 223

7.5.2 内核和用户空间交换信息——Netlink Socket简介 224

7.5.3 创建设备节点文件 225

7.6 “看门狗”watchdogd介绍 227

第8章 支撑Android世界的一极——Zygote进程 229

8.1 Zygote简介 229

8.2 Zygote进程的初始化 229

8.2.1 app_porcess的main函数 230

8.2.2 启动虚拟机——AndroidRuntime类 233

8.2.3 启动虚拟机 234

8.2.4 初始化工作——ZygoteInit类 236

8.3 Zygote启动应用程序 237

8.3.1 注册Zygote的socket 237

8.3.2 请求启动应用 238

8.3.3 处理启动应用的请求 239

8.3.4 Fork应用进程 240

8.3.5 子进程的初始化 241

8.4 预加载系统类和资源 244

8.4.1 预加载Java类 244

8.4.2 preload-classes文件 245

8.4.3 预加载系统资源 247

8.4.4 预加载共享库 247

第9章 精确地控制资源的使用——Android的资源管理 248

9.1 资源系统简介 248

9.1.1 缺省资源和候选资源 248

9.1.2 常用术语和单位 248

9.1.3 资源类型 249

9.1.4 系统资源定义 250

9.2 Android资源的制作 252

9.2.1 资源的存储目录 252

9.2.2 候选资源目录的命名规则 253

9.2.3 资源匹配算法 255

9.3 Android资源的使用 256

9.3.1 常规的资源使用方法 256

9.3.2 使用公开和非公开资源 257

9.3.3 图片资源的缩放问题 258

9.4 Android资源管理的实现原理 260

9.4.1 Resources类的作用 260

9.4.2 AssetManager类的作用 263

9.4.3 理解AssetManager的设计 265

9.5 全新的设计语言——Android 5.0的Material Design 270

9.5.1 Material Design的设计原则 271

9.5.2 Material主题 271

9.5.3 View的阴影 272

第10章 Android系统的核心之——SystemServer进程 274

10.1 SystemServer的创建过程 274

10.1.1 创建SystemServer进程 274

10.1.2 SystemServer初始化 276

10.1.3 SystemServer的服务大全 279

10.2 SystemServer中的Watchdog 281

10.2.1 启动Watchdog 281

10.2.2 Watchdog监控的服务和线程 282

10.2.3 Watchdog监控的原理 283

第11章 APK包的安装、卸载和优化——Android的应用管理 287

11.1 了解PackageManagerService 288

11.1.1 理解Packages.xml和Settings类 289

11.1.2 服务的初始化过程 291

11.1.3 处理permission文件 298

11.1.4 扫描应用目录的过程 300

11.1.5 解析APK文件 304

11.2 安装应用 306

11.2.1 管理“安装会话”——PackageManagerInstaller Service 306

11.2.2 应用安装第一阶段:复制文件 307

11.2.3 应用安装第二阶段:装载应用 313

11.3 系统运行时的应用管理 316

11.3.1 卸载应用 316

11.3.2 通过Intent查询组件 318

11.4 守护进程installd 320

11.4.1 installd的初始化 320

11.4.2 变更installd进程的权限 321

11.4.3 installd中支持的命令 322

11.4.4 分析install(安装)命令 323

11.4.5 分析patchoat(优化)命令 324

11.4.6 分析movefiles(移动)命令 326

第12章 Android的组件管理 327

12.1 应用进程的组成 327

12.1.1 ApplicationThread的作用 328

12.1.2 理解应用的Context 329

12.1.3 Application类 330

12.2 Android框架的核心——ActivityManagerService服务 332

12.2.1 ActivityManagerService的初始化 333

12.2.2 理解setSystemProcess()方法 334

12.2.3 理解systemReady()方法 335

12.3 Process管理 339

12.3.1 如何启动进程 339

12.3.2 调整进程的位置 341

12.3.3 ProcessList的常量 343

12.3.4 调整进程的oom adj值 344

12.4 Activity管理 347

12.4.1 Activity的生命周期 347

12.4.2 理解Intent 348

12.4.3 Task和LauncherMode 349

12.5 应用的启动过程 352

12.5.1 启动Activity 352

12.5.2 resumeTopActivities Locked方法 355

12.5.3 ActivityThread的main方法 357

12.5.4 AM S的attachApplication方法 358

12.5.5 应用的handleBind Application方法 360

12.6 Service管理 361

12.6.1 Service的生命周期 362

12.6.2 理解Service的管理类 363

12.6.3 Service的启动过程 363

12.7 提供数据的访问——ContentProvider管理 368

12.7.1 理解ContentProvider 368

12.7.2 获取ContentProvider 370

12.7.3 应用中安装Content Provider 373

12.7.4 发布ContentProvider 375

12.8 广播——BroadcastReceiver管理 376

12.8.1 理解BroadcastReceiver 377

12.8.2 广播的种类 378

12.8.3 广播的数据结构 378

12.8.4 广播的注册过程 380

12.8.5 广播的发送过程 381

第13章 Android的多用户模式 388

13.1 管理用户的系统服务——UserManagerService服务 388

13.1.1 初始化 388

13.1.2 用户的UserInfo定义 389

13.1.3 用户限制(Restriction) 390

13.1.4 添加用户 391

13.1.5 删除用户 393

13.1.6 Guest用户 395

13.2 PackageManagerService和多用户 395

13.2.1 创建用户的应用数据 395

13.2.2 删除用户的应用数据 396

13.3 ActivityManagerServier和多用户 396

13.3.1 用户的状态 397

13.3.2 切换当前用户 397

13.3.3 停止用户运行 401

第14章 Android的图形显示系统 404

14.1 画布——理解Surface 404

14.1.1 应用中Surface的创建过程 404

14.1.2 WMS中Surface的创建过程 406

14.1.3 单实例模式——ComposerService的作用 410

14.1.4 SurfaceFlinger中创建Surface 411

14.1.5 管理图像缓冲区 414

14.1.6 创建GraphicBuffer对象 417

14.2 图像显示原理 421

14.2.1 Project Buffer简介 421

14.2.2 VSync信号的生成 424

14.2.3 Framebuffer的工作原理 426

14.2.4 分配图像缓冲区的内存 429

14.3 SurfaceFlinger服务 433

14.3.1 SurfaceFlinger的启动过程 433

14.3.2 消息和事件分发——MessageQueue和EventThread 435

14.3.3 显示设备——理解DisplayDevice类 437

14.3.4 VSync信号的分发过程 440

14.4 图像的输出过程 445

14.4.1 图像的输出过程 445

14.4.2 理解handleTransaction函数 446

14.4.3 理解handlePageFlip函数 451

14.4.4 理解rebuildLayerStacks函数 453

14.4.5 更新对象中的图层——理解setUpHWComposer函数 455

14.4.6 合成所有层的图像——理解doComposition函数 457

14.4.7 理解postFramebuffer函数 458

14.5 总结 459

第15章 Android的窗口系统 460

15.1 应用进程和WMS的联系 460

15.1.1 应用中的Window对象 460

15.1.2 应用中的Window Manager类 461

15.1.3 建立应用和WMS的联系 463

15.1.4 WMS中建立和应用的联系 465

15.1.5 理解DecorView 467

15.2 WindowManagerService服务 468

15.2.1 PhoneWindowManager对象 468

15.2.2 WindowToken对象 469

15.2.3 窗口类型定义 469

15.2.4 新增窗口的过程 471

15.2.5 确定窗口的Z轴位置 475

15.3 确定窗口尺寸 479

15.3.1 Overscan区域 479

15.3.2 表示窗口尺寸的数据结构 480

15.3.3 计算窗口的尺寸 481

15.4 窗口动画管理 485

15.4.1 接收VSync信号 485

15.4.2 动画的显示过程 488

15.4.3 窗口的动画对象——WindowStateAnimator 491

15.4.4 生成动画并显示 493

15.5 总结 494

第16章 Android的输入管理 495

16.1 管理各种输入的服务——InputManagerService 495

16.1.1 服务的启动过程 495

16.1.2 把消息统一格式——EventHub的作用 497

16.1.3 读取RawEvent 500

16.1.4 处理RawEvent 501

16.1.5 分发输入消息 505

16.2 应用进程处理Input消息 508

16.2.1 理解InputChannel 508

16.2.2 接收Input消息 511

16.2.3 理解InputStage 515

16.2.4 流水线处理Input消息 518

16.3 总结 523

第17章 Android的电源管理 524

17.1 电源管理服务——PowerManagerService 524

17.1.1 初始化过程 524

17.1.2 系统准备工作——SystemReady方法 525

17.1.3 报告用户活动——userActivity接口 527

17.1.4 强制系统进入休眠模式——gotoSleep接口 528

17.2 控制系统休眠的机制 529

17.2.1 PMS中WakeLock相关接口 529

17.2.2 WakeLock的native层实现 531

17.2.3 理解updatePowerStateLocked方法 532

17.2.4 管理显示设备 536

17.3 电池管理服务 539

17.3.1 BattetyService类的作用 539

17.3.2 Healthd守护进程 541

17.3.3 读取电池的各种参数——Battery Monitor类 543

第18章 Android的存储系统 545

18.1 管理存储设备——Vold守护进程 546

18.1.1 Vold的main函数 546

18.1.2 监听驱动发出的消息——Vold的NetlinkManager对象 547

18.1.3 处理block类型的uevent 548

18.1.4 处理MountService的命令 552

18.1.5 VolumeManager的作用——创建实例对象 554

18.2 对存储设备操作——MountService服务 557

18.2.1 MountService的启动过程 557

18.2.2 进行Socket通信——NativeDaemonConnector 558

18.2.3 OBB文件系统 561

18.3 其他存储相关的服务 564

18.3.1 监视存储设备大小——DeviceStorageMonitor Service 564

18.3.2 打印系统分区信息——DiskStatsService 566

第19章 Android的网络管理框架 567

19.1 管理各种网络设备——Netd守护进程 567

19.1.1 Netd的架构 567

19.1.2 处理net类型的uevent 569

19.1.3 处理NMS的命令 570

19.1.4 DNS服务代理 571

19.1.5 MDnsSdListener的作用——与守护进程进行交互 572

19.2 网络管理的中心——ConnectivityService服务 573

19.2.1 初始化过程 573

19.2.2 网络连接类型 574

19.2.3 NetworkStateTracker对象的作用——获得网络连接信息 576

19.3 完成对网络物理接口操作——NetworkManagementService服务 578

19.4 总结 581

第20章 Android的音频系统 582

20.1 音频系统简介 582

20.1.1 Linux的音频架构 582

20.1.2 手机中的音频设备 582

20.1.3 Audio系统的架构 583

20.2 AudioPolicyService服务——输入输出设备的状态 584

20.2.1 服务的创建过程 584

20.2.2 管理音频路由策略 587

20.2.3 管理输入输出设备 591

20.3 音频的核心——AudioFlinger服务 594

20.3.1 AudioFlinger的创建过程 594

20.3.2 AudioFlinger中的线程 595

20.3.3 MixerThread线程 597

20.3.4 打开物理设备——OpenOutput函数 599

20.4 一次完整的播放过程 601

20.4.1 创建AudioTrack对象 601

20.4.2 在native层的AudioTrack 604

20.4.3 开始播放 609

20.4.4 传递音频数据 612

20.4.5 AudioFlinger的播放线程 616

第21章 让应用更安全——Android的SELinux模块 619

21.1 安全系统——SELinux简介 619

21.1.1 安全机制——DAC和MAC 619

21.1.2 安全模块SELinux的架构 620

21.1.3 安全上下文 621

21.1.4 域的转移 623

21.1.5 常用命令 624

21.2 安全增强型——SEAndroid简介 625

21.2.1 SEAndroid的组成 625

21.2.2 理解各种策略文件 626

21.3 Android如何使用SELinux 629

21.3.1 Init进程设置SELinux的Policy 629

21.3.2 Init进程初始化安全上下文 632

21.3.3 设置守护进程的安全上下文 635

21.3.4 设置应用进程的安全上下文 636

21.4 总结 640

第22章 Dalvik和ART虚拟机 641

22.1 Dalvik虚拟机简介 641

22.1.1 Dalvik虚拟机的特点 641

22.1.2 即时编译JIT 642

22.2 Dalvik的启动和初始化 643

22.2.1 启动的流程分析 643

22.2.2 重要的全局变量——初始化 gDvm 643

22.3 Dalvik字节码的执行过程 646

22.3.1 执行流程 646

22.3.2 代码分析 647

22.4 Dalvik的内存管理机制 649

22.4.1 堆的初始化过程 649

22.4.2 Dalvik内存分配机制 656

22.4.3 软引用、弱引用和虚引用 658

22.4.4 Dalvik的内存回收机制 659

22.5 ART模式简介 667

22.5.1 两种模式的区别 668

22.5.2 ART的初始化 669

22.5.3 ART开始运行 672

第23章 系统升级模块——Android的Recovery模块 674

23.1 Recovery模块的执行 675

23.1.1 Recovery模块的启动 675

23.1.2 如何传递启动参数 677

23.1.3 执行菜单命令 679

23.2 Recovery的升级过程 681

23.2.1 sideload方式安装 681

23.2.2 升级的入口函数 682

23.3 update-binary模块 685

23.3.1 update-binary的执行流程 685

23.3.2 update-script的语法规则 687

第24章 Android的调试方法 689

24.1 获取和分析系统Log 689

24.1.1 Logcat使用说明 689

24.1.2 如何分析Android Log 690

24.1.3 如何分析ANR 694

24.2 内存泄露的分析方法 696

24.2.1 分析内存使用情况——DDMS的Allocation Tracker 696

24.2.2 DDMS的DumpHeap工具 697

24.2.3 使用MAT分析内存泄露 698

24.2.4 使用Valgrind分析内存泄露 699

24.3 Android的自动化测试 700

24.3.1 Monkey 701

24.3.2 让用户开发控制程序——Monkeyrunner 702

24.3.3 UI测试工具——uiAutomator工具 705

参考文献 709