第1篇 Android編譯篇
第1章 Android係統簡介 2
1.1 Android係統發展曆程 2
1.2 Android係統特點 4
1.3 Android係統框架 8
第2章 Android源碼下載及編譯 10
2.1 Android源碼下載指南 10
2.1.1 基於Repo和Git的版本管理 10
2.1.2 Android源碼下載流程 11
2.2 原生態係統編譯指南 12
2.2.1 建立編譯環境 13
2.2.2 編譯流程 15
2.3 定製産品的編譯與燒錄 17
2.3.1 定製新産品 17
2.3.2 Linux內核編譯 21
2.3.3 燒錄 22
2.4 Android係統映像文件 23
2.4.1 boot.img 23
2.4.2 ramdisk.img 25
2.4.3 system.img 26
2.5 OTA係統升級 26
2.5.1 生成升級包 27
2.5.2 獲取升級包 28
2.5.3 OTA升級-RecoveryMode 29
2.6 Android反編譯 31
第3章 Android編譯係統 34
3.1 Makefile入門 34
3.2 Android編譯係統 35
3.2.1 Makefile依賴樹的概念 36
3.2.2 樹根節點droid 36
3.2.3 main.mk解析 38
3.2.4 droidcore節點 39
3.2.5 dist_files 41
3.2.6 Android.mk的編寫規則 42
第2篇 Android原理篇
第4章 操作係統基礎 48
4.1 計算機體係結構(Computer Architecture) 48
4.1.1 馮·諾依曼結構 48
4.1.2 哈佛結構 48
4.2 什麼是操作係統 49
4.3 進程間通信的經典實現 51
4.3.1 共享內存(Shared Memory) 52
4.3.2 管道(Pipe) 54
4.3.3 Unix Domain Socket 55
4.3.4 RPC(RemoteProcedure Calls) 58
4.4 同步機製的經典實現 58
4.4.1 信號量(Semaphore) 58
4.4.2 Mutex 59
4.4.3 管程(Monitor) 59
4.4.4 同步範例 60
4.5 Android中的同步機製 61
4.5.1 進程間同步——Mutex 61
4.5.2 條件判斷——Condition 62
4.5.3 “柵欄、障礙”——Barrier 64
4.5.4 加解鎖的自動化操作——Autolock 66
4.6 操作係統內存管理基礎 66
4.6.1 虛擬內存(Virtual Memory) 66
4.6.2 內存保護(Memory Protection) 69
4.6.3 內存分配與迴收 69
4.6.4 進程間通信——mmap 70
4.7 Android中的Low Memory Killer 71
4.8 Android匿名共享內存(Anonymous Shared Memory) 74
4.8.1 Ashmem設備 74
4.8.2 Ashmem應用實例 78
4.9 JNI 83
4.9.1 Java函數的本地實現 83
4.9.2 本地代碼訪問JVM 86
4.10 學習Android係統的兩條綫索 88
第5章 Android進程/綫程管理 89
5.1 Android進程和綫程 89
5.2 Handler, MessageQueue,Runnable與Looper 95
5.3 UI主綫程——ActivityThread 102
5.4 Thread類 105
5.4.1 Thread類的內部原理 105
5.4.2 Thread休眠和喚醒 106
5.4.3 Thread實例 110
5.5 Android應用程序的典型啓動流程 112
第6章 進程間通信——Binder 114
6.1 智能指針 117
6.1.1 智能指針的設計理念 117
6.1.2 強指針sp 120
6.1.3 弱指針wp 121
6.2 進程間的數據傳遞載體——Parcel 128
6.3 Binder驅動與協議 135
6.3.1 打開Binder驅動——binder_open 136
6.3.2 binder_mmap 137
6.3.3 binder_ioctl 140
6.4 “DNS”服務器——ServiceManager(Binder Server) 141
6.4.1 ServiceManager的啓動 141
6.4.2 ServiceManager的構建 142
6.4.3 獲取ServiceManager服務——設計思考 147
6.4.4 ServiceManagerProxy 151
6.4.5 IBinder和BpBinder 153
6.4.6 ProcessState和IPCThreadState 155
6.5 Binder客戶端——Binder Client 185
6.6 Android接口描述語言——AIDL 190
6.7 匿名Binder Server 202
第7章 Android啓動過程簡析 205
7.1 第一個係統進程(init) 205
7.1.1 init.rc語法 205
7.1.2 init.rc實例分析 208
7.2 係統關鍵服務的啓動簡析 209
7.2.1 Android的“DNS服務器”——ServiceManager 209
7.2.2 “孕育”新的綫程和進程——Zygote 209
7.2.3 Android的“係統服務”——SystemServer 211
第8章 管理Activity和組件運行狀態的係統進程——Activity ManagerService (AMS) 213
8.1 AMS功能概述 213
8.2 管理當前係統中Activity狀態——Activity Stack 215
8.3 startActivity流程 217
8.4 完成同一任務的“集閤”——Activity Task 224
8.4.1 “後進先齣”——Last In,First Out 225
8.4.2 管理Activity Task 226
第9章 GUI係統之SurfaceFlinger 229
9.1 OpenGL ES與EGL 229
9.2 Android的硬件接口——HAL 231
9.3 Android終端顯示設備的“化身”——Gralloc與Framebuffer 233
9.4 Android中的本地窗口 237
9.4.1 FramebufferNativeWindow 239
9.4.2 應用程序端的本地窗口——Surface 245
9.5 BufferQueue詳解 249
9.5.1 BufferQueue的內部原理 249
9.5.2 BufferQueue中的緩衝區分配 252
9.5.3 應用程序的典型繪圖流程 258
9.5.4 應用程序與BufferQueue的關係 263
9.6 SurfaceFlinger 267
9.6.1 “黃油計劃”——Project Butter 267
9.6.2 SurfaceFlinger的啓動 271
9.6.3 接口的服務端——Client 275
9.7 VSync的産生和處理 279
9.7.1 VSync信號的産生和分發 279
9.7.2 VSync信號的處理 285
9.7.3 handleMessageTransaction 287
9.7.4 “界麵已經過時/無效,需要重新繪製”——handleMessageInvalidate 291
9.7.5 閤成前的準備工作——preComposition 293
9.7.6 可見區域——rebuildLayerStacks 295
9.7.7 為“Composition”搭建環境——setUpHWComposer 299
9.7.8 doDebugFlashRegions 301
9.7.9 doComposition 302
第10章 GUI係統之“窗口管理員”——WMS 309
10.1 “窗口管理員”——WMS綜述 310
10.1.1 WMS的啓動 312
10.1.2 WMS的基礎功能 312
10.1.3 WMS的工作方式 313
10.1.4 WMS,AMS與Activity間的聯係 314
10.2 窗口屬性 316
10.2.1 窗口類型與層級 316
10.2.2 窗口策略(Window Policy) 320
10.2.3 窗口屬性(LayoutParams) 322
10.3 窗口的添加過程 324
10.3.1 係統窗口的添加過程 324
10.3.2 Activity窗口的添加過程 333
10.3.3 窗口添加實例 337
10.4 Surface管理 340
10.4.1 Surface申請流程(relayout) 341
10.4.2 Surface的跨進程傳遞 344
10.4.3 Surface的業務操作 347
10.5 performLayoutAndPlaceSurfacesLockedInner 347
10.6 窗口大小的計算過程 349
10.7 啓動窗口的添加與銷毀 358
10.7.1 啓動窗口的添加 358
10.7.2 啓動窗口的銷毀 362
10.8 窗口動畫 363
10.8.1 窗口動畫類型 364
10.8.2 動畫流程跟蹤——WindowStateAnimator 365
10.8.3 AppWindowAnimator 368
10.8.4 動畫的執行過程 370
第11章 讓你的界麵炫彩起來的GUI係統之View體係 377
11.1 應用程序中的View框架 377
11.2 Activity中View Tree的創建過程 380
11.3 在WMS中注冊窗口 386
11.4 ViewRoot的基本工作方式 388
11.5 View Tree的遍曆時機 389
11.6 View Tree的遍曆流程 393
11.7 View和ViewGroup屬性 402
11.7.1 View的基本屬性 402
11.7.2 ViewGroup的屬性 408
11.7.3 View,ViewGroup和ViewParent 408
11.7.4 Callback接口 408
11.8 “作畫“工具集——Canvas 411
11.8.1 “繪製UI”——Skia 412
11.8.2 數據中介——Surface.lockCanvas 413
11.8.3 解鎖並提交結果——unlockCanvasAndPost 417
11.9 draw和onDraw 417
11.10 View中的消息傳遞 423
11.10.1 View中TouchEvent的投遞流程 423
11.10.2 ViewGoup中TouchEvent的投遞流程 427
11.11 View動畫 430
第12章 “問渠哪得清如許,為有源頭活水來”——InputManagerService與輸入事件 436
12.1 事件的分類 436
12.2 事件的投遞流程 439
12.2.1 InputManagerService 440
12.2.2 InputReaderThread 441
12.2.3 InputDispatcherThread 441
12.2.4 ViewRootImpl對事件的派發 445
第13章 應用不再同質化——音頻係統 447
13.1 音頻基礎 448
13.1.1 聲波 448
13.1.2 音頻的錄製、存儲與迴放 448
13.1.3 音頻采樣 449
13.1.4 Nyquist–Shannon采樣定律 451
13.1.5 聲道和立體聲 451
13.1.6 聲音定級——Weber–Fechner law 452
13.1.7 音頻文件格式 453
13.2 音頻框架 454
13.2.1 Linux中的音頻框架 454
13.2.2 TinyAlsa 456
13.2.3 Android係統中的音頻框架 457
13.3 音頻係統的核心——AudioFlinger 459
13.3.1 AudioFlinger服務的啓動和運行 460
13.3.2 AudioFlinger對音頻設備的管理 461
13.3.3 PlaybackThread的循環主體 468
13.3.4 AudioMixer 473
13.4 策略的製定者——AudioPolicyService 475
13.4.1 AudioPolicyService概述 475
13.4.2 AudioPolicyService的啓動過程 477
13.4.3 AudioPolicyService與音頻設備 480
13.5 音頻流的迴放——AudioTrack 482
13.5.1 AudioTrack應用實例 482
13.5.2 AudioPolicyService的路由實現 489
13.6 音頻數據流 494
13.6.1 AudioTrack中的音頻流 495
13.6.2 AudioTrack和AudioFlinger間的數據交互 498
13.6.3 AudioMixer中的音頻流 504
13.7 音量控製 506
13.8 音頻係統的上層建築 510
13.8.1 從功能入手 510
13.8.2 MediaPlayer 511
13.8.3 MediaRecorder 514
13.8.4 一個典型的多媒體錄製程序 517
13.8.5 MediaRecorder源碼解析 518
13.8.6 MediaPlayerService簡析 520
13.9 Android支持的媒體格式 523
13.9.1 音頻格式 523
13.9.2 視頻格式 523
13.9.3 圖片格式 524
13.9.4 網絡流媒體 524
13.10 ID3信息簡述 525
13.11 Android多媒體文件管理 528
13.11.1 MediaStore 529
13.11.2 多媒體文件信息的存儲“倉庫”——MediaProvider 530
13.11.3 多媒體文件管理中的“生産者”——MediaScanner 533
第3篇 應用原理篇
第14章 Intent的匹配規則 538
14.1 Intent屬性 538
14.2 Intent的匹配規則 540
14.3 Intent匹配源碼簡析 546
第15章 APK應用程序的資源適配 551
15.1 資源類型 552
15.1.1 狀態顔色資源 553
15.1.2 圖形資源 554
15.1.3 布局資源 555
15.1.4 菜單資源 556
15.1.5 字符串資源 556
15.1.6 樣式資源 557
15.1.7 其他資源 558
15.1.8 屬性資源 558
15.2 提供可選資源 561
15.3 最佳資源的匹配流程 565
15.4 屏幕適配 567
15.4.1 屏幕適配的重要參數 567
15.4.2 如何適配多屏幕 569
第16章 Android字符編碼格式 572
16.1 字符編碼格式背景 572
16.2 ISO/IEC 8859 573
16.3 ISO/IEC 10646 573
16.4 Unicode 574
16.5 String類型 577
16.5.1 構建String 578
16.5.2 String對多種編碼的兼容 579
第17章 Android和OpenGL ES 583
17.1 3D圖形學基礎 584
17.1.1 計算機3D圖形 584
17.1.2 圖形管綫 585
17.2 Android中的OpenGL ES簡介 587
17.3 圖形渲染API—EGL 588
17.3.1 EGL與OpenGL ES 588
17.3.2 egl.cfg 588
17.3.3 EGL接口解析 590
17.3.4 EGL實例 593
17.4 簡化OpenGL ES開發——GLSurfaceView 593
第18章 “係統的UI”——SystemUI 601
18.1 SystemUI的組成元素 601
18.2 SystemUI的實現 603
18.3 Android壁紙資源——WallpaperService 610
18.3.1 WallPaperManagerService 611
18.3.2 ImageWallpaper 613
第19章 Android常用的工具“小插件”——Widget機製 616
19.1 “功能的提供者”——AppWidgetProvider 616
19.2 AppWidgetHost 618
第20章 Android應用程序的編譯和打包 624
20.1 “另闢蹊徑”采用第三方工具——Ant 624
20.2 通過命令行編譯和打包APK 625
20.3 APK編譯過程詳解 626
20.4 信息安全基礎概述 628
20.5 應用程序簽名 633
20.6 應用程序簽名源碼簡析 636
第4篇 Android係統工具
第21章 軟件版本管理 642
21.1 版本管理簡述 642
21.2 Git的安裝 643
21.2.1 Linux環境下安裝Git 643
21.2.2 Windows環境下安裝Git 644
21.3 Git的使用 644
21.3.1 基礎配置 644
21.3.2 新建倉庫 646
21.3.3 文件狀態 647
21.3.4 忽略某些文件 649
21.3.5 提交更新 649
21.3.6 其他命令 650
21.4 Git原理簡析 650
21.4.1 分布式版本係統的特點 651
21.4.2 安全散列算法——SHA-1 652
21.4.3 四個重要對象 653
21.4.4 三個區域 657
21.4.5 分支的概念與實例 658
第22章 係統調試輔助工具 662
22.1 萬能模擬器——Emulator 662
22.1.1 QEMU 662
22.1.2 Android工程中的QEMU 667
22.1.3 模擬器控製颱(Emulator Console) 670
22.1.4 實例:為Android模擬器添加串口功能 672
22.2 此Android非彼Android 674
22.3 快速建立與模擬器或真機的通信渠道——ADB 676
22.3.1 ADB的使用方法 676
22.3.2 ADB的組成元素 678
22.3.3 ADB源代碼解析 679
22.3.4 ADB Protocol 684
· · · · · · (
收起)