深入理解 Android 內核設計思想, 2/e (上下冊) 深入理解Android内核设计思想 第2版(上下册)

林學森

  • 出版商: 人民郵電
  • 出版日期: 2017-06-01
  • 售價: $948
  • 貴賓價: 9.5$901
  • 語言: 簡體中文
  • 頁數: 996
  • 裝訂: 平裝
  • ISBN: 7115452636
  • ISBN-13: 9787115452634
  • 相關分類: Android
  • 立即出貨

買這商品的人也買了...

相關主題

商品描述

全書從操作系統的基礎知識入手,全面剖析進程/線程、內存管理、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服務器” 
——ServiceManag er 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 
10.4.1 Surface申請流程(relayout) 416 
10.4. 2 Surface的跨進程傳遞420 
10.4.3 Surface的業務操作422 
10.5 performLayoutAndPlace 
SurfacesLockedInner 423 
10.6窗口大小的計算過程424 
10.7啟動窗口的添加與銷毀433 
10.7.1啟動窗口的添加433 
10.7.2啟動窗口的銷毀437 
10.8窗口動畫438 
10.8.1窗口動畫類型439 
10.8.2動畫流程跟踪——Window 
StateAnimator 440 
10.8.3 AppWindowAnimator 444 
10.8.4動畫的執行過程446 

第11章讓你的界面炫彩起來的GUI 
系統— View體系452 
11.1應用程序中的View框架452 
11.2 Activity中View Tree的
創建過程455 
11.3在WMS中註冊窗口461 
11.4 ViewRoot的基本工作方式463 
11.5 View Tree的遍歷時機464 
11.6 View Tree的遍歷流程468 
11.7 View和ViewGroup屬性477 
11.7.1 View的基本屬性477 
11.7 .2 ViewGroup的屬性482 
11.7.3 View、ViewGroup和
ViewParent 482 
11.7.4 Callback接口482 
11.8 “作畫“工具集——Canvas 484 
11.8.1 “繪製UI”——Skia 485 
11.8.2數據中介——Surface . 
lockCanvas 486 
11.8.3解鎖並提交結果——unlock 
CanvasAndPost 490 
11.9 draw和onDraw 491 
11.10 View中的消息傳遞497 
11.10.1 View中TouchEvent 
的投遞流程497 
11.10.2 ViewGoup中Touch- 
Event的投遞流程500 
11.11 View動畫504 
11.12 UiAutomator 509
 
第12章“問佢哪得清如許,為有源頭
活水來”— InputManager 
Service與輸入事件514 
12.1事件的分類514 
12.2事件的投遞流程517 
12.2.1 InputManagerService 518 
12.2.2 InputReaderThread 519 
12.2.3 InputDispatcherThread 519 
12.2.4 ViewRootImpl對事件
的派發523 
12.3事件注入524 

第13章應用不再同質化—音頻系統526 
13.1音頻基礎527 
13.1.1聲波527 
13.1.2音頻的錄製、存儲
與回放527 
13.1.3音頻採樣528 
13.1.4 Nyquist–Shannon採樣
定律530 
13.1.5聲道和 立體聲530 
13.1.6聲音定級——Weber– 
Fechner law 531 
13.1.7音頻文件格式532 
13.2音頻框架532 
13.2.1 Linux中的音頻框架532 
13.2.2 TinyAlsa 534 
13.2.3 Android系統中的
音頻框架536 
13.3音頻系統的核心——Audio- 
Flinger 538 
13.3.1 AudioFlinger服務的
啟動和運行538 
13.3.2 AudioFlinger對音頻
設備的管理540 
13.3.3 PlaybackThread的
循環主體547 
13.3.4 AudioMixer 551 
13.4策略的製定者— —Audio- 
PolicyService 553 
13.4.1 AudioPolicyService 
概述554 
13.4.2 AudioPolicyService 
的啟動過程556 
13.4.3 AudioPolicyService 
與音頻設備558 
13.5音頻流的回放——AudioTrack 560 
13.5.1 AudioTrack應用實例560 
13.5.2 AudioPolicyService 
的路由實現567 
13.6音頻數據流572 
13.6.1 AudioTrack中的音頻流573 
13.6.2 AudioTrack和AudioFlinger 
間的數據交互576 
13.6.3 AudioMixer中的
音頻流582 
13.7音量控制584 
13.8音頻系統的上層建築588 
13.8.1從功能入手588 
13.8.2 MediaPlayer 589 
13.8.3 MediaRec order 592 
13.8.4一個典型的多媒體
錄製程序595 
13.8.5 MediaRecorder 
源碼解析596 
13.8.6 MediaPlayerService簡析598 
13.9 Android支持的媒體格式600 
13.9.1音頻格式600 
13.9.2視頻格式601 
13.9.3圖片格式601 
13.9.4網絡流媒體602 
13.10 ID3信息簡述602 
13.11 Android多媒體文件管理606 
13.11.1 MediaStore 607 
13.11.2多媒體文件信息的
存儲“倉庫” 
——MediaProvider 608 
13.11.3多媒體文件管理中
的“生產者” 
—MediaScanner 611 

