第1章 獲取并編譯Android源碼 11.1 獲取Android源碼 1
1.1.1 在Linux系統獲取Android源碼 1
1.1.2 在Windows平臺獲取Android源碼 3
1.2 分析Android源碼結構 6
1.2.1 總體結構 6
1.2.2 應用程序部分 7
1.2.3 應用程序框架部分 9
1.2.4 系統服務部分 10
1.2.5 系統程序庫部分 12
1.2.6 系統運行庫部分 15
1.2.7 硬件抽象層部分 16
1.3 分析源碼中提供的接口 17
1.3.1 暴露接口和隱藏接口 17
1.3.2 調用隱藏接口 23
1.4 編譯源碼 26
1.4.1 搭建編譯環境 26
1.4.2 在模擬器中運行 29
1.5 編譯源碼生成SDK 30
第2章 分析JNI 35
2.1 JNI基礎 35
2.1.1 JNI的功能結構 35
2.1.2 JNI的調用層次 36
2.1.3 分析JNI的本質 36
2.2 分析MediaScanner 38
2.2.1 分析Java層 38
2.2.2 分析JNI層 45
2.2.3 分析Native(本地)層 46
2.3 分析Camera系統的JNI 54
2.3.1 Java層預覽接口 54
2.3.2 注冊預覽的JNI函數 56
2.3.3 C/C++層的預覽函數 59
2.4 Java與JNI基本數據類型轉換 60
2.5 JNIEnv接口 61
2.6 開發JNI程序 62
2.6.1 開發JNI程序的步驟 62
2.6.2 開發一個自己的JNI程序 63
第3章 內存系統架構詳解 66
3.1 分析Android的進程通信機制 66
3.1.1 IPC機制介紹 66
3.1.2 Service Manager是Binder機制的上下文管
理者 67
3.1.3 Service Manager服務 84
3.2 分析匿名共享內存子系統 87
3.2.1 Ashmem系統基礎 87
3.2.2 基礎數據結構 88
3.2.3 初始化處理 89
3.2.4 打開匿名共享內存設備文件 90
3.2.5 實現內存映射 93
3.2.6 實現讀/寫操作 94
3.2.7 實現鎖定和解鎖 96
3.2.8 回收內存塊 102
3.3 分析C++訪問接口層 103
3.3.1 接口MemoryHeapBase 103
3.3.2 接口MemoryBase 112
3.4 分析Java訪問接口層 115
第4章 硬件抽象層架構詳解 120
4.1 HAL基礎 120
4.1.1 推出HAL的背景 120
4.1.2 HAL的基本結構 121
4.2 分析HAL module架構 123
4.2.1 hw_module_t 124
4.2.2 hw_module_methods_t 124
4.2.3 hw_device_t 125
4.3 分析文件hardware.c 126
4.3.1 尋找動態鏈接庫的地址 126
4.3.2 數組variant_keys 126
4.3.3 載入相應的庫 127
4.3.4 獲得hw_module_t結構體 127
4.4 分析硬件抽象層的加載過程 128
4.5 分析硬件訪問服務 132
4.5.1 定義硬件訪問服務接口 132
4.5.2 具體實現 133
4.6 分析官方實例 134
4.6.1 獲取實例工程源碼 135
4.6.2 直接調用service()方法的實現代碼 136
4.6.3 通過Manager調用service的實現代碼 141
4.7 HAL和系統移植 144
4.7.1 移植各個Android部件的方式 144
4.7.2 設置設備權限 144
4.7.3 init.rc初始化 148
4.7.4 文件系統的屬性 148
4.8 開發自己的HAL 150
4.8.1 封裝HAL接口 150
4.8.2 開始編譯 153
第5章 Binder通信機制詳解 155
5.1 分析Binder驅動程序 155
5.1.1 數據結構binder_work 155
5.1.2 結構體binder_node 156
5.1.3 結構體binder_ref 157
5.1.4 通知結構體binder_ref_death 158
5.1.5 結構體binder_buffer 158
5.1.6 結構體binder_proc 159
5.1.7 結構體binder_thread 160
5.1.8 結構體binder_transaction 161
5.1.9 結構體binder_write_read 162
5.1.10 BinderDriverCommandProtocol 162
5.1.11 枚舉BinderDriverReturnProtocol 163
5.1.12 結構體binder_ptr_cookie和
binder_transaction_data 164
5.1.13 結構體flat_binder_object 164
5.1.14 設備初始化 165
5.1.15 打開Binder設備文件 167
5.1.16 實現內存映射 168
5.1.17 釋放物理頁面 173
5.1.18 分配內核緩沖區 174
5.1.19 釋放內核緩沖區 176
5.1.20 查詢內核緩沖區 179
5.2 Binder封裝庫 179
5.2.1 Binder的3層結構 180
5.2.2 類BBinder 181
5.2.3 類BpRefBase 183
5.2.4 類IPCThreadState 185
5.3 初始化Java層Binder框架 188
5.3.1 搭建交互關系 188
5.3.2 實現Binder類的初始化 188
5.3.3 實現BinderProxy類的初始化 190
5.4 實體對象binder_node 190
5.4.1 定義實體對象 191
5.4.2 增加引用計數 192
5.4.3 減少引用計數 193
5.5 本地對象BBinder 194
5.5.1 引用了運行的本地對象 195
5.5.2 處理接口協議 201
5.6 引用對象binder_ref 205
5.7 代理對象BpBinder 208
5.7.1 創建Binder代理對象 208
5.7.2 銷毀Binder代理對象 209
第6章 init啟動進程詳解 213
6.1 什么是init進程 213
6.2 入口函數 214
6.3 init配置文件 217
6.3.1 init.rc基礎 217
6.3.2 init.rc解析 219
6.4 解析Service 223
6.4.1 Zygote對應的service action 224
6.4.2 init組織Service 224
6.4.3 解析Service用到的函數 226
6.5 解析on 230
6.5.1 Zygote對應的on action 230
6.5.2 結構體action 232
6.5.3 解析on字段所在的option 232
6.6 init控制Service 233
6.6.1 啟動Zygote 233
6.6.2 啟動Service 234
6.6.3 總結4種啟動Service的方式 238
6.7 啟動屬性服務 243
6.7.1 引入屬性 243
6.7.2 設置內核變量 245
6.7.3 初始化屬性服務 246
6.7.4 實現具體啟動工作 247
6.7.5 獲取屬性值 249
6.7.6 處理請求 251
第7章 Zygote進程詳解 253
7.1 Zygote基礎 253
7.2 啟動Zygote 254
7.2.1 init.c啟動腳本 254
7.2.2 創建一個Socket 258
7.2.3 入口函數main() 260
7.2.4 啟動函數創建一個虛擬機實例 262
7.2.5 和Zygote進程中的Socket實現連接 264
第8章 System進程詳解 271
8.1 啟動前的準備 271
8.1.1 獲取創建的Socket 271
8.1.2 啟動System進程 272
8.2 分析SystemServer 272
8.2.1 分析主函數main() 272
8.2.2 分析函數init2() 275
8.3 第一個啟動的ServiceEntropyService 275
8.3.1 將內容寫到urandom設備 276
8.3.2 將和設備相關的信息寫到urandom設備 277
8.3.3 讀取urandom設備的內容 277
8.3.4 發送ENTROPY_WHAT 278
8.4 生成并管理日志文件 278
8.4.1 分析DBMS構造函數 278
8.4.2 添加dropbox日志文件 280
8.4.3 DBMS和settings數據庫 284
8.5 分析DiskStatsService 285
8.6 監測系統內部存儲空間的狀態 289
8.6.1 構造函數 289
8.6.2 內存檢查 290
8.7 分析實現性能統計 292
8.7.1 構造函數 292
8.7.2 進行性能統計 293
8.7.3 輸出統計文件 295
8.8 剪貼板服務 302
8.8.1 復制數據到剪貼板 302
8.8.2 從剪貼板粘貼數據 304
8.8.3 管理CBS中的權限 306
第9章 應用程序進程詳解 309
9.1 創建應用程序 309
9.1.1 發送創建請求 309
9.1.2 保存啟動參數 312
9.1.3 創建指定的應用程序 314
9.1.4 創建本地對象LocalSocket 315
9.1.5 接收創建新應用程序的請求 316
9.2 啟動線程池 320
9.3 創建信息循環 322
第10章 ART機制架構詳解 324
10.1 分析ART的啟動過程 324
10.1.1 運行 app_process 進程 325
10.1.2 準備啟動 329
10.1.3 創建運行實例 336
10.1.4 注冊本地JNI函數 338
10.1.5 啟動守護進程 339
10.1.6 解析參數 340
10.1.7 初始化類、方法和域 350
10.2 進入main()主函數 357
10.3 查找目標類 358
10.3.1 函數LookupClass() 359
10.3.2 函數DefineClass() 361
10.3.3 函數InsertClass() 365
10.3.4 函數LinkClass() 366
10.4 類操作 368
10.5 實現托管操作 370
第11章 Sensor傳感器系統架構詳解 376
11.1 Android傳感器系統概述 376
11.2 Java層詳解 377
11.3 Frameworks層詳解 383
11.3.1 監聽傳感器的變化 383
11.3.2 注冊監聽 384
11.4 JNI層詳解 396
11.4.1 實現Native(本地)函數 396
11.4.2 處理客戶端數據 401
11.4.3 處理服務端數據 403
11.4.4 封裝HAL層的代碼 417
11.4.5 處理消息隊列 422
11.5 HAL層詳解 425
第12章 藍牙系統架構詳解 435
12.1 短距離無線通信技術概覽 435
12.1.1 ZigBee——低功耗、自組網 435
12.1.2 Wi-Fi——大帶寬支持家庭互聯 435
12.1.3 藍牙——4.0進入低功耗時代 436
12.1.4 NFC——必將逐漸遠離歷史舞臺 436
12.2 藍牙技術基礎 437
12.2.1 藍牙技術的發展歷程 437
12.2.2 低功耗藍牙的特點 437
12.2.3 低功耗藍牙的架構 438
12.2.4 低功耗藍牙分類 439
12.2.5 集成方式 439
12.2.6 BLE和傳統藍牙BR/EDR技術的對比 440
12.3 藍牙規范詳解 440
12.3.1 Bluetooth 系統中的常用規范 441
12.3.2 藍牙協議體系結構 441
12.3.3 低功耗(BLE)藍牙協議 443
12.3.4 現有的基于GATT的協議/服務 443
12.3.5 雙模協議棧 444
12.3.6 單模協議棧 445
12.4 低功耗藍牙協議棧詳解 445
12.4.1 低功耗藍牙協議棧基礎 445
12.4.2 藍牙協議體系中的協議 446
12.5 TI公司的低功耗藍牙 448
12.5.1 獲取TI公司的低功耗藍牙協議棧 448
12.5.2 分析TI公司的低功耗藍牙協議棧 450
12.6 分析Android系統中的藍牙模塊 456
12.7 分析藍牙模塊的源碼 458
12.7.1 初始化藍牙芯片 458
12.7.2 藍牙服務 458
12.7.3 管理藍牙電源 459
12.8 Android系統的低功耗藍牙協議棧 459
12.8.1 Android低功耗藍牙協議棧基礎 460
12.8.2 低功耗藍牙API詳解 460
第13章 Android多媒體框架架構詳解 498
13.1 Android多媒體系統介紹 498
13.2 OpenMax框架詳解 499
13.2.1 分析OpenMax框架構成 500
13.2.2 實現OpenMax IL層接口 504
13.3 OpenCore框架詳解 512
13.3.1 OpenCore層次結構 512
13.3.2 OpenCore代碼結構 513
13.3.3 OpenCore編譯結構 514
13.3.4 操作系統兼容庫 518
13.3.5 實現OpenCore中的OpenMax部分 520
13.4 StageFright框架詳解 532
13.4.1 StageFright代碼結構 533
13.4.2 StageFright實現OpenMax接口 533
13.4.3 分析Video Buffer傳輸流程 537
第14章 音頻系統框架架構詳解 554
14.1 硬件架構的發展趨勢 554
14.1.1 原始架構模式 554
14.1.2 移動處理器的解決方案 554
14.1.3 升級版高通驍龍801 555
14.2 音頻系統基礎 557
14.3 音頻系統的層次 559
14.3.1 層次說明 559
14.3.2 Media庫中的Audio框架 559
14.3.3 本地代碼 562
14.3.4 分析JNI代碼 564
14.3.5 分析Java層代碼 565
14.4 Audio系統的硬件抽象層 567
14.4.1 Audio硬件抽象層基礎 568
14.4.2 AudioFlinger中的Audio硬件抽象層的
實現 569
14.4.3 真正實現Audio硬件抽象層 575
14.5 Kernel Driver實現 575
14.6 實現編/解碼過程 582
14.6.1 AMR編碼 583
14.6.2 AMR解碼 587
14.6.3 解碼MP3 591
第15章 視頻系統架構詳解 594
15.1 視頻輸出系統 594
15.1.1 基本層次結構 594
15.1.2 硬件抽象層架構 595
15.2 MediaPlayer架構詳解 602
15.2.1 MediaPlayer架構圖解 602
15.2.2 MediaPlayer的接口與架構 603
15.2.3 分析Java部分 610
15.2.4 分析JNI部分 614
15.2.5 核心庫libmedia.so 618
15.2.6 服務庫libmediaservice.so 621
15.2.7 OpenCorePlayer實現
libopencoreplayer.so 622
15.2.8 對MediaPlayer的總結 622
15.3 VideoView詳解 628
15.3.1 構造函數 628
15.3.2 公共方法 629
第16章 WebKit系統架構詳解 635
16.1 WebKit系統目錄 635
16.2 Java層的基本框架 636
16.3 Java層的主要類 637
16.3.1 WebView簡介 637
16.3.2 WebViewDatabase 638
16.3.3 WebViewCore 638
16.3.4 CallbackProxy 638
16.3.5 BrowserFrame 639
16.3.6 JWebCoreJavaBridge 639
16.3.7 DownloadManagerCore 639
16.3.8 其他類 639
16.4 數據載入器架構 639
16.5 Java層對應的C/C++類庫 640
16.6 分析WebKit的操作過程 642
16.6.1 WebKit初始化 642
16.6.2 載入數據 644
16.6.3 刷新繪制 644
16.7 WebViewCore詳解 645
第17章 Android 5.0中的WebView 652
17.1 WebView架構基礎 652
17.2 WebView類簡介 654
17.3 WebViewProvider接口 656
17.4 WebViewChromium詳解 659
17.5 WebViewChromiumFactoryProvider
詳解 660
17.6 AwContents架構 663
17.7 實現Mixed Content模式 666
17.8 引入第三方Cookie 667
第18章 Wi-Fi系統架構詳解 670
18.1 Wi-Fi系統基礎 670
18.2 Wi-Fi本地部分架構 672
18.3 Wi-Fi JNI部分架構 676
18.4 Java FrameWork部分的源碼 677
18.4.1 WifiManager詳解 678
18.4.2 WifiService詳解 679
18.4.3 WifiWatchdogService詳解 688
18.5 Setting設置架構 689
VIII
IX