第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 啓動
。。。。。。。
· · · · · · (
收起)