第3篇應用原理篇

第14章Intent的匹配規則616 
14.1 Intent屬性616 
14.2 Intent的匹配規則618 
14.3 Intent匹配源碼簡析624 

第15章APK應用程序的資源適配628 
15.1資源類型629 
15.1.1狀態顏色資源630 
15.1.2圖形資源631 
15.1.3佈局資源632 
15.1.4菜單資源633 
15.1.5字符串資源633 
15.1.6樣式資源634 
15.1.7其他資源635 
15.1.8屬性資源635 
15.2提供可選資源638 
15.3最佳資源的匹配流程642 
15.4屏幕適配644 
15.4.1屏幕適配的 重要參數644 
15.4.2如何適配多屏幕646 
15.4.3橫豎屏切換的處理648 

第16章Android字符編碼格式650 
16.1字符編碼格式背景650 
16.2 ISO/IEC 8859 651 
16.3 ISO/IEC 10646 651 
16.4 Unicode 652 
16.5 String類型655 
16.5.1構建String 655 
16.5.2 String對多種編碼
的兼容656 

第17章Android和OpenGL ES 660 
17.1 3D圖形學基礎661 
17.1.1計算機3D圖形661 
17.1.2圖形管線662 
17.2 Android中的OpenGL ES簡介664 
17.3圖形渲染API—EGL 665 
17.3.1 EGL與OpenGL ES 665 
17.3.2 egl.cfg 665 
17.3.3 EGL接口解析667 
17.3.4 EGL實例670 
17.4簡化OpenGL ES開發
—GLSurfaceView 670 
17.5 OpenGL分析利器
—GLTracer 677 

第18章“系統的UI”——SystemUI 685 
18.1 SystemUI的組成元素685 
18.2 SystemUI的實現687 
18.3 Android壁紙資源
—WallpaperService 694 
18.3.1 WallPaperManager- 
Service 695 
18.3.2 ImageWallpaper 697
 
第19章Android常用的工具
“小插件”——Widget機制700 
19.1 “功能的提供者”——AppWidgetProvider 700 
19.2 App WidgetHost 702 

第20章Android應用程序
的編譯和打包707 
20.1 “另闢蹊徑”採用第三方工具——Ant 707 
20.2通過命令行編譯和打包APK 708 
20.3 APK編譯過程詳解709 
20.4信息安全基礎概述711 
20.5應用程序簽名716 
20.6應用程序簽名源碼簡析719 
20.7 APK重簽名實例724 

