
●目 录篇 Android编译篇章 Android系统简介 21.1 Android系统发展历程 21.2 Android系统特点 41.3 Android系统框架 8第2章 Android源码及编译 112.1 Android源码指南 112.1.1 基于Repo和Git的版本管理 112.1.2 Android源码流程 122.2 原生Android系统编译指南 162.2.1 建立编译环境 162.2.2 编译流程 192.3 定制产品的编译与烧录 222.3.1 定制新产品 222.3.2 Linux内核编译 262.3.3 烧录/升级系统 272.4 Android Multilib Build 282.5 Android系统映像文件 312.5.1 boot.img 322.5.2 ramdisk.img 342.5.3 system.img 352.5.4 Verified Boot 352.6 ODEX流程 372.7 OTA系统升级 392.7.1 生成升级包 392.7.2 获取升级包 402.7.3 OTA升级—Recovery模式 412.8 Android反编译 442.9 NDK Build 462.10 第三方ROM的移植 48第3章 Android编译系统 503.1 Makefile入门 503.2 Android编译系统 523.2.1 Makefile依赖树的概念 533.2.2 Android编译系统抽象 模型 533.2.3 树根节点droid 543.2.4 main.mk解析 553.2.5 droidcore节点 593.2.6 dist_files 613.2.7 Android.mk的编写规则 613.3 Jack Toolchain 643.4 SDK的编译过程 683.4.1 envsetup.sh 683.4.2 lunch sdk-eng 703.4.3 make sdk 753.5 Android系统GDB调试 85第2篇 Android原理篇第4章 操作系统基础 904.1 计算机体系结构(Computer Architecture) 904.1.1 冯 诺依曼结构 904.1.2 哈佛结构 904.2 什么是操作系统 914.3 进程间通信的经典实现 934.3.1 共享内存(Shared Memory) 944.3.2 管道(Pipe) 954.3.3 UNIX Domain Socket 974.3.4 RPC(Remote Procedure Calls) 994.4 同步机制的经典实现 1004.4.1 信号量(Semaphore) 1004.4.2 Mutex 1014.4.3 管程(Monitor) 1014.4.4 Linux Futex 1024.4.5 同步范例 1034.5 Android中的同步机制 1044.5.1 进程间同步——Mutex 1044.5.2 条件判断——Condition 1054.5.3 “栅栏、障碍” ——Barrier 1074.5.4 加解锁的自动化操作——Autolock 1084.5.5 读写锁——ReaderWriterMutex 1094.6 操作系统内存管理基础 1104.6.1 虚拟内存(Virtual Memory) 1104.6.2 内存保护(Memory Protection) 1134.6.3 内存分配与回收 1134.6.4 进程间通信——mmap 1144.6.5 写时拷贝技术(Copy on Write) 1154.7 Android中的LowMemory Killer 1154.8 Android匿名共享内存(Anonymous Shared Memory) 1184.8.1 Ashmem设备 1184.8.2 Ashmem应用实例 1224.9 JNI 1274.9.1 Java函数的本地实现 1274.9.2 本地代码访问JVM 1304.10 Java中的反射机制 1324.11 学习Android系统的两条线索 133第5章 Android进程/线程和程序内存优化 1345.1 Android进程和线程 1345.2 Handler, MessageQueue,Runnable与Looper 1405.3 UI主线程——ActivityThread 1475.4 Thread类 1505.4.1 Thread类的内部原理 1505.4.2 Thread休眠和唤醒 1515.4.3 Thread实例 1555.5 Android应用程序如何利用 CPU的多核处理能力 1575.6 Android应用程序的典型启 动流程 1575.7 Android程序的内存管理与优化 1595.7.1 Android系统对内存使用 的限制 1595.7.2 Android中的内存泄露与 内存监测 160第6章 进程间通信 — Binder 1666.1 智能指针 1696.1.1 智能指针的设计理念 1696.1.2 强指针sp 1726.1.3 弱指针wp 1736.2 进程间的数据传递载体 ——Parcel 1796.3 Binder驱动与协议 1876.3.1 打开Binder驱动——binder_open 1886.3.2 binder_mmap 1896.3.3 binder_ioctl 1926.4 “DNS”服务器——Service Manager(Binder Server) 1936.4.1 ServiceManager的启动 1936.4.2 ServiceManager的构建 1946.4.3 获取ServiceManager服务—设计思考 1996.4.4 ServiceManagerProxy 2036.4.5 IBinder和BpBinder 2056.4.6 ProcessState和IPCThreadState 2076.5 Binder客户端——Binder Client 2376.6 Android接口描述语言——AIDL 2426.7 匿名Binder Server 254第7章 Android启动过程 2577.1 个系统进程(init) 2577.1.1 init.rc语法 2577.1.2 init.rc实例分析 2607.2 系统关键服务的启动简析 2617.2.1 Android的“DNS服务器”——ServiceManager 2617.2.2 “孕育”新的线程和进程——Zygote 2617.2.3 Android的“系统服务”——SystemServer 2747.2.4 Vold和External Storage存储设备 2767.3 多用户管理 282第8章 管理Activity和组件运行状态的系统进程——Activity ManagerService(AMS) 2848.1 AMS功能概述 2848.2 管理当前系统中Activity 状态——Activity Stack 2868.3 startActivity流程 2888.4 完成同一任务的“集合”——Activity Task 2968.4.1 “后进先出”——Last In,First Out 2978.4.2 管理Activity Task 2988.5 Instrumentation机制 300第9章 GUI系统 — SurfaceFlinger 3059.1 OpenGL ES与EGL 3059.2 Android的硬件接口——HAL 3079.3 Android终端显示设备的“化身”——Gralloc与Framebuffer 3099.4 Android中的本地窗口 3139.4.1 FramebufferNativeWindow 3159.4.2 应用程序端的本地窗口——Surface 3219.5 BufferQueue详解 3259.5.1 BufferQueue的内部原理 3259.5.2 BufferQueue中的缓冲区分配 3289.5.3 应用程序的典型绘图流程 3339.5.4 应用程序与BufferQueue的关系 3399.6 SurfaceFlinger 3439.6.1 “黄油计划”——Project Butter 3439.6.2 SurfaceFlinger的启动 3479.6.3 接口的服务端——Client 3519.7 VSync的产生和处理 3559.7.1 VSync信号的产生和分发 3559.7.2 VSync信号的处理 3619.7.3 handleMessageTransaction 3639.7.4 “界面已经过时/无效,需要重新绘制”——handleMessage Invalidate 3679.7.5 合成前的准备工作 ——preComposition 3699.7.6 可见区域 ——rebuildLayerStacks 3719.7.7 为“Composition”搭建环境 ——setUpHWComposer 3759.7.8 doDebugFlashRegions 3779.7.9 doComposition 3770章 GUI系统之“窗口管理员” —WMS 38510.1 “窗口管理员”——WMS综述 38610.1.1 WMS的启动 38810.1.2 WMS的基础功能 38810.1.3 WMS的工作方式 38910.1.4 WMS,AMS与Activity 间的 39010.2 窗口属性 39210.2.1 窗口类型与层级 39210.2.2 窗口策略 (Window Policy) 39610.2.3 窗口属性 (LayoutParams) 39810.3 窗口的添加过程 40010.3.1 系统窗口的添加过程 40010.3.2 Activity窗口的添加 过程 40910.3.3 窗口添加实例 41210.4 Surface管理 41610.4.1 Surface申请流程(relayout) 41610.4.2 Surface的跨进程传递 42010.4.3 Surface的业务操作 42210.5 performLayoutAndPlace SurfacesLockedInner 42310.6 窗口大小的计算过程 42410.7 启动窗口的添加与销毁 43310.7.1 启动窗口的添加 43310.7.2 启动窗口的销毁 43710.8 窗口动画 43810.8.1 窗口动画类型 43910.8.2 动画流程跟踪——Window StateAnimator 44010.8.3 AppWindowAnimator 44410.8.4 动画的执行过程 4461章 让你的界面炫彩起来的GUI 系统 — View体系 45211.1 应用程序中的View框架 45211.2 Activity中View Tree的 创建过程 45511.3 在WMS中注册窗口 46111.4 ViewRoot的基本工作方式 46311.5 View Tree的遍历时机 46411.6 View Tree的遍历流程 46811.7 View和ViewGroup属性 47711.7.1 View的基本属性 47711.7.2 ViewGroup的属性 48211.7.3 View、ViewGroup和 ViewParent 48211.7.4 Callback接口 48211.8 “作画“工具集——Canvas 48411.8.1 “绘制UI”——Skia 48511.8.2 数据中介——Surface. lockCanvas 48611.8.3 解锁并提交结果——unlock CanvasAndPost 49011.9 draw和onDraw 49111.10 View中的消息传递 49711.10.1 View中TouchEvent 的投递流程 49711.10.2 ViewGoup中Touch- Event的投递流程 50011.11 View动画 50411.12 UiAutomator 5092章 “问渠哪得清如许,为有源头 活水来”— InputManager Service与输入事件 51412.1 事件的分类 51412.2 事件的投递流程 51712.2.1 InputManagerService 51812.2.2 InputReaderThread 51912.2.3 InputDispatcherThread 51912.2.4 ViewRootImpl对事件 的派发 52312.3 事件注入 5243章 应用不再同质化 — 音频系统 52613.1 音频基础 52713.1.1 声波 52713.1.2 音频的录制、存储 与回放 52713.1.3 音频采样 52813.1.4 Nyquist–Shannon采样 定律 53013.1.5 声道和立体声 53013.1.6 声音定级——Weber– Fechner law 53113.1.7 音频文件格式 53213.2 音频框架 53213.2.1 Linux中的音频框架 53213.2.2 TinyAlsa 53413.2.3 Android系统中的 音频框架 53613.3 音频系统的核心——Audio- Flinger 53813.3.1 AudioFlinger服务的 启动和运行 53813.3.2 AudioFlinger对音频 设备的管理 54013.3.3 PlaybackThread的 循环主体 54713.3.4 AudioMixer 55113.4 策略的制定者——Audio- PolicyService 55313.4.1 AudioPolicyService 概述 55413.4.2 AudioPolicyService 的启动过程 55613.4.3 AudioPolicyService 与音频设备 55813.5 音频流的回放——AudioTrack 56013.5.1 AudioTrack应用实例 56013.5.2 AudioPolicyService 的路由实现 56713.6 音频数据流 57213.6.1 AudioTrack中的音频流 57313.6.2 AudioTrack和AudioFlinger 间的数据交互 57613.6.3 AudioMixer中的 音频流 58213.7 音量控制 58413.8 音频系统的上层建筑 58813.8.1 从功能入手 58813.8.2 MediaPlayer 58913.8.3 MediaRecorder 59213.8.4 一个典型的多媒体 录制程序 59513.8.5 MediaRecorder 源码解析 59613.8.6 MediaPlayerService简析 59813.9 Android支持的媒体格式 60013.9.1 音频格式 60013.9.2 视频格式 60113.9.3 图片格式 60113.9.4 网络流媒体 60213.10 ID3信息简述 60213.11 Android多媒体文件管理 60613.11.1 MediaStore 60713.11.2 多媒体文件信息的 存储“仓库” ——MediaProvider 60813.11.3 多媒体文件管理中 的“生产者” —MediaScanner 611第3篇 应用原理篇4章 Intent的匹配规则 61614.1 Intent属性 61614.2 Intent的匹配规则 61814.3 Intent匹配源码简析 6245章 APK应用程序的资源适配 62815.1 资源类型 62915.1.1 状态颜色资源 63015.1.2 图形资源 63115.1.3 布局资源 63215.1.4 菜单资源 63315.1.5 字符串资源 63315.1.6 样式资源 63415.1.7 其他资源 63515.1.8 属性资源 63515.2 提供可选资源 63815.3 最佳资源的匹配流程 64215.4 屏幕适配 64415.4.1 屏幕适配的重要参数 64415.4.2 如何适配多屏幕 64615.4.3 横竖屏切换的处理 6486章 Android字符编码格式 65016.1 字符编码格式背景 65016.2 ISO/IEC 8859 65116.3 ISO/IEC 10646 65116.4 Unicode 65216.5 String类型 65516.5.1 构建String 65516.5.2 String对多种编码 的兼容 6567章 Android和OpenGL ES 66017.1 3D图形学基础 66117.1.1 计算机3D图形 66117.1.2 图形管线 66217.2 Android中的OpenGL ES简介 66417.3 图形渲染API—EGL 66517.3.1 EGL与OpenGL ES 66517.3.2 egl.cfg 66517.3.3 EGL接口解析 66717.3.4 EGL实例 67017.4 简化OpenGL ES开发 —GLSurfaceView 67017.5 OpenGL分析利器 —GLTracer 6778章 “系统的UI”——SystemUI 68518.1 SystemUI的组成素 68518.2 SystemUI的实现 68718.3 Android壁纸资源 —WallpaperService 69418.3.1 WallPaperManager- Service 69518.3.2 ImageWallpaper 6979章 Android常用的工具“小插件”——Widget机制 70019.1 “功能的提供者”——AppWidgetProvider 70019.2 AppWidgetHost 702第20章 Android应用程序 的编译和打包 70720.1 “另辟蹊径”采用第三方工具——Ant 70720.2 通过命令行编译和打包APK 70820.3 APK编译过程详解 70920.4 信息安全基础概述 71120.5 应用程序签名 71620.6 应用程序签名源码简析 71920.7 APK重签名实例 724第21章 Android虚拟机 72521.1 Android虚拟机基础知识 72521.1.1 Java虚拟机核心概念 72521.1.2 LLVM编译器框架 73421.1.3 Android中的经典 垃圾回收算法 73621.1.4 Art和Dalvik之争 73821.1.5 Art虚拟机整体框架 74121.1.6 Android应用程序与 虚拟机 74221.1.7 Procedure Call Standard for Arm Architecture (过程调用标准) 74421.1.8 C++ 11标准中的新 特性 74621.2 Android虚拟机核心文件格式 —Dex字节码 74921.3 Android虚拟机核心文件格式 —可执行文件的基石ELF 75621.3.1 ELF文件格式 75621.3.2 Linux平台下ELF文件的加载和动态链接过程 76421.3.3 Android Linker和 动态链接库 77121.3.4 Signal Handler和 Fault Manager 78221.4 Android虚拟机核心文件格式 ——“主宰者”OAT 78621.4.1 OAT文件格式解析 78621.4.2 OAT的两个编译时机 79321.5 Android虚拟机的典型 启动流程 80621.6 堆管理器和堆空间释义 81521.7 Android虚拟机中的线程管理 82321.7.1 Java线程的创建过程 82321.7.2 线程的挂起过程 82721.8 Art虚拟机中的代码执行 方式综述 82921.9 Art虚拟机的“中枢系统” ——执行引擎之Interpreter 83621.10 Art虚拟机的“中枢系统”——执行引擎之JIT 83921.10.1 JIT重出江湖的契机 83921.10.2 Android N版本中JIT 的设计目标及策略 84021.10.3 Profile Guided Compilation (追踪技术) 84221.10.4 AOT Compilation Daemon 84321.11 Art虚拟机的“中枢系统” ——执行引擎之本地代码 84421.12 Android x86版本兼容ARM二 进制代码——Native Bridge 86421.13 Android应用程序调试 原理解析 87121.13.1 Java代码调试与 JDWP协议 87221.13.2 Native代码调试 87921.13.3 利用GDB调试 Android Art虚拟机 885第22章 Android安全机制透析 88722.1 Android Security综述 88722.2 SELinux 88922.2.1 DAC 88922.2.2 MAC 89022.2.3 基于MAC的SELinux 89022.3 Android系统安全保护 的三重利剑 89222.3.1 剑:Permission 机制 89322.3.2 加强剑:DAC(UGO) 保护 89622.3.3 终极剑:SEAndroid 89822.4 SEAndroid剖析 89922.4.1 SEAndroid的顶层模型 89922.4.2 SEAndroid相关的核心 源码 90022.4.3 SEAndroid标签和规则 90122.4.4 如何在Android系统中 自定义SEAndroid 90322.4.5 TE文件的语法规则 90522.4.6 SEAndroid中的核心 主体—init进程 90722.4.7 SEAndroid中的客体 91222.5 Android设备Root简析 91322.6 APK的加固保护分析 916第4篇 Android系统工具第23章 IDE和Gradle 92223.1 Gradle的核心要点 92223.1.1 Groovy与Gradle 92323.1.2 Gradle的生命周期 92623.2 Gradle的Console语法 92723.3 Gradle Wrapper和Cache 92923.4 Android Studio和Gradle 93123.4.1 Gradle插件基础知识 93123.4.2 Android Studio中的 Gradle编译脚本 932第24章 软件版本管理 93724.1 版本管理简述 93724.2 Git的安装 93724.2.1 Linux环境下安装Git 93824.2.2 Windows环境下 安装Git 93924.3 Git的使用 93924.3.1 基础配置 93924.3.2 新建仓库 94024.3.3 文件状态 94224.3.4 忽略某些文件 94324.3.5 提交更新 94424.3.6 其他命令 94424.4 Git原理简析 94524.4.1 分布式版本系统的特点 94624.4.2 安全散列算法 —SHA-1 94724.4.3 4个重要对象 94824.4.4 三个区域 95324.4.5 分支的概念与实例 954第25章 系统调试辅助工具 95825.1 万能模拟器——Emulator 95825.1.1 QEMU 95825.1.2 Android工程中 的QEMU 96325.1.3 模拟器控制台 (Emulator Console) 96625.1.4 实例:为Android 模拟器添加串口功能 96925.2 此Android非彼Android 97025.3 快速建立与模拟器或真机的 通信渠道——ADB 97225.3.1 ADB的使用方法 97225.3.2 ADB的组成素 97525.3.3 ADB源代码解析 97625.3.4 ADB Protocol 98125.4 SDK Layoutlib 98425.5 TraceView和Dmtracedump 98525.6 Systrace 98725.7 代码覆盖率统计 99225.8 模拟GPS位置 995

内容简介

全书从操作系统的基础知识入手,全面剖析进程/线程、内存管理、Binder机制、GUI显示系统、多媒体管理、输入系统、虚拟机等核心技术在Android中的实现原理。书中讲述的知识点大部分来源于工程项目研发,因而具有较强的实用性,希望可以让读者“知其然,更知其所以然”。本书分为编译篇、系统原理篇、应用原理篇、系统工具篇,共4篇25章,基本涵盖了参与Android开发所需具备的知识,并通过大量图片与实例来引导读者学习,以求尽量在源码分析外为读者提供更易于理解的思维方式。本书既适合Android系统工程师,也适合于应用开发工程师来阅读,从而提升Android开发能力。读者可以在本书潜移默化的学习过程中更深刻地理解Android系统,并将所学知识自然地应用到实际开发难题的解决中。