内容简介
《拨云见日:基于android的内核与系统架构源码分析》包括上下两篇内容。上篇在保证完整Linux内核架构分析的前提下,着重分析Android系统中强烈依赖的Linux内核机制,如多核ARM架构的支持,而略去Android系统产品化没有用到内核机制,如SWAP机制。下篇主要分析Android系统层主要架构机制,尤其注重分析这些用户态机制与内核机制的接驳与交互。《拨云见日:基于android的内核与系统架构源码分析》整理自作者多年积累的笔记,形式以源代码分析为主。
《拨云见日:基于android的内核与系统架构源码分析》适合相关领域工程师作为实际项目的参考,以及有志于通过研读源码掌握Android系统与Linux内核精髓的读者。
内页插图
精彩书评
★对于像Android、Linux这样复杂的大型软件,如果想要有比较深入透彻的理解,那就非得要阅读分析其源代码不可。王森这本书分享了他所获的知识和心得,书中不光有代码的分析,还有他的见解,特别是还有他的一些经验之谈,相信读者会和我一样看了后觉得受益匪浅。
——《Linux内核源代码情景分析》作者 毛德操
★本书在着力分析Android系统最常用到的内核机制之后,继续向上剖析Android用户层核心机制是如何接驳Linux内核的。而且书中分析涉及到ARM体系为较新CortexA9SMP架构,对于读者开发、研究工作有着实际的借鉴作用。
——红狼软件创始人:《深入剖析Android系统》作者 杨长刚
★作者从研一开始就埋头于Linux源代码的学习、分析。虽然他常常不修边幅,但只要谈起编程或Linux源代码他就两眼放光,滔滔不绝地大谈特谈心得体会。书中源代码注释的写作方式看起来有些简陋,但是这样对阅读Android源代码非常有帮助。
——本书作者同学;CATechnologies研发经理 王晋强
目录
上篇 内核
第1章 ARM多核处理器
1.1 SMP相关基础数据结构
1.2 Percpu内存管理
1.2.1 内核显式定义的处理器局部数据
1.2.2 Percpu内存管理的建立
1.2.3 Percpu动态分配内存空间
1.3 CpuFreq
1.3.1 初始化
1.3.2 CpuFreq策略的建立
1.3.3 Ondemand调频算法分析
1.4 CPU0bootupCPU
1.4.1 CPU0侧策略和动作
1.4.2 CPU1侧执行路线
1.5 CPU1的关闭
1.5.1 关闭时机
1.5.2 CPU1关闭操作
1.6 ARM处理器展望
1.6.1 ARM架构处理器的演进
1.6.2 TrustZone
1.6.3 ARMVirtualization
第2章 异常
2.1 异常向量表
2.1.1 异常进入
2.1.2 异常表的构建
2.2 中断体系
2.2.1 CortexA9多核处理器的中断控制器GIC
2.2.2 MT6577的中断体系
2.2.3 Exynos4的中断体系
2.2.4 OMAP4的中断体系
2.3 中断处理
2.3.1 中断的基本结构
2.3.2 中断源识别
2.4 数据异常
2.5 处理器间通信
第3章 调度与实时性
3.1 Tick
3.1.1 Localtimer
3.1.2 Tick挂载
3.1.3 Tick产生
3.2 Fair调度类
3.2.1 Fair调度类的负载均衡
3.2.2 Fair调度类的处理器选择
3.3 RT调度类
3.3.1 RT调度类的基本结构
3.3.2 Rt_Bandwidth
3.3.3 负载均衡与抢占
3.3.4 基础操作
3.4 调度器
3.4.1 调度域的构建
3.4.2 调度器
3.5 唤醒
3.5.1 唤醒与抢占
3.5.2 跨处理器分发线程
3.5.3 抢占
第4章 Signal
4.1 信号发送
4.2 信号执行
4.2.1 路径切换
4.2.2 ARMLinux下信号执行环境的搭建
4.2.3 Signal处理函数的返回
4.2.4 系统调用重入
第5章 进程与进程内存
5.1 Linux进程
5.1.1 Fork
5.1.2 Exec新进程创建
5.2 CPU与MMU
5.2.1 ARMLinux页表页目录结构
5.2.2 页表页目录的建立
5.3 进程虚拟内存
5.3.1 Android进程虚拟内存的继承
5.3.2 进程虚拟地址空间的获得
第6章 缺页请页与内存Shrink
6.1 缺页与请页
6.1.1 Filebacked虚拟内存段操作函数
6.1.2 Filebacked内存的请页
6.1.3 匿名内存的请页
6.1.4 COW访问
6.2 内存Shrink
6.2.1 Shrink操作shrink_page_list
6.2.2 CleanPage
6.2.3 脏页的监控
6.3 全景图
第7章 块设备
7.1 Bdev文件系统
7.2 块设备基础结构
7.3 块设备的创建与注册
7.4 分区检测生成
7.5 块设备的打开
7.6 块设备驱动的层次结构
7.7 虚拟块设备
第8章 VFS
8.1 根目录
8.1.1 根目录文件系统——initramfs
8.1.2 Androidramdisk.img
8.1.3 传统根目录文件系统加载方式
8.2 文件打开
8.2.1 目录的层级查找
8.2.2 各层次操作函数的安装
8.3 文件写
8.3.1 文件写框架
8.3.2 write_begin
8.3.3 write_end
8.4 脏页的提交与回写机制
8.4.1 脏页的提交
8.4.2 回写时机
8.4.3 回写机制的层次操作
8.4.4 节点层次的回写
第9章 EXT4文件系统
9.1 Android文件系统的选择
9.2 EXT4文件节点
9.2.1 EXT4inode基础结构
9.2.2 EXt4rawinode的定位
9.2.3 EXT4inode的获取
9.3 Mount
9.4 EXT4文件写操作
9.5 EXT4journal
9.6 Extenttree
9.6.1 基础结构
9.6.2 定位逻辑块的structext4_extent
9.6.3 定位逻辑块左右侧的structext4_extent项
9.7 块分配
9.7.1 块组的buddy算法
9.7.2 分配物理块
9.8 逻辑块到物理块的映射
第10章 RCU
10.1 RCUtree
10.1.1 RCUTree结构
10.1.2 RCUtree的构建
10.2 GracePeriod
10.2.1 GracePeriod的检测
10.2.2 重新启动新一轮GracePeriod
10.3 RCU函数的执行
第11章 MMCDriver
11.1 MMCDriver
11.1.1 MMC协议层
11.1.2 MMC块设备
11.2 开源手机U8836D(MT6577)分区的实现
第12章 内核配置系统及内核调试
12.1 Conf
12.1.1 Kconfig元素
12.1.2 Kconfig分析
12.2 内核调试
12.2.1 senix_printk
12.2.2 LOG_BUF
下篇 Dalvik与Android用户态源码分析
第13章 内存
13.1 Dalvik内存管理
13.1.1 虚拟内存分配
13.1.2 内存回收
13.2 Ashmem
13.3 GC
13.3.1 对象Mark
13.3.2 从Root对象集到普通对象
13.3.3 GC与线程实时性
第14章 进程与线程
14.1 Dalvik虚拟机的进程
14.2 Dalvik线程创建机制
14.3 Android线程模型
14.3.1 主线程的生成
14.3.2 线程池线程的生成
14.4 Java线程转换
14.4.1 从Java到JNI
14.4.2 从JNI到Java
第15章 Bionic的动态加载机制
15.1 Linker——用户态入口
15.2 Linker主体——link_image
第16章 Android系统初始
16.1 Android入口
16.2 Init——OS的入口
16.2.1 RC文件分析
16.2.2 RC动作执行
16.2.3 RC的逻辑分析
16.2.4 设备探测
16.2.5 property库的构建
16.2.6 Init的调试
第17章 Interpreter与JIT
17.1 解释器编译结构
17.2 Dalvik寄存器编译模型
17.2.1 Callee寄存器分配
17.2.2 Caller寄存器分配
17.2.3 outs的处理
17.3 PortableInterpreter结构
17.4 ASMInterpreter
17.4.1 基本结构
17.4.2 运行时模型与基本操作
17.4.3 ASMInterpreter入口
17.5 Interpreter的切换
17.6 Dalvik运行时帧结构
17.7 JIT
17.7.1 热点检测
17.7.2 Mode切换
17.7.3 JIT提交
17.8 Compile
17.8.1 基础数据结构
17.8.2 dalvik指令格式分析
17.8.3 TraceRun分析
17.8.4 MIR
17.8.5 基本块的逻辑关系
17.8.6 寄存器分配
17.8.7 LIR
17.8.8 Codecache
17.9 DalvikART
第18章 Binder
18.1 Parcel
18.1.1 C++层的Parcel
18.1.2 Java层的Parcel
18.2 Binder驱动
18.2.1 Binder写
18.2.2 Binder读
18.3 C++层面
18.3.1 本地与远端对象
18.3.2 服务的建立
18.4 Java层面
18.5 service_manager
第19章 Class
19.1 系统类库
19.1.1 Initalclass
19.1.2 ODEX文件的加载
19.1.3 系统类库
19.1.4 preloaded-classes
19.2 类加载
19.2.1 类加载框架
19.2.2 类加载
19.3 对象实体生成
第20章 Android应用框架
20.1 线程池线程
20.1.1 C++层
20.1.2 Java层
20.2 系统侧Activity与Service的生成控制
20.3 classActivityThread
20.3.1 MainLooper
20.3.2 activity与service的加载
第21章 AndroidUI体系
21.1 窗口体系的生成
21.2 ViewRoot与Surface
21.3 编辑框实例分析
21.3.1 ViewRoot获得系统侧代理对象
21.3.2 焦点切换事件——主要AndroidUI机制的互动
21.3.3 输入事件的处理
21.3.4 编辑框的生成
第22章 ADB
22.1 ADB基本结构
22.1.1 连接
22.1.2 主线程
22.1.3 主线程监测的文件句柄
22.2 Transport
22.2.1 初始化
22.2.2 transport传输线程
22.2.3 transport的管理
22.3 Local服务
22.3.1 Local服务的种类
22.3.2 Local服务的形态
22.3.3 SYNC服务
第23章 Android浏览器的Webkit分析
23.1 Webcore
23.1.1 DOM与Rendering树生成
23.1.2 事件的产生与分发
23.2 V8parser源码分析
23.2.1 V8parser处理脚本的层次
23.2.2 Scope
23.2.3 语法分析的入口Parser ParseStatement(…)
23.2.4 普通语句的分析
23.3 指令生成
前言/序言
《深入解析Android:从内核到应用,掌控移动系统底层奥秘》 一、 序言:为何要探究Android的根基? 在智能手机普及的今天,Android已成为全球用户量最大的移动操作系统。我们日常使用的App、流畅的操作体验、丰富的功能设置,背后都离不开一个庞大而精密的系统支撑。然而,大多数用户仅仅是Android的“使用者”,对它如何工作、如何响应指令、如何实现各种高级功能,却知之甚少。这种“知其然,不知其所以然”的状态,限制了我们对技术的深度理解和创新能力。 对于开发者而言,了解Android的底层架构,如同建筑师理解地基和承重墙。只有掌握了核心原理,才能在开发过程中规避潜在问题,优化性能,甚至突破现有框架的限制,创造出更具竞争力的产品。而对于技术爱好者,深入探究Android的“心脏”——内核与系统架构,更是一种极具挑战性和成就感的学习过程,它能让你拨开重重迷雾,真正领略到现代操作系统的设计智慧。 本书的目的,正是要带领您开启一场深入Android系统底层的探索之旅。我们将超越API的表面,直抵内核的脉动,逐一解析Android系统从硬件驱动到上层应用的完整图景。这不是一本简单的API手册,也不是一本停留在应用层开发的教程,而是旨在为您揭示Android系统运作的“黑箱”,让您能够“拨云见日”,清晰地看到其内在的逻辑、精妙的设计和彼此间的协作关系。 二、 Android系统架构概览:多层次的精妙设计 Android的系统架构并非一蹴而就,而是经过多年的发展和演进,形成了一个高度模块化、分层清晰的体系。理解这个分层结构,是深入学习的基础。我们将从最底层开始,自下而上,逐步展开: 1. Linux Kernel(Linux内核): Android最核心的基石,为整个系统提供硬件抽象层(HAL)、进程管理、内存管理、电源管理、安全性和驱动程序等基础服务。熟悉Linux内核对于理解Android的底层运行机制至关重要。我们将深入探讨Android定制的Linux内核特性,以及它如何与硬件进行交互。 2. Hardware Abstraction Layer (HAL)(硬件抽象层): 这是一个关键的抽象层,它为上层框架提供了一套标准的接口,使得上层代码无需关心具体硬件的实现细节。HAL层屏蔽了不同厂商硬件的差异性,提供了统一的接口给Android框架。我们将分析HAL层是如何工作的,以及常见的HAL模块(如相机、音频、传感器等)是如何被实现的。 3. Android Runtime (ART) & Dalvik Runtime (已淘汰)(Android运行时): 这是Android应用程序运行的环境。ART作为现代Android系统的默认运行时,采用 Ahead-Of-Time (AOT) 编译技术,将Dex字节码在应用安装时就编译成本地机器码,极大地提升了应用启动速度和运行效率。我们将深入解析ART的工作原理,包括其编译器、垃圾回收机制等。 4. Native C/C++ Libraries(原生C/C++库): Android系统依赖大量的C/C++编写的原生库,它们提供了诸如Surface Manager、OpenGLES、SQLite、WebKit/Blink等核心功能。这些库的性能和效率直接影响到系统的整体表现。我们将分析这些关键原生库的作用和实现。 5. Java API Framework(Java API框架): 这是开发者最常接触的层次。它提供了一系列丰富的Java类库和API,用于构建应用程序,包括Activity Manager, Package Manager, Content Providers, Broadcast Receivers, Services等。我们将重点关注这些框架组件的设计理念和交互方式。 6. Applications(应用程序): 位于最顶层,是我们日常接触到的各类App。包括系统自带的应用(如电话、短信、浏览器)和用户安装的第三方应用。 三、 Linux内核:Android的基石与驱动的王国 Linux内核是Android系统的“心脏”,负责管理和协调所有硬件资源。在本书中,我们将重点关注Android在Linux内核层面的一些特有考量和优化: 电源管理(Power Management): 移动设备的续航是用户最关心的焦点之一。我们将深入分析Android如何利用Linux内核的电源管理机制,如wakelocks、suspend/resume、power domains等,来精细控制CPU、内存、传感器等组件的功耗。 内存管理(Memory Management): Android设备通常面临内存资源有限的挑战。我们将剖析Linux内核的内存管理策略,以及Android系统如何进行内存分配、回收和优化,例如lowmemorykiller机制。 进程与线程管理(Process & Thread Management): Android应用是基于进程和线程的模型运行的。我们将探讨Linux内核如何管理进程的创建、销毁、调度,以及Android特有的Binder IPC机制如何在进程间实现高效通信。 驱动程序模型(Driver Model): 从硬件驱动到上层应用,驱动程序是连接物理世界和软件世界的桥梁。我们将介绍Linux内核的驱动程序开发模型,并分析Android系统中常见的驱动程序,如相机驱动、音频驱动、显示驱动等。 安全性(Security): Linux内核提供了强大的安全机制,如权限控制、SELinux等。我们将探讨Android如何利用这些机制来保障系统和用户数据的安全。 四、 硬件抽象层 (HAL):屏蔽差异,统一接口 HAL层是Android系统设计中的一个巧妙之处,它使得上层应用框架能够与各种硬件设备进行统一交互,而无需了解具体的硬件实现。 HAL接口与实现: 我们将解析HAL接口的定义方式(通常是C/C++头文件),以及硬件厂商如何为其设备提供相应的HAL实现库(通常是.so文件)。 关键HAL模块剖析: 相机 HAL: 探究相机硬件如何通过HAL提供预览、拍照、录像等功能。 音频 HAL: 分析音频输入、输出、混音等是如何通过HAL实现的。 传感器 HAL: 了解加速度计、陀螺仪、磁力计等传感器数据的获取与处理。 显示 HAL: 揭示SurfaceFlinger如何与显示驱动通过HAL进行交互,实现屏幕内容的绘制与合成。 电源 HAL: 分析电源管理相关的硬件操作如何通过HAL接口暴露。 五、 Android Runtime (ART):应用的执行引擎 ART是Android应用程序运行的核心。它的设计目标是提升性能、优化内存使用,并提供更灵活的应用运行时环境。 Dex文件格式与字节码: 了解Dalvik Executable (Dex) 文件的结构,以及Android应用程序运行在虚拟机中的字节码。 Ahead-Of-Time (AOT) 编译: 深入解析ART的AOT编译过程,包括它如何将Dex字节码转换为本地机器码,以及这种编译方式带来的性能优势。 JIT (Just-In-Time) 编译(部分场景): 虽然AOT是主流,但ART在某些场景下也可能采用JIT编译。我们将探讨这两种编译模式的异同。 垃圾回收 (Garbage Collection, GC): 深入理解ART的垃圾回收机制,包括不同的GC算法,以及它们如何影响应用的内存使用和响应速度。 类加载与方法执行: 分析ART如何加载Java类,以及方法的调用过程。 六、 原生 C/C++ 库:性能担当与底层支撑 Android系统依赖众多高性能的C/C++库来提供核心功能,这些库是系统高效运行的关键。 Binder IPC: 作为Android进程间通信(IPC)的核心机制,Binder的实现原理至关重要。我们将详细解析Binder的Binder Driver、Binder Driver、Binder Service、Binder Client等组件,以及它如何实现跨进程的数据传递和方法调用。 SurfaceFlinger 与 Hardware Composer (HWC): SurfaceFlinger负责管理屏幕上所有图形层的合成,HWC则与GPU/显示硬件紧密协作,完成最终的屏幕渲染。我们将深入分析它们的工作流程,以及它们如何共同实现流畅的UI显示。 SQLite: Android系统广泛使用的本地数据库。我们将探究其在Android中的集成方式,以及其作为系统底层数据存储的作用。 Skia Graphics Engine: Android UI绘制的基础图形库。了解Skia如何渲染各种图形元素,是理解UI绘制过程的关键。 WebKit / Blink (早期) / Chromium (后期): 浏览器引擎的演进。了解Android浏览器和WebView是如何实现网页渲染的。 七、 Java API Framework:应用开发者的乐园 这是开发者最熟悉的层面,但深入理解其设计思想,有助于写出更健壮、更高效的应用。 Activity Management: 深入分析Activity的生命周期,以及Activity Manager Service (AMS) 如何管理和调度Activity。 Service Management: 探索Service的工作机制,以及Service Manager如何提供后台服务。 Content Providers: 理解Content Provider是如何实现应用间数据共享的。 Broadcast Receivers: 分析Android的事件广播机制,以及Broadcast Receiver如何响应系统或应用发出的广播。 Context: 探究Context对象的真正含义,以及它在应用开发中的作用。 UI Toolkit (View System): 深入理解Android的View绘制流程,包括Measure, Layout, Draw三个阶段,以及View的事件分发机制。 八、 系统启动流程:从按下电源键到App启动 我们将详细解析Android系统的完整启动流程,从上电开始,经过Bootloader,Linux Kernel初始化,init进程的启动,Zygote进程的创建,System Server的启动,直到应用程序的启动。 Bootloader: 引导加载程序的作用。 Kernel Bootstrapping: Linux内核的启动与初始化。 Init Process: Android系统的第一个用户空间进程,负责挂载文件系统、启动关键服务。 Zygote Process: Android应用程序的孵化器,预加载通用类,提高应用启动速度。 System Server: Android核心服务的汇聚地,负责启动AMS, PMS, WMS等系统服务。 九、 结论:掌握Android,洞悉未来 通过对Android内核与系统架构的深入剖析,本书旨在为您建立一个全面、清晰的系统认知。您将不再局限于App的开发,而是能够从更高、更深的维度去理解Android系统的运作原理。 掌握了这些底层知识,您将能够: 更有效地进行性能调优: 找到应用性能瓶颈,并从系统层面进行优化。 深入理解系统级问题: 能够诊断和解决各种复杂的系统bug。 进行更高级的定制开发: 为ROM定制、系统工具开发打下坚实基础。 更敏锐地洞察技术趋势: 理解Android未来发展方向,把握技术脉搏。 这是一次挑战,更是一次收获。我们诚邀您一同踏上这场精彩纷呈的Android底层探索之旅,真正做到“拨云见日”,掌握移动操作系统的核心奥秘。