第21章Android虛擬機725 
21.1 Android虛擬機基礎知識725 
21.1.1 Java虛擬機核心概念725 
21.1.2 LLVM編譯器框架734 
21.1.3 Android中的經典
垃圾回收算法736 
21.1.4 Art和Dalvik之爭738 
21.1.5 Art虛擬機整體框架741 
21.1.6 Android應用程序與
虛擬機742 
21.1.7 Procedure Call Standard 
for Arm Architecture 
(過程調用標準) 744 
21.1.8 C++ 11標準中的新
特性746 
21.2 Android虛擬機核心文件格式
—Dex字節碼749 
21.3 Android虛擬機核心文件格式
—可執行文件的基石ELF 756 
21.3.1 ELF文件格式756 
21.3.2 Linux平台下ELF文件的加載和動態鏈接過程764 
21.3.3 Android Linker和
動態鏈接庫7 71 
21.3.4 Signal Handler和
Fault Manager 782 
21.4 Android虛擬機核心文件格式
——“主宰者”OAT 786 
21.4.1 OAT文件格式解析786 
21.4.2 OAT的兩個編譯時機793 
21.5 Android虛擬機的典型
啟動流程806 
21.6堆管理器和堆空間釋義815 
21.7 Android虛擬機中的線程管理823 
21.7.1 Java線程的創建過程823 
21.7.2線程的掛起過程827 
21.8 Art虛擬機中的代碼執行
方式綜述829 
21.9 Art虛擬機的“中樞系統” 
——執行引擎之Interpreter 836 
21.10 Art虛擬機的“中樞系統”——執行引擎之JIT 839 
21.10.1 JIT重出江湖的契機839 
21.10.2 Android N版本中JIT 
的設計目標及策略840 
21.10.3 Profile Guided Compilation 
(追踪技術) 842 
21.10.4 AOT Compilation 
Daemon 843 
21.11 Art虛擬機的“中樞系統” 
——執行引擎之本地代碼844 
21.12 Android x86版本兼容ARM二
進制代碼— —Native Bridge 864 
21.13 Android應用程序調試
原理解析871 
21.13.1 Java代碼調試與
JDWP協 872 
21.13.2 Native代碼調試879 
21.13.3利用GDB調試
Android Art虛擬機885 

第22章Android安全機制透析887 
22.1 Android Security綜述887 
22.2 SELinux 889 
22.2.1 DAC 889 
22.2.2 MAC 890 
22.2.3基於MAC的SELinux 890 
22.3 Android系統安全保護
的三重利劍892 
22.3.1第一劍:Permission 
機制893 
22.3.2加強劍:DAC(UGO)
保護896 
22.3.3終極劍:SEAndroid 898 
22.4 SEAndroid剖析899 
22.4.1 SEAndroid的頂層模型899 
22.4.2 SEAndroid相關的核心
源碼900 
22.4.3 SEAndroid標籤和規則901 
22.4.4如何在Android系統中
自定義SEAndroid 903 
22.4.5 TE文件的語法規則905 
22.4.6 SEAndroid中的核心
主體—init進程907 
22.4.7 SEAndroid中的客體912 
22.5 Android設備Root簡析913 
22.6 APK的加固保護分析916 

第4篇Android系統工具

第23章IDE和Gradle 922 
23.1 Gradle的核心要點922 
23.1.1 Groovy與Gradle 923 
23.1.2 Gradle的生命週期926 
23.2 Gradle的Console語法927 
23.3 Gradle Wrapper和Cache 929 
23.4 Android Studio和Gra dle 931 
23.4.1 Gradle插件基礎知識931 
23.4.2 Android Studio中的
Gradle編譯腳本932 

第24章軟件版本管理937 
24.1版本管理簡述937 
24.2 Git的安裝937 
24.2.1 Linux環境下安裝Git 938 
24.2. 2 Windows環境下
安裝Git 939 
24.3 Git的使用939 
24.3.1基礎配置939 
24.3.2新建倉庫940 
24.3.3文件狀態942 
24.3.4忽略某些文件943 
24.3.5提交更新944 
24.3.6其他命令944 
24.4 Git原理簡析945 
24.4.1分佈式版本系統的特點946 
24.4.2安全散列算法
—SHA-1 947 
24.4.3 4個重要對象948 
24.4.4三個區域953 
24.4.5分支的概念與實例954 

第25章系統調試輔助工具958 
25.1萬能模擬器——Emulator 958 
25.1.1 QEMU 958 
25.1.2 Android工程中
的QEMU 963 
25.1.3模擬器控制台
(Emulator Console) 966 
25.1.4實例:為Android 
模擬器添加串口功能969 
25.2此Android非彼Android 970 
25.3快速建立與模擬器或真機的
通信渠道——ADB 972 
25.3.1 ADB的使用方法972 
25.3.2 ADB的組成元素975 
25.3. 3 ADB源代碼解析976 
25.3.4 ADB Protocol 981 
25.4 SDK Layoutlib 984 
25.5 TraceView和Dmtracedump 985 
25.6 Systrace 987 
25.7代碼覆蓋率統計992 
25.8模擬GPS位置995