內容簡介
《撥雲見日:基於android的內核與係統架構源碼分析》包括上下兩篇內容。上篇在保證完整Linux內核架構分析的前提下,著重分析Android係統中強烈依賴的Linux內核機製,如多核ARM架構的支持,而略去Android係統産品化沒有用到內核機製,如SWAP機製。下篇主要分析Android係統層主要架構機製,尤其注重分析這些用戶態機製與內核機製的接駁與交互。《撥雲見日:基於android的內核與係統架構源碼分析》整理自作者多年積纍的筆記,形式以源代碼分析為主。
《撥雲見日:基於android的內核與係統架構源碼分析》適閤相關領域工程師作為實際項目的參考,以及有誌於通過研讀源碼掌握Android係統與Linux內核精髓的讀者。
內頁插圖
精彩書評
★對於像Android、Linux這樣復雜的大型軟件,如果想要有比較深入透徹的理解,那就非得要閱讀分析其源代碼不可。王森這本書分享瞭他所獲的知識和心得,書中不光有代碼的分析,還有他的見解,特彆是還有他的一些經驗之談,相信讀者會和我一樣看瞭後覺得受益匪淺。
——《Linux內核源代碼情景分析》作者 毛德操
★本書在著力分析Android係統最常用到的內核機製之後,繼續嚮上剖析Android用戶層核心機製是如何接駁Linux內核的。而且書中分析涉及到ARM體係為較新CortexA9SMP架構,對於讀者開發、研究工作有著實際的藉鑒作用。
——紅狼軟件創始人:《深入剖析Android係統》作者 楊長剛
★作者從研一開始就埋頭於Linux源代碼的學習、分析。雖然他常常不修邊幅,但隻要談起編程或Linux源代碼他就兩眼放光,滔滔不絕地大談特談心得體會。書中源代碼注釋的寫作方式看起來有些簡陋,但是這樣對閱讀Android源代碼非常有幫助。
——本書作者同學;CATechnologies研發經理 王晉強
目錄
上篇 內核
第1章 ARM多核處理器
1.1 SMP相關基礎數據結構
1.2 Percpu內存管理
1.2.1 內核顯式定義的處理器局部數據
1.2.2 Percpu內存管理的建立
1.2.3 Percpu動態分配內存空間
1.3 CpuFreq
1.3.1 初始化
1.3.2 CpuFreq策略的建立
1.3.3 Ondemand調頻算法分析
1.4 CPU0bootupCPU
1.4.1 CPU0側策略和動作
1.4.2 CPU1側執行路綫
1.5 CPU1的關閉
1.5.1 關閉時機
1.5.2 CPU1關閉操作
1.6 ARM處理器展望
1.6.1 ARM架構處理器的演進
1.6.2 TrustZone
1.6.3 ARMVirtualization
第2章 異常
2.1 異常嚮量錶
2.1.1 異常進入
2.1.2 異常錶的構建
2.2 中斷體係
2.2.1 CortexA9多核處理器的中斷控製器GIC
2.2.2 MT6577的中斷體係
2.2.3 Exynos4的中斷體係
2.2.4 OMAP4的中斷體係
2.3 中斷處理
2.3.1 中斷的基本結構
2.3.2 中斷源識彆
2.4 數據異常
2.5 處理器間通信
第3章 調度與實時性
3.1 Tick
3.1.1 Localtimer
3.1.2 Tick掛載
3.1.3 Tick産生
3.2 Fair調度類
3.2.1 Fair調度類的負載均衡
3.2.2 Fair調度類的處理器選擇
3.3 RT調度類
3.3.1 RT調度類的基本結構
3.3.2 Rt_Bandwidth
3.3.3 負載均衡與搶占
3.3.4 基礎操作
3.4 調度器
3.4.1 調度域的構建
3.4.2 調度器
3.5 喚醒
3.5.1 喚醒與搶占
3.5.2 跨處理器分發綫程
3.5.3 搶占
第4章 Signal
4.1 信號發送
4.2 信號執行
4.2.1 路徑切換
4.2.2 ARMLinux下信號執行環境的搭建
4.2.3 Signal處理函數的返迴
4.2.4 係統調用重入
第5章 進程與進程內存
5.1 Linux進程
5.1.1 Fork
5.1.2 Exec新進程創建
5.2 CPU與MMU
5.2.1 ARMLinux頁錶頁目錄結構
5.2.2 頁錶頁目錄的建立
5.3 進程虛擬內存
5.3.1 Android進程虛擬內存的繼承
5.3.2 進程虛擬地址空間的獲得
第6章 缺頁請頁與內存Shrink
6.1 缺頁與請頁
6.1.1 Filebacked虛擬內存段操作函數
6.1.2 Filebacked內存的請頁
6.1.3 匿名內存的請頁
6.1.4 COW訪問
6.2 內存Shrink
6.2.1 Shrink操作shrink_page_list
6.2.2 CleanPage
6.2.3 髒頁的監控
6.3 全景圖
第7章 塊設備
7.1 Bdev文件係統
7.2 塊設備基礎結構
7.3 塊設備的創建與注冊
7.4 分區檢測生成
7.5 塊設備的打開
7.6 塊設備驅動的層次結構
7.7 虛擬塊設備
第8章 VFS
8.1 根目錄
8.1.1 根目錄文件係統——initramfs
8.1.2 Androidramdisk.img
8.1.3 傳統根目錄文件係統加載方式
8.2 文件打開
8.2.1 目錄的層級查找
8.2.2 各層次操作函數的安裝
8.3 文件寫
8.3.1 文件寫框架
8.3.2 write_begin
8.3.3 write_end
8.4 髒頁的提交與迴寫機製
8.4.1 髒頁的提交
8.4.2 迴寫時機
8.4.3 迴寫機製的層次操作
8.4.4 節點層次的迴寫
第9章 EXT4文件係統
9.1 Android文件係統的選擇
9.2 EXT4文件節點
9.2.1 EXT4inode基礎結構
9.2.2 EXt4rawinode的定位
9.2.3 EXT4inode的獲取
9.3 Mount
9.4 EXT4文件寫操作
9.5 EXT4journal
9.6 Extenttree
9.6.1 基礎結構
9.6.2 定位邏輯塊的structext4_extent
9.6.3 定位邏輯塊左右側的structext4_extent項
9.7 塊分配
9.7.1 塊組的buddy算法
9.7.2 分配物理塊
9.8 邏輯塊到物理塊的映射
第10章 RCU
10.1 RCUtree
10.1.1 RCUTree結構
10.1.2 RCUtree的構建
10.2 GracePeriod
10.2.1 GracePeriod的檢測
10.2.2 重新啓動新一輪GracePeriod
10.3 RCU函數的執行
第11章 MMCDriver
11.1 MMCDriver
11.1.1 MMC協議層
11.1.2 MMC塊設備
11.2 開源手機U8836D(MT6577)分區的實現
第12章 內核配置係統及內核調試
12.1 Conf
12.1.1 Kconfig元素
12.1.2 Kconfig分析
12.2 內核調試
12.2.1 senix_printk
12.2.2 LOG_BUF
下篇 Dalvik與Android用戶態源碼分析
第13章 內存
13.1 Dalvik內存管理
13.1.1 虛擬內存分配
13.1.2 內存迴收
13.2 Ashmem
13.3 GC
13.3.1 對象Mark
13.3.2 從Root對象集到普通對象
13.3.3 GC與綫程實時性
第14章 進程與綫程
14.1 Dalvik虛擬機的進程
14.2 Dalvik綫程創建機製
14.3 Android綫程模型
14.3.1 主綫程的生成
14.3.2 綫程池綫程的生成
14.4 Java綫程轉換
14.4.1 從Java到JNI
14.4.2 從JNI到Java
第15章 Bionic的動態加載機製
15.1 Linker——用戶態入口
15.2 Linker主體——link_image
第16章 Android係統初始
16.1 Android入口
16.2 Init——OS的入口
16.2.1 RC文件分析
16.2.2 RC動作執行
16.2.3 RC的邏輯分析
16.2.4 設備探測
16.2.5 property庫的構建
16.2.6 Init的調試
第17章 Interpreter與JIT
17.1 解釋器編譯結構
17.2 Dalvik寄存器編譯模型
17.2.1 Callee寄存器分配
17.2.2 Caller寄存器分配
17.2.3 outs的處理
17.3 PortableInterpreter結構
17.4 ASMInterpreter
17.4.1 基本結構
17.4.2 運行時模型與基本操作
17.4.3 ASMInterpreter入口
17.5 Interpreter的切換
17.6 Dalvik運行時幀結構
17.7 JIT
17.7.1 熱點檢測
17.7.2 Mode切換
17.7.3 JIT提交
17.8 Compile
17.8.1 基礎數據結構
17.8.2 dalvik指令格式分析
17.8.3 TraceRun分析
17.8.4 MIR
17.8.5 基本塊的邏輯關係
17.8.6 寄存器分配
17.8.7 LIR
17.8.8 Codecache
17.9 DalvikART
第18章 Binder
18.1 Parcel
18.1.1 C++層的Parcel
18.1.2 Java層的Parcel
18.2 Binder驅動
18.2.1 Binder寫
18.2.2 Binder讀
18.3 C++層麵
18.3.1 本地與遠端對象
18.3.2 服務的建立
18.4 Java層麵
18.5 service_manager
第19章 Class
19.1 係統類庫
19.1.1 Initalclass
19.1.2 ODEX文件的加載
19.1.3 係統類庫
19.1.4 preloaded-classes
19.2 類加載
19.2.1 類加載框架
19.2.2 類加載
19.3 對象實體生成
第20章 Android應用框架
20.1 綫程池綫程
20.1.1 C++層
20.1.2 Java層
20.2 係統側Activity與Service的生成控製
20.3 classActivityThread
20.3.1 MainLooper
20.3.2 activity與service的加載
第21章 AndroidUI體係
21.1 窗口體係的生成
21.2 ViewRoot與Surface
21.3 編輯框實例分析
21.3.1 ViewRoot獲得係統側代理對象
21.3.2 焦點切換事件——主要AndroidUI機製的互動
21.3.3 輸入事件的處理
21.3.4 編輯框的生成
第22章 ADB
22.1 ADB基本結構
22.1.1 連接
22.1.2 主綫程
22.1.3 主綫程監測的文件句柄
22.2 Transport
22.2.1 初始化
22.2.2 transport傳輸綫程
22.2.3 transport的管理
22.3 Local服務
22.3.1 Local服務的種類
22.3.2 Local服務的形態
22.3.3 SYNC服務
第23章 Android瀏覽器的Webkit分析
23.1 Webcore
23.1.1 DOM與Rendering樹生成
23.1.2 事件的産生與分發
23.2 V8parser源碼分析
23.2.1 V8parser處理腳本的層次
23.2.2 Scope
23.2.3 語法分析的入口Parser ParseStatement(…)
23.2.4 普通語句的分析
23.3 指令生成
前言/序言
《深入解析Android:從內核到應用,掌控移動係統底層奧秘》 一、 序言:為何要探究Android的根基? 在智能手機普及的今天,Android已成為全球用戶量最大的移動操作係統。我們日常使用的App、流暢的操作體驗、豐富的功能設置,背後都離不開一個龐大而精密的係統支撐。然而,大多數用戶僅僅是Android的“使用者”,對它如何工作、如何響應指令、如何實現各種高級功能,卻知之甚少。這種“知其然,不知其所以然”的狀態,限製瞭我們對技術的深度理解和創新能力。 對於開發者而言,瞭解Android的底層架構,如同建築師理解地基和承重牆。隻有掌握瞭核心原理,纔能在開發過程中規避潛在問題,優化性能,甚至突破現有框架的限製,創造齣更具競爭力的産品。而對於技術愛好者,深入探究Android的“心髒”——內核與係統架構,更是一種極具挑戰性和成就感的學習過程,它能讓你撥開重重迷霧,真正領略到現代操作係統的設計智慧。 本書的目的,正是要帶領您開啓一場深入Android係統底層的探索之旅。我們將超越API的錶麵,直抵內核的脈動,逐一解析Android係統從硬件驅動到上層應用的完整圖景。這不是一本簡單的API手冊,也不是一本停留在應用層開發的教程,而是旨在為您揭示Android係統運作的“黑箱”,讓您能夠“撥雲見日”,清晰地看到其內在的邏輯、精妙的設計和彼此間的協作關係。 二、 Android係統架構概覽:多層次的精妙設計 Android的係統架構並非一蹴而就,而是經過多年的發展和演進,形成瞭一個高度模塊化、分層清晰的體係。理解這個分層結構,是深入學習的基礎。我們將從最底層開始,自下而上,逐步展開: 1. Linux Kernel(Linux內核): Android最核心的基石,為整個係統提供硬件抽象層(HAL)、進程管理、內存管理、電源管理、安全性和驅動程序等基礎服務。熟悉Linux內核對於理解Android的底層運行機製至關重要。我們將深入探討Android定製的Linux內核特性,以及它如何與硬件進行交互。 2. Hardware Abstraction Layer (HAL)(硬件抽象層): 這是一個關鍵的抽象層,它為上層框架提供瞭一套標準的接口,使得上層代碼無需關心具體硬件的實現細節。HAL層屏蔽瞭不同廠商硬件的差異性,提供瞭統一的接口給Android框架。我們將分析HAL層是如何工作的,以及常見的HAL模塊(如相機、音頻、傳感器等)是如何被實現的。 3. Android Runtime (ART) & Dalvik Runtime (已淘汰)(Android運行時): 這是Android應用程序運行的環境。ART作為現代Android係統的默認運行時,采用 Ahead-Of-Time (AOT) 編譯技術,將Dex字節碼在應用安裝時就編譯成本地機器碼,極大地提升瞭應用啓動速度和運行效率。我們將深入解析ART的工作原理,包括其編譯器、垃圾迴收機製等。 4. Native C/C++ Libraries(原生C/C++庫): Android係統依賴大量的C/C++編寫的原生庫,它們提供瞭諸如Surface Manager、OpenGLES、SQLite、WebKit/Blink等核心功能。這些庫的性能和效率直接影響到係統的整體錶現。我們將分析這些關鍵原生庫的作用和實現。 5. Java API Framework(Java API框架): 這是開發者最常接觸的層次。它提供瞭一係列豐富的Java類庫和API,用於構建應用程序,包括Activity Manager, Package Manager, Content Providers, Broadcast Receivers, Services等。我們將重點關注這些框架組件的設計理念和交互方式。 6. Applications(應用程序): 位於最頂層,是我們日常接觸到的各類App。包括係統自帶的應用(如電話、短信、瀏覽器)和用戶安裝的第三方應用。 三、 Linux內核:Android的基石與驅動的王國 Linux內核是Android係統的“心髒”,負責管理和協調所有硬件資源。在本書中,我們將重點關注Android在Linux內核層麵的一些特有考量和優化: 電源管理(Power Management): 移動設備的續航是用戶最關心的焦點之一。我們將深入分析Android如何利用Linux內核的電源管理機製,如wakelocks、suspend/resume、power domains等,來精細控製CPU、內存、傳感器等組件的功耗。 內存管理(Memory Management): Android設備通常麵臨內存資源有限的挑戰。我們將剖析Linux內核的內存管理策略,以及Android係統如何進行內存分配、迴收和優化,例如lowmemorykiller機製。 進程與綫程管理(Process & Thread Management): Android應用是基於進程和綫程的模型運行的。我們將探討Linux內核如何管理進程的創建、銷毀、調度,以及Android特有的Binder IPC機製如何在進程間實現高效通信。 驅動程序模型(Driver Model): 從硬件驅動到上層應用,驅動程序是連接物理世界和軟件世界的橋梁。我們將介紹Linux內核的驅動程序開發模型,並分析Android係統中常見的驅動程序,如相機驅動、音頻驅動、顯示驅動等。 安全性(Security): Linux內核提供瞭強大的安全機製,如權限控製、SELinux等。我們將探討Android如何利用這些機製來保障係統和用戶數據的安全。 四、 硬件抽象層 (HAL):屏蔽差異,統一接口 HAL層是Android係統設計中的一個巧妙之處,它使得上層應用框架能夠與各種硬件設備進行統一交互,而無需瞭解具體的硬件實現。 HAL接口與實現: 我們將解析HAL接口的定義方式(通常是C/C++頭文件),以及硬件廠商如何為其設備提供相應的HAL實現庫(通常是.so文件)。 關鍵HAL模塊剖析: 相機 HAL: 探究相機硬件如何通過HAL提供預覽、拍照、錄像等功能。 音頻 HAL: 分析音頻輸入、輸齣、混音等是如何通過HAL實現的。 傳感器 HAL: 瞭解加速度計、陀螺儀、磁力計等傳感器數據的獲取與處理。 顯示 HAL: 揭示SurfaceFlinger如何與顯示驅動通過HAL進行交互,實現屏幕內容的繪製與閤成。 電源 HAL: 分析電源管理相關的硬件操作如何通過HAL接口暴露。 五、 Android Runtime (ART):應用的執行引擎 ART是Android應用程序運行的核心。它的設計目標是提升性能、優化內存使用,並提供更靈活的應用運行時環境。 Dex文件格式與字節碼: 瞭解Dalvik Executable (Dex) 文件的結構,以及Android應用程序運行在虛擬機中的字節碼。 Ahead-Of-Time (AOT) 編譯: 深入解析ART的AOT編譯過程,包括它如何將Dex字節碼轉換為本地機器碼,以及這種編譯方式帶來的性能優勢。 JIT (Just-In-Time) 編譯(部分場景): 雖然AOT是主流,但ART在某些場景下也可能采用JIT編譯。我們將探討這兩種編譯模式的異同。 垃圾迴收 (Garbage Collection, GC): 深入理解ART的垃圾迴收機製,包括不同的GC算法,以及它們如何影響應用的內存使用和響應速度。 類加載與方法執行: 分析ART如何加載Java類,以及方法的調用過程。 六、 原生 C/C++ 庫:性能擔當與底層支撐 Android係統依賴眾多高性能的C/C++庫來提供核心功能,這些庫是係統高效運行的關鍵。 Binder IPC: 作為Android進程間通信(IPC)的核心機製,Binder的實現原理至關重要。我們將詳細解析Binder的Binder Driver、Binder Driver、Binder Service、Binder Client等組件,以及它如何實現跨進程的數據傳遞和方法調用。 SurfaceFlinger 與 Hardware Composer (HWC): SurfaceFlinger負責管理屏幕上所有圖形層的閤成,HWC則與GPU/顯示硬件緊密協作,完成最終的屏幕渲染。我們將深入分析它們的工作流程,以及它們如何共同實現流暢的UI顯示。 SQLite: Android係統廣泛使用的本地數據庫。我們將探究其在Android中的集成方式,以及其作為係統底層數據存儲的作用。 Skia Graphics Engine: Android UI繪製的基礎圖形庫。瞭解Skia如何渲染各種圖形元素,是理解UI繪製過程的關鍵。 WebKit / Blink (早期) / Chromium (後期): 瀏覽器引擎的演進。瞭解Android瀏覽器和WebView是如何實現網頁渲染的。 七、 Java API Framework:應用開發者的樂園 這是開發者最熟悉的層麵,但深入理解其設計思想,有助於寫齣更健壯、更高效的應用。 Activity Management: 深入分析Activity的生命周期,以及Activity Manager Service (AMS) 如何管理和調度Activity。 Service Management: 探索Service的工作機製,以及Service Manager如何提供後颱服務。 Content Providers: 理解Content Provider是如何實現應用間數據共享的。 Broadcast Receivers: 分析Android的事件廣播機製,以及Broadcast Receiver如何響應係統或應用發齣的廣播。 Context: 探究Context對象的真正含義,以及它在應用開發中的作用。 UI Toolkit (View System): 深入理解Android的View繪製流程,包括Measure, Layout, Draw三個階段,以及View的事件分發機製。 八、 係統啓動流程:從按下電源鍵到App啓動 我們將詳細解析Android係統的完整啓動流程,從上電開始,經過Bootloader,Linux Kernel初始化,init進程的啓動,Zygote進程的創建,System Server的啓動,直到應用程序的啓動。 Bootloader: 引導加載程序的作用。 Kernel Bootstrapping: Linux內核的啓動與初始化。 Init Process: Android係統的第一個用戶空間進程,負責掛載文件係統、啓動關鍵服務。 Zygote Process: Android應用程序的孵化器,預加載通用類,提高應用啓動速度。 System Server: Android核心服務的匯聚地,負責啓動AMS, PMS, WMS等係統服務。 九、 結論:掌握Android,洞悉未來 通過對Android內核與係統架構的深入剖析,本書旨在為您建立一個全麵、清晰的係統認知。您將不再局限於App的開發,而是能夠從更高、更深的維度去理解Android係統的運作原理。 掌握瞭這些底層知識,您將能夠: 更有效地進行性能調優: 找到應用性能瓶頸,並從係統層麵進行優化。 深入理解係統級問題: 能夠診斷和解決各種復雜的係統bug。 進行更高級的定製開發: 為ROM定製、係統工具開發打下堅實基礎。 更敏銳地洞察技術趨勢: 理解Android未來發展方嚮,把握技術脈搏。 這是一次挑戰,更是一次收獲。我們誠邀您一同踏上這場精彩紛呈的Android底層探索之旅,真正做到“撥雲見日”,掌握移動操作係統的核心奧秘。