内 容 简 介
Android是一款服务于智能手机和平板电脑等设备的操作系统,截止作者撰写此书时为止,Android在智能手机操作系统市场中已经占有75%的份额。为了让广大读者充分了解这款神奇的操作系统的架构原理,本书循序渐进地分析了Android系统核心源码的基本知识。
本书共分为15章,主要内容包括走进Android世界、硬件抽象层详解、分析JNI(Java本地接口)层、Android内存系统分析、Android虚拟机系统详解、IPC通信机制详解、Zygote进程/System进程和应用程序进程、分析Activity组件、Content Provider数据存储、Broadcast(广播)系统详解、多媒体系统详解、电源管理系统详解、输入系统驱动应用、蓝牙系统详解、网络系统详解等。
本书几乎涵盖了Android源码中的所有核心系统的内容,全书内容通俗易懂,适合Android初学者、Android爱好者、Android底层开发人员、Android应用开发人员阅读和学习,也可以作为相关培训学校和大专院校相关专业的教学用书。
前 言
Android(中文译名为安卓)是IT界巨头Google(谷歌)公司于2007年11月5日推出的一款智能操作系统,最初被应用于智能手机,后来随着版本的更新和发展,也被广泛应用于平板电脑、智能电视、可穿戴设备和健康设备中。Android是一款基于Linux平台的开源操作系统的名称,根据国际数据公司(IDC)公布的数据,Android在智能手机操作系统中的市场占有率已经达到75%。
高份额的市场占有率使得更多的开发人员把目光投入这款神奇的系统,很多初学者也纷纷涌入Android的学习行列中,配合这些需求,Android的各种应用类图书不断涌现并广受欢迎。但美中不足的是,深入源码分析的书籍屈指可数。而源码分析正是通往Android殿堂、跻身为高手的阶梯。
为了让广大初学者可以对Android系统实现“灵与肉”的感知,而不是停留在抽象的原理和概念上,本书对Android系统的源码进行细致的分析,这样做的目的,是提炼出Android系统埋藏于深处的本质和精华的东西,以展示这款神奇的系统究竟是怎样实现的。
1.本书内容
Android系统升级较快,有些代码变动很大。系统自2007年发布第一个版本1.1以来,截至2013年7月发布版本4.3,中间一共存在十多个版本。但据官方统计,到2013年5月5日,占据前三位的版本分别是Android 4.2,Android 4.1和Android 4.3,其实这三个版本的区别并不是很大,只是在某领域的细节上进行了更新。因此,在本书中,我们选择本书最初写作时的最新版本Android 4.3系统的实现。
本书共分15章,依次为走进Android世界、硬件抽象层详解、分析JNI(Java本地接口)层、Android内存系统分析、Android虚拟机系统详解、IPC通信机制详解、Zygote进程/System进程和应用程序进程、分析Activity组件、Content Provider数据存储、Broadcast(广播)系统详解、多媒体系统详解、电源管理系统详解、输入系统驱动应用、蓝牙系统详解、网络系统详解。
本书几乎涵盖Android源码中的所有核心系统的内容,全书通俗易懂,特别有利于初学者学习和消化。
2.本书特色
本书内容十分丰富,分析细致、全面。我们的目标是通过一本图书,提供多本图书的价值,读者可以根据自己的需要,有选择地阅读。
在内容的编写上,本书具有以下特色。
(1) 结构合理
从用户的实际需要出发,科学安排知识结构。全书详细地讲解与Android应用开发有关的源码,内容循序渐进,由浅入深。
(2) 易学易懂
本书条理清晰、语言简洁,可帮助读者快速掌握每个知识点,使读者既可以按照本书编排的章节顺序进行学习,也可以根据自己的需求,对某一章节进行有针对性的学习。
(3) 实用性强
本书彻底摒弃枯燥的理论知识罗列,注重实用性和可操作性,通过细腻的笔法,逐步讲解各个知识点的基本知识。
(4) 内容全面
本书是如今市面上“内容最全的Android源码分析书”,无论是获取源码,还是各个常用、常见的模块系统,在本书中您都能找到解决问题的答案。
3.读者对象
本书适合下列人员阅读和学习:
初学Android编程的自学者。
Android源码分析人员。
Android底层开发人员。
Android系统开发人员。
相关培训机构的教师和学员。
从事Android开发的程序员。
4.作者支持
在编写此书的过程中,得到了清华大学出版社工作人员的大力支持,正是由于各位编辑的求实态度、耐心的工作和奉献精神,才使得本书能够快速出版。
另外也十分感谢我的家人在我写作的时候给予的巨大支持。
由于作者水平有限,本书的疏漏之处在所难免,恳请读者提出意见或建议,以便再版时修订并使之更臻完善。我们提供了售后支持QQ(号码为1727069718),读者如有疑问可以通过QQ提出,将会得到满意的答复。
编 者
目 录
第1章 走进Android世界 1
1.1 Android系统的优势 2
1.1.1 开源 2
1.1.2 强大的开发团队的支持 2
1.1.3 开发人员的支持 2
1.2 Android系统架构介绍 3
1.2.1 底层操作系统层(Linux内核层) 4
1.2.2 库(Libraries)和运行环境(Runtime) 4
1.2.3 应用程序框架(ApplicationFramework) 5
1.2.4 顶层应用程序(Application) 5
1.3 核心组件 5
1.3.1 Activity的界面表现 5
1.3.2 Intent和IntentFilters界面切换 6
1.3.3 Service服务 6
1.3.4 用Broadcast IntentReceiver广播 7
1.3.5 用Content Provider存储 7
1.4 进程和线程 7
1.4.1 什么是进程 7
1.4.2 什么是线程 8
1.5 获取Android 4.3源码 8
1.5.1 在Linux系统中获取Android源码 8
1.5.2 在Windows平台上获取Android源码 9
1.6 Android源码结构分析 14
1.6.1 Android源码的目录结构 15
1.6.2 应用程序 16
1.6.3 应用程序框架 18
1.6.4 系统服务 19
1.6.5 系统程序库 21
1.6.6 系统运行库 24
1.6.7 硬件抽象层 25
1.7 编译Android源码 26
1.7.1 搭建编译环境 27
1.7.2 开始编译 27
1.7.3 在模拟器中运行 29
1.7.4 编译源码生成SDK 30
第2章 硬件抽象层详解 35
2.1 什么是HAL层 36
2.1.1 为什么把对硬件的支持划分为两层来实现 36
2.1.2 HAL层的位置结构 36
2.2 分析HAL Module架构 38
2.2.1 hw_module_t 39
2.2.2 hw_module_methods_t 40
2.2.3 hw_device_t 40
2.3 分析文件hardware.c 41
2.3.1 函数hw_get_module 41
2.3.2 数组variant_keys 41
2.3.3 载入相应的库 42
2.3.4 打开相应库并获得hw_module_t结构体 43
2.4 分析硬件抽象层的加载过程 44
2.5 分析硬件访问服务 48
2.5.1 定义硬件访问服务接口 48
2.5.2 实现硬件访问服务 49
2.6 分析mokoid工程 50
2.6.1 直接调用Service方法实现 51
2.6.2 通过Manager调用Service实现 56
2.7 分析HAL层的具体实现(以Sensor系统为例) 59
2.7.1 传感器系统的基础知识 59
2.7.2 HAL层的Sensor代码 60
2.7.3 Sensor编程的流程 61
第3章 分析JNI(Java本地接口)层 63
3.1 JNI基础 64
3.1.1 JNI的层次结构 64
3.1.2 JNI的本质 64
3.1.3 与JNI相关的文件 65
3.2 分析Java层 66
3.2.1 加载JNI库 66
3.2.2 实现扫描工作 68
3.2.3 读取并保存信息 69
3.2.4 删除不是SD卡中的文件信息 72
3.2.5 直接转向JNI 72
3.2.6 扫描函数scanFile 73
3.2.7 异常处理 73
3.3 分析MediaScanner的JNI层 74
3.3.1 将Native对象的指针保存到Java对象 75
3.3.2 创建Native层的MediaScanner对象 75
3.4 分析MediaScanner的Native层 76
3.4.1 注册JNI函数 76
3.4.2 完成注册工作 78
3.4.3 动态注册 80
3.4.4 处理路径参数 82
3.4.5 扫描文件 83
3.4.6 添加TAG信息 83
3.4.7 JNIEnv接口 85
3.4.8 JNI中的环境变量 86
3.5 JNI实例分析(基于Camera系统) 87
3.5.1 Java层预览接口 87
3.5.2 注册预览的JNI函数 89
3.5.3 C/C++层的预览函数 92
第4章 Android内存系统分析 95
4.1 Android的进程通信机制 96
4.1.1 Android的进程间通信(IPC)机制Binder 96
4.1.2 Service Manager是Binder机制的上下文管理者 97
4.2 分析Ashmem驱动程序 98
4.2.1 基础数据结构 98
4.2.2 初始化处理 99
4.2.3 打开匿名共享内存设备文件 101
4.2.4 内存映射 104
4.2.5 读写操作 105
4.2.6 锁定和解锁 107
4.2.7 回收内存块 113
4.3 分析C++访问接口层 115
4.3.1 接口MemoryHeapBase 115
4.3.2 接口MemoryBase 125
4.4 分析Java访问接口层 128
4.5 内存优化机制 132
4.5.1 sp和wp简析 132
4.5.2 详解智能指针 134
4.5.3 轻量级指针 136
4.5.4 强指针 139
4.5.5 弱指针 153
第5章 Android虚拟机系统详解 159
5.1 Android虚拟机基础 160
5.1.1 Android虚拟机源码目录 160
5.1.2 Dalvik的架构 161
5.1.3 Dalvik虚拟机的主要特征 163
5.1.4 Dalvik的进程管理 163
5.1.5 Android的初始化流程 163
5.2 分析Dalvik的运作流程 164
5.2.1 Dalvik虚拟机相关的可执行程序 164
5.2.2 初始化Dalvik虚拟机 167
5.2.3 启动Zygote 186
5.2.4 启动SystemServer进程 190
5.2.5 加载class类文件 193
5.3 Dalvik VM的内存系统 197
5.3.1 如何分配内存 197
5.3.2 分析内存管理机制的源码 199
5.4 分析Dalvik VM的启动过程 211
5.4.1 创建一个Dalvik VM实例 211
5.4.2 指定控制选项 212
5.4.3 创建并初始化Dalvik VM实例 220
5.4.4 创建JNIEnvExt对象 223
5.4.5 设置当前进程 229
5.4.6 注册Android核心类的JNI方法 229
5.4.7 使用线程创建javaCreateThreadEtc钩子 233
5.5 创建Dalvik VM进程 233
5.5.1 分析底层启动过程 234
5.5.2 创建Dalvik VM进程 234
5.5.3 初始化运行的Dalvik VM 238
第6章 IPC通信机制详解 241
6.1 Binder机制概述 242
6.2 分析Binder驱动程序 243
6.2.1 分析数据结构 243
6.2.2 分析设备初始化 255
6.2.3 打开Binder设备文件 257
6.2.4 内存映射 258
6.2.5 释放物理页面 264
6.2.6 分配内核缓冲区 264
6.2.7 释放内核缓冲区 267
6.2.8 查询内核缓冲区 269
6.3 Binder封装库 270
6.3.1 Binder库的实现层次 270
6.3.2 类BBinder 271
6.3.3 类BpRefBase 274
6.3.4 类IPCThreadState 275
6.4 初始化Java层Binder框架 279
第7章 Zygote进程、System进程和应用程序进程 283
7.1 Zygote(孕育)进程详解 284
7.1.1 Zygote基础 284
7.1.2 分析Zygote的启动过程 285
7.2 System进程详解 303
7.2.1 启动System进程前的准备工作 303
7.2.2 分析SystemServer 304
7.2.3 分析EntropyService 308
7.2.4 分析DropBoxManagerService 310
7.2.5 分析DiskStatsService 318
7.2.6 分析DeviceStorageManagerService 323
7.2.7 分析SamplingProfilerService 326
7.3 应用程序进程详解 336
7.3.1 创建应用程序 336
7.3.2 启动线程池 347
7.3.3 创建信息循环 348
第8章 分析Activity组件 351
8.1 Activity基础 352
8.1.1 Activity的状态 352
8.1.2 Activity的主要函数 353
8.2 启动Activity 355
8.2.1 Launcher启动应用程序 356
8.2.2 返回ActivityManagerService的远程接口 358
8.2.3 解析intent的内容 359
8.2.4 分析检查机制 363
8.2.5 执行Activity组件的操作 378
8.2.6 将Launcher推入Paused状态 386
8.2.7 处理消息 388
8.2.8 报告暂停 389
8.2.9 建立双向连接 394
8.2.10 启动新的Activity 400
8.2.11 发送通知信息 403
第9章 Content Provider数据存储 405
9.1 Content Provider基础 406
9.1.1 Content Provider在应用程序中的架构 406
9.1.2 Content Provider的常用接口 407
9.2 启动Content Provider 408
9.2.1 获得对象接口 408
9.2.2 存在校验 410
9.2.3 启动Android应用程序 416
9.2.4 根据进程启动Content Provider 416
9.2.5 处理消息 422
9.2.6 具体启动 423
9.3 Content Provider数据共享 427
9.3.1 获取接口 427
9.3.2 创建CursorWindow对象 430
9.3.3 数据传递 433
9.3.4 处理进程通信的请求 436
9.3.5 数据操作 442
第10章 Broadcast(广播)系统详解 447
10.1 Broadcast基础 448
10.2 发送广播信息 448
10.2.1 intent描述指示 449
10.2.2 传递广播信息 449
10.2.3 封装传递 450
10.2.4 处理发送请求 451
10.2.5 查找广播接收者 451
10.2.6 处理广播信息 455
10.2.7 检查权限 464
10.2.8 处理的进程通信请求 466
10.3 分析BroadcastReceiver 469
10.3.1 MainActivity的调用 470
10.3.2 注册广播接收者 470
10.3.3 获取接口对象 471
10.3.4 处理进程间的通信请求 474
第11章 多媒体系统详解 479
11.1 Android多媒体系统介绍 480
11.2 OpenMAX框架详解 481
11.2.1 分析OpenMAX框架构成 482
11.2.2 实现OpenMAX IL层接口 486
11.3 分析OpenCore框架 495
11.3.1 OpenCore的层次结构 495
11.3.2 OpenCore的代码结构 496
11.3.3 OpenCore的编译结构 497
11.3.4 操作系统兼容库 501
11.3.5 实现OpenCore中的OpenMAX部分 503
11.3.6 OpenCore扩展详解 517
11.4 Stagefright框架详解 523
11.4.1 Stagefright代码结构 523
11.4.2 Stagefright实现OpenMAX接口 524
11.4.3 分析Video Buffer的传输流程 528
第12章 电源管理系统详解 533
12.1 Android Power Management基础 534
12.2 分析Framework层 535
12.2.1 文件PowerManager.java 535
12.2.2 文件PowerManagerService.java 536
12.3 分析JNI层 560
12.3.1 文件android_os_Power.cpp 560
12.3.2 文件power.c 561
12.4 分析Kernel(内核)层 562
12.4.1 文件power.c 562
12.4.2 文件earlysuspend.c 565
12.4.3 文件wakelock.c 566
12.4.4 文件resume.c 568
12.4.5 文件suspend.c 568
12.4.6 文件main.c 570
12.4.7 proc文件 570
12.5 wakelock和early_suspend 571
12.5.1 wakelock的原理 571
12.5.2 early_suspend的原理 572
12.5.3 Android休眠 572
12.5.4 Android唤醒 575
第13章 输入系统驱动应用 577
13.1 输入系统介绍 578
13.2 分析Input(输入)系统驱动 580
13.2.1 分析头文件 580
13.2.2 分析核心文件input.c 584
13.2.3 分析event机制 600
13.3 分析硬件抽象层 603
13.3.1 分析文件KeycodeLabels.h 603
13.3.2 分析文件KeyCharacterMap.h 608
13.3.3 分析Kl格式的文件 609
13.3.4 分析kcm格式文件 610
13.3.5 分析文件EventHub.cpp 611
13.4 分析驱动的具体实现 615
13.4.1 分析内置模拟器中的输入驱动实现 615
13.4.2 MSM高通处理器中的输入驱动实现 616
13.4.3 OMAP高通处理器中的输入驱动实现 625
第14章 蓝牙系统详解 627
14.1 Android系统中的蓝牙模块 628
14.2 分析蓝牙模块的源码 630
14.2.1 初始化蓝牙芯片 630
14.2.2 蓝牙服务 630
14.2.3 管理蓝牙电源 631
14.3 与蓝牙相关的类 632
14.3.1 BluetoothSocket类 632
14.3.2 BluetoothServerSocket类 633
14.3.3 BluetoothAdapter类 634
14.3.4 BluetoothClass.Service类 641
14.3.5 BluetoothClass.Device类 641
14.4 低功耗蓝牙协议栈详解 642
14.4.1 低功耗蓝牙协议栈基础 642
14.4.2 低功耗蓝牙API详解 643
14.5 Android中的BlueDroid 644
14.5.1 Android系统中BlueDroid的架构 644
14.5.2 Application Framework层分析 645
14.5.3 分析Bluetooth SystemService层 653
14.5.4 分析JNI层 654
14.5.5 分析HAL层 659
14.6 Android蓝牙模块的运作流程 659
14.6.1 打开蓝牙设备 659
14.6.2 搜索蓝牙 665
14.6.3 传输OPP文件 671
第15章 网络系统详解 679
15.1 使用WebKit浏览网页 680
15.1.1 WebKit的Java层框架 681
15.1.2 C/C++层框架 685
15.1.3 分析WebKit的操作过程 688
15.1.4 WebView详解 692
15.1.5 WebViewCore详解 693
15.2 Wi-Fi系统应用 700
15.2.1 Wi-Fi概述 700
15.2.2 Wi-Fi系统的层次结构 701
15.2.3 与Linux的差异 703
15.2.4 分析本地部分的源码 703
15.2.5 分析JNI部分的源码 706
15.2.6 分析Java Framework部分的源码 708
15.2.7 分析Setting中的设置部分的源码 721