全書從操作系統的基礎知識入手,剖析進程/線程、內存管理、Binder機制、GUI顯示系統、多媒體管理、輸入系統、虛擬機等核心技術在Android中的實現原理。書中講述的知識點大部分來源于工程項目研發,因而具有較強的實用性,希望可以讓讀者"知其然,更知其所以然"。本書分為編譯篇、系統原理篇、應用原理篇、系統工具篇,共4篇25章,基本涵蓋了參與Android開發所需具備的知識,并通過大量圖片與實例來引導讀者學習,以求盡量在源碼分析外為讀者提供更易于理解的思維方式。
本書既適合Android系統工程師,也適合于應用開發工程師來閱讀,從而提升Android開發能力。讀者可以在本書潛移默化的學習過程中更深刻地理解Android系統,并將所學知識自然地應用到實際開發難題的解決中。
基于Android SDK zui新版本
剖析了進程/線程、內存管理、Binder機制、GUI顯示系統、多媒體管理、輸入系統等核心知識在Android中的實現原理 Android安全機制 虛擬 內存優化 性能優化
通過大量圖片與實例來引導讀者學習,以求盡量在源碼分析外,為讀者提供更易于理解的思維路徑
由淺入深,由總體框架再到細節實現,讓讀者盡快了解Android內核的設計思想
林學森,作者曾于多家跨國企業擔任研發和管理工作,并已在國內外會議、雜志上發表多篇一作文章,獲得多個發明專利。現為某世界500強科技公司高級專家、博學架構師,在業界也比較有影響力。
目 錄
第1篇 Android編譯篇
第1章 Android系統簡介 2
1.1 Android系統發展歷程 2
1.2 Android系統特點 4
1.3 Android系統框架 8
第2章 Android源碼下載及編譯 11
2.1 Android源碼下載指南 11
2.1.1 基于Repo和Git的
版本管理 11
2.1.2 Android源碼下載流程 12
2.2 原生Android系統編譯指南 16
2.2.1 建立編譯環境 16
2.2.2 編譯流程 19
2.3 定制產品的編譯與燒錄 22
2.3.1 定制新產品 22
2.3.2 Linux內核編譯 26
2.3.3 燒錄/升級系統 27
2.4 Android Multilib Build 28
2.5 Android系統映像文件 31
2.5.1 boot.img 32
2.5.2 ramdisk.img 34
2.5.3 system.img 35
2.5.4 Verified Boot 35
2.6 ODEX流程 37
2.7 OTA系統升級 39
2.7.1 生成升級包 39
2.7.2 獲取升級包 40
2.7.3 OTA升級—Recovery
模式 41
2.8 Android反編譯 44
2.9 NDK Build 46
2.10 第三方ROM的移植 48
第3章 Android編譯系統 50
3.1 Makefile入門 50
3.2 Android編譯系統 52
3.2.1 Makefile依賴樹的概念 53
3.2.2 Android編譯系統抽象
模型 53
3.2.3 樹根節點droid 54
3.2.4 main.mk解析 55
3.2.5 droidcore節點 59
3.2.6 dist_files 61
3.2.7 Android.mk的編寫規則 61
3.3 Jack Toolchain 64
3.4 SDK的編譯過程 68
3.4.1 envsetup.sh 68
3.4.2 lunch sdk-eng 70
3.4.3 make sdk 75
3.5 Android系統GDB調試 85
第2篇 Android原理篇
第4章 操作系統基礎 90
4.1 計算機體系結構
(Computer Architecture) 90
4.1.1 馮 諾依曼結構 90
4.1.2 哈佛結構 90
4.2 什么是操作系統 91
4.3 進程間通信的經典實現 93
4.3.1 共享內存
(Shared Memory) 94
4.3.2 管道(Pipe) 95
4.3.3 UNIX Domain Socket 97
4.3.4 RPC(Remote Procedure Calls) 99
4.4 同步機制的經典實現 100
4.4.1 信號量(Semaphore) 100
4.4.2 Mutex 101
4.4.3 管程(Monitor) 101
4.4.4 Linux Futex 102
4.4.5 同步范例 103
4.5 Android中的同步機制 104
4.5.1 進程間同步——Mutex 104
4.5.2 條件判斷——Condition 105
4.5.3 "柵欄、障礙"
——Barrier 107
4.5.4 加解鎖的自動化操作
——Autolock 108
4.5.5 讀寫鎖——Reader
WriterMutex 109
4.6 操作系統內存管理基礎 110
4.6.1 虛擬內存
(Virtual Memory) 110
4.6.2 內存保護
(Memory Protection) 113
4.6.3 內存分配與回收 113
4.6.4 進程間通信——mmap 114
4.6.5 寫時拷貝技術
(Copy on Write) 115
4.7 Android中的Low
Memory Killer 115
4.8 Android匿名共享內存
(Anonymous Shared Memory) 118
4.8.1 Ashmem設備 118
4.8.2 Ashmem應用實例 122
4.9 JNI 127
4.9.1 Java函數的本地實現 127
4.9.2 本地代碼訪問JVM 130
4.10 Java中的反射機制 132
4.11 學習Android系統的兩條線索 133
第5章 Android進程/線程和
程序內存優化 134
5.1 Android進程和線程 134
5.2 Handler, MessageQueue,
Runnable與Looper 140
5.3 UI主線程——ActivityThread 147
5.4 Thread類 150
5.4.1 Thread類的內部原理 150
5.4.2 Thread休眠和喚醒 151
5.4.3 Thread實例 155
5.5 Android應用程序如何利用
CPU的多核處理能力 157
5.6 Android應用程序的典型啟
動流程 157
5.7 Android程序的內存管理與優化 159
5.7.1 Android系統對內存使用
的限制 159
5.7.2 Android中的內存泄露與
內存監測 160
第6章 進程間通信 — Binder 166
6.1 智能指針 169
6.1.1 智能指針的設計理念 169
6.1.2 強指針sp 172
6.1.3 弱指針wp 173
6.2 進程間的數據傳遞載體
——Parcel 179
6.3 Binder驅動與協議 187
6.3.1 打開Binder驅動
——binder_open 188
6.3.2 binder_mmap 189
6.3.3 binder_ioctl 192
6.4 "DNS"服務器——Service
Manager(Binder Server) 193
6.4.1 ServiceManager的啟動 193
6.4.2 ServiceManager的構建 194
6.4.3 獲取ServiceManager服
務—設計思考 199
6.4.4 ServiceManagerProxy 203
6.4.5 IBinder和BpBinder 205
6.4.6 ProcessState和IPCThreadState 207
6.5 Binder客戶端——Binder Client 237
6.6 Android接口描述語言——AIDL 242
6.7 匿名Binder Server 254
第7章 Android啟動過程 257
7.1 及時個系統進程(init) 257
7.1.1 init.rc語法 257
7.1.2 init.rc實例分析 260
7.2 系統關鍵服務的啟動簡析 261
7.2.1 Android的"DNS服務器"
——ServiceManager 261
7.2.2 "孕育"新的線程和進程
——Zygote 261
7.2.3 Android的"系統服務"
——SystemServer 274
7.2.4 Vold和External Storage
存儲設備 276
7.3 多用戶管理 282
第8章 管理Activity和組件運行狀
態的系統進程——Activity ManagerService(AMS) 284
8.1 AMS功能概述 284
8.2 管理當前系統中Activity
狀態——Activity Stack 286
8.3 startActivity流程 288
8.4 完成同一任務的"集合"——Activity Task 296
8.4.1 "后進先出"——Last In,First Out 297
8.4.2 管理Activity Task 298
8.5 Instrumentation機制 300
第9章 GUI系統 — SurfaceFlinger 305
9.1 OpenGL ES與EGL 305
9.2 Android的硬件接口——HAL 307
9.3 Android終端顯示設備的"化身"
——Gralloc與Framebuffer 309
9.4 Android中的本地窗口 313
9.4.1 FramebufferNativeWindow 315
9.4.2 應用程序端的本地窗口——Surface 321
9.5 BufferQueue詳解 325
9.5.1 BufferQueue的內部原理 325
9.5.2 BufferQueue中的緩沖區
分配 328
9.5.3 應用程序的典型繪圖
流程 333
9.5.4 應用程序與BufferQueue
的關系 339
9.6 SurfaceFlinger 343
9.6.1 "黃油計劃"——Project Butter 343
9.6.2 SurfaceFlinger的啟動 347
9.6.3 接口的服務端——Client 351
9.7 VSync的產生和處理 355
9.7.1 VSync信號的產生和
分發 355
9.7.2 VSync信號的處理 361
9.7.3 handleMessageTransaction 363
9.7.4 "界面已經過時/無效,需要重
新繪制"——handleMessage Invalidate 367
9.7.5 合成前的準備工作
——preComposition 369
9.7.6 可見區域
——rebuildLayerStacks 371
9.7.7 為"Composition"搭建環境
——setUpHWComposer 375
9.7.8 doDebugFlashRegions 377
9.7.9 doComposition 377
第10章 GUI系統之"窗口管理員"
—WMS 385
10.1 "窗口管理員"——WMS綜述 386
10.1.1 WMS的啟動 388
10.1.2 WMS的基礎功能 388
10.1.3 WMS的工作方式 389
10.1.4 WMS,AMS與Activity
間的聯系 390
10.2 窗口屬性 392
10.2.1 窗口類型與層級 392
10.2.2 窗口策略
(Window Policy) 396
10.2.3 窗口屬性
(LayoutParams) 398
10.3 窗口的添加過程 400
10.3.1 系統窗口的添加過程 400
10.3.2 Activity窗口的添加
過程 409
10.3.3 窗口添加實例 412
10.4 Surface管理 416