基本介紹
內容簡介
《Android的設計與實現(卷1)》是Android套用開發工程師和Android系統工程師進階修煉的必讀之作。它由資深Android核心專家親自執筆,從原始碼角度,系統、深入、透徹剖析Android系統框架層(Framework)的設計思想和實現原理,為Android套用工程師和系統工程師解決實際工作中的各種難題提供了原理性的指導。為了降低讀者的閱讀成本,《Android的設計與實現:卷1》使用了大量簡單的UML類圖和序列圖來展示類的層次結構和方法的調用流程,使讀者能迅速讀完《Android的設計與實現:卷1》並領會其精髓!《Android的設計與實現(卷1)》編輯推薦:從原始碼角度,系統、深入、透徹剖析Android系統框架層(Framework)的設計思想和實現原理,為Android套用工程師和系統工程師解決各種難題提供了原理性的指導!資深Android核心專家親自執筆,Lordhong等數位資深專家和安卓巴士等專業社區聯袂推薦。
作者簡介
楊雲君,資深Android系統專家,不僅在Android套用開發方面積累了豐富的經驗,而且精通Android系統級開發和性能最佳化,對整個Android系統的架構設計與實現原理有十分深入的研究和透徹的認識。就職於國際領先的跨國移動通信公司,作為主任工程師專門從事Android手機的定製和開發,研究Android系統是他的主要工作之一,曾負責了多個手機品牌的多款機型的系統開發和升級工作,經驗十分豐富。
專業推薦
媒體推薦
Android快速發展了五年多,勢頭依然強勁。為了開發更強大的APP,眾多開發者迫切需要更深入了解Android框架的機制。雲君這本書真可謂雪中送炭,攬卷讀之,欲罷不能!
——Lordhong 資深移動開發工程師(目前在美國矽谷山景城)
本書立足於對Android框架層技術的深入理解,融合了項目開發中積累的豐富實戰經驗,深入淺出,理解其“道”,習練其“術”,既可讀其入門,亦可研習精深。
——張帥 中科院計算所
本書通過分析原始碼系統地剖析了Android框架層的核心技術,無論是Android開發的初學者,還是資深的程式設計師,都可以通過此書從一個全新的視角認識Android系統,並從中得到啟發。
——嚴林 中科院計算所
Android是當前移動開發領域的熱點,雲君這本書對Android系統框架層的設計思想和實現原理做了深入的分析和探討,是Android開發工程師進階修煉不可多得的參考資料。
——高劍林 騰訊
感謝雲君寫的這本書,對於我這樣一直研究Linux核心的人來說,真的能從Android系統的設計與實現中有所領悟。書中對Android框架層的剖析條理清晰,系統透徹,體現了雲君的功力深厚,更體現了其確實在用心總結。
——孫子荀 騰訊
有幸被邀請閱讀本書初稿,本書作者對Android的通透理解令人震撼。國內解讀Android系統原理的圖書眾多,本書卻在深層次上獨闢蹊徑,實在難得。
——張洪 阿里巴巴
名人推薦
Android快速發展了五年多,勢頭依然強勁。為了開發更強大的APP,眾多開發者迫切需要更深入了解Android框架的機制。雲君這本書真可謂雪中送炭,攬卷讀之,欲罷不能!
——Lordhong 資深移動開發工程師(目前在美國矽谷山景城)
本書立足於對Android框架層技術的深入理解,融合了項目開發中積累的豐富實戰經驗,深入淺出,理解其“道”,習練其“術”,既可讀其入門,亦可研習精深。
——張帥 中科院計算所
本書通過分析原始碼系統地剖析了Android框架層的核心技術,無論是Android開發的初學者,還是資深的程式設計師,都可以通過此書從一個全新的視角認識Android系統,並從中得到啟發。
——嚴林 中科院計算所
Android是當前移動開發領域的熱點,雲君這本書對Android系統框架層的設計思想和實現原理做了深入的分析和探討,是Android開發工程師進階修煉不可多得的參考資料。
——高劍林 騰訊
感謝雲君寫的這本書,對於我這樣一直研究Linux核心的人來說,真的能從Android系統的設計與實現中有所領悟。書中對Android框架層的剖析條理清晰,系統透徹,體現了雲君的功力深厚,更體現了其確實在用心總結。
——孫子荀 騰訊
有幸被邀請閱讀本書初稿,本書作者對Android的通透理解令人震撼。國內解讀Android系統原理的圖書眾多,本書卻在深層次上獨闢蹊徑,實在難得。
——張洪 阿里巴巴
圖書目錄
前言
第一部分 基礎篇
第1章 Android體系結構及原始碼閱讀環境搭建
1.1 Android發展過程
1.2 Android體系結構
1.2.1 靜態視角的體系結構
1.2.2 動態視角的體系結構
1.3 Android源碼下載和編譯
1.3.1 搭建開發環境
1.3.2 下載Android上層系統原始碼
1.3.3 下載指定模組源碼
1.3.4 下載 Android Linux Kernel源碼
1.3.5 編譯Android上層系統源碼
1.3.6 編譯指定模組源碼
1.4 Android源碼結構
1.5 Android源碼開發工具的配置和使用
1.5.1 配置Android SDK
1.5.2 用Eclipse開發和調試原始碼
1.5.3 用Source Insight閱讀原始碼
1.6 NDK開發環境配置
1.7 本章小結
第2章 框架基礎JNI
2.1 JNI在Android系統中所處的位置
2.2 JNI框架層實例分析
2.2.1 Log系統Java層分析
2.2.2 Log系統的JNI層
2.2.3 Log系統的JNI方法註冊
2.3 JNI總管:JNIEnv
2.4 在Java中調用JNI實現方法
2.4.1 Java數據類型與JNI數據類型轉換
2.4.2 JNI方法命名規則
2.4.3 JNI方法簽名規則
2.5 JNI操作Java對象
2.5.1 訪問Java對象
2.5.2 操作成員變數(域)和方法
2.5.3 全局引用、弱全局引用和局部引用
2.6 JNI異常處理
2.7 JNI套用層實例分析
2.7.1 Java層分析
2.7.2 JNI層代碼和異常處理
2.8 本章小結
第二部分 啟動篇
第3章 Android啟動過程的底層實現
3.1 Android正常模式啟動流程
3.2 Kernel啟動過程
3.2.1 核心引導階段
3.2.2 核心啟動階段
3.3 init進程的執行過程
3.4 init.rc檔案解析過程
3.4.1 Android初始化語言
3.4.2 init.rc的內容
3.4.3 解析配置檔案
3.4.4 解析Service
3.4.5 解析Action
3.5 觸發並啟動Action和Service
3.5.1 觸發Action
3.5.2 執行Action
3.5.3 啟動Service
3.5.4 init對屬性服務的處理
3.6 init循環監聽處理事件
3.7 本章小結
第4章 Android 啟動過程的上層實現
4.1 第一個Dalvik虛擬機zygote
4.1.1 zygote的配置
4.1.2 如何執行zygote服務程式
4.2 ZygoteInit的啟動過程
4.2.1 創建Dalvik虛擬機
4.2.2 註冊JNI方法
4.2.3 開啟Java世界
4.3 ZygoteInit開啟Java世界的五部分工作
4.3.1 註冊zygote的Socket
4.3.2 預載入Class資源和Resource資源
4.3.3 啟動system_server進程
4.3.4 執行MethodAndArgsCalle的run方法
4.3.5 執行runSelectLoopMode方法
4.4 zygote處理Home啟動請求
4.5 本章小結
第三部分 Binder篇
第5章 Binder在Native框架層的實現
5.1 Binder與C/S體系結構概述
5.2 servicemanager進程的啟動過程
5.2.1 初始化Binder通信環境
5.2.2 註冊上下文管理者
5.2.3 等待接收並處理IPC通信請求
5.3 Server的啟動和Service的註冊過程
5.3.1 創建ProcessState對象
5.3.2 獲取servicemanager的代理對象
5.3.3 註冊Service
5.3.4 Server進程開啟執行緒池
5.4 Client端使用服務代理對象
5.5 服務代理與服務通信
5.6 本章小結
第6章 Binder在Java框架層的實現
6.1 Java系統服務的創建過程
6.1.1 創建JavaBBinderHolder對象
6.1.2 JavaBBinder的作用
6.1.3 gBinderOffsets結構體解析
6.2 Java系統服務的註冊過程
6.2.1 調用BinderInternal.getContextObject方法
6.2.2 調用ServiceManagerNative.asInterface方法
6.2.3 調用ServiceManagerProxy.addService方法註冊服務
6.3 Client端獲取服務代理
6.3.1 獲取服務的BinderProxy
6.3.2 構造服務的Proxy對象
6.3.3 構造服務管理者對象
6.4 Client端調用Java系統服務的方法
6.5 統一的通信接口AIDL
6.5.1AIDL實例
6.5.2AIDL語法
6.5.3處理自定義數據類型的傳遞
6.6 本章小結
第四部分 訊息通信篇
第7章 執行緒訊息通信與異步處理
7.1 什麼是Looper執行緒
7.2 第一步:Looper執行緒準備階段
7.2.1 創建Java層的Looper對象
7.2.2 創建Java層的MessageQueue—對象
7.2.3 創建Native層的NativeMessageQueue和Looper對象
7.2.4 NativeMessageQueue關聯到MessageQueue
7.3 第二步:創建訊息處理器並傳送訊息
7.3.1 Handler的創建和初始化
7.3.2 Message的創建和初始化
7.3.3 訊息的傳送過程
7.4 第三步:Looper執行緒循環階段
7.4.1 記錄並獲取當前執行緒身份信息
7.4.2 循環監聽訊息
7.4.3 分發訊息到處理器
7.4.4 回收訊息並更新訊息池
7.5 異步任務類AsyncTask
7.5.1 AsyncTask的實現
7.5.2 AsyncTask的執行
7.6 本章小結
第五部分 Package Manager篇
第8章 Package Manager 的機制與實現
8.1 Package Manager體系結構
8.1.1 三層體系結構
8.1.2 三層之間的關係
8.2 PackageManagerService的啟動過程
8.2.1 創建並初始化Settings對象
8.2.2 獲取系統默認配置
8.2.3 啟動PackageHandler
8.2.4 創建data目錄並初始化UserManager
8.2.5 解析系統permission和feature信息
8.2.6 解析packages檔案
8.2.7 dexopt最佳化判定
8.2.8 啟動FileObserver監控APK檔案的目錄
8.2.9 調用scanDirLI方法掃描並安裝APK包
8.2.10 更新packages檔案
8.3 PackageManagerService啟動過程使用的核心組件
8.3.1 Java層的Installer
8.3.2 Installd中的命令
8.4 本章小結
第9章 APK的安裝過程
9.1 通過scanDirLI方法安裝APK
9.1.1 創建PackageParser
9.1.2 解析AndroidManifest.xml檔案
9.1.3 過濾PackageParser.Package類型的pkg對象
9.1.4 解析和安裝pkg
9.2 使用adb命令安裝應用程式
9.2.1 通過訊息機制安裝指定的APK
9.2.2 調用handleStartCopy方法處理安裝操作
9.2.3 調用handleReturnCode方法處理返回結果
9.3 本章小結
第六部分 Activity Manager篇
第10章 Activity Manager的機制與實現
10.1 Activity Manager概述
10.2 ActivityManagerService在系統啟動階段的主要工作
10.3 第一階段:啟動ActivityManagerService
10.3.1 啟動AThread執行緒
10.3.2 創建ActivityThread對象
10.3.3 創建ActivityStack類
10.3.4 調用startRunning方法
10.4 第二階段:調用setSystemProcess方法
10.4.1 查詢並處理ApplicationInfo
10.4.2 創建並初始化ProcessRecord
10.5 第三階段:調用install—SystemProviders方法
10.5.1 查詢Content Provider
10.5.2 安裝Content Provider
10.6 第四階段:調用systemReady方法
10.6.1 傳送ACTION_PRE_BOOT_COMPLETED廣播
10.6.2 清理預啟動的非persistent進程
10.6.3 讀取Settings配置
10.6.4 運行Runnable回調接口
10.6.5 啟動persistent應用程式和Home
10.7 本章小結
第11章 應用程式Activity的啟動和調度
11.1 啟動應用程式Activity時在Client端的執行流程
11.2 啟動應用程式Activity時在Server端的執行流程
11.2.1 預啟動
11.2.2 暫停
11.2.3 啟動應用程式進程
11.2.4 載入應用程式Activity
11.2.5 顯示Activity
11.2.6 Activity Idle狀態的處理過程
11.2.7 停止源Activity
11.3 本章小結
第12章 Activity Manager進程 管理
12.1 LRU weight機制
12.2 OOM adj機制
12.2.1 更新OOM adj值
12.2.2 OOM adj的計算過程
12.3 Low Memory Killer機制
12.3.1 OOM adj等級和最小記憶體閾值
12.3.2 LM Killer機制的實現
12.4 本章小結
序言
前言
為什麼要寫本書
Android從2007年問世至今,不僅在各個套用領域發展得如火如荼,其圖書市場也是一片“興旺”,各個層次、各種類型的Android圖書的需求都比較旺盛。目前市場上已經有的圖書主要分為以下三類:
針對Android SDK API使用的描述
針對Android系統架構各部分的描述
針對Kernel移植的描述
其中鮮有針對Android四層架構中某一層進行深入挖掘的圖書,這讓讀者有一種只能窺其全貌,卻不能獨得一隅的遺憾。
框架層是整個Android系統的靈魂,這一層起著承上啟下的作用,是理解整個Android的關鍵,也是解決Android套用層Bug的關鍵。要開發一款精品手機,就必須深入理解這一層。
國際知名的手機廠商對手機品質有著近乎苛刻的要求,手機必須在嚴格的測試環境下運行數百小時無問題方可上市銷售。這期間出現的穩定性(ANR、Crash、Watchdog)、記憶體(OOM)、性能等問題都讓人十分頭痛。這些問題主要來自於應用程式、Framework、Dalvik虛擬機、Linux Kernel、Driver以及Modem,其中相當大一部分問題源自對Framework的錯誤理解和使用。舉例如下:
解決KeyDispatchTimeout類型的ANR,需要熟悉Activity Manager、Input訊息處理系統的機制。
解決應用程式IDLE狀態時發生的ANR,需要熟悉Activity Manager、Binder的運行機制。
解決框架層的Watchdog問題,需要熟悉Android啟動階段開啟的系統服務和Watchdog的運行機制。
解決應用程式的性能問題,同樣需要理解框架層的運行和調度機制。
上述問題只是冰山一角,僅僅停留在使用SDK API的層次是不可能解決上述問題的。因此,非常需要一本能深入挖掘框架層的專著。
針對以上問題,編寫“Android的設計與實現”系列叢書,對Android核心模組和主要問題進行深入分析。其中卷I的主題是啟動和通信,主要分析Android運行環境、Package Manager、Activity Manager、Binder和訊息機制等核心模組。卷Ⅱ的主題是資源和UI,主要分析Content Provider、Resource、View System、Window Manager、SurfaceFlinger等核心模組。
讀者對象
本書主要分析了Android框架層主要部分的體系結構和實現原理,讓讀者對Framework有一個清晰的理解,並以此增強解決實際開發中遇到的Bug的能力。
本書適合以下幾類讀者:
中高級Android套用開發者
Android系統開發者
Android系統架構師
負責Android調試與最佳化的工作者
如何閱讀本書
本書分為六大部分:
第一部分為基礎篇(第1~2章),簡要分析Android的體系結構、開發和調試環境、框架基礎。
第二部分為啟動篇(第3~4章),著重分析Android啟動過程的機制和實現,讓讀者對框架層系統服務的運行基礎有一個全面的理解。
第三部分為Binder篇(第5~6章),著重分析Binder在Native框架層和Java框架層的機制和實現,讓讀者掌握進程間通信模型。
第四部分為訊息通信篇(第7章),著重分析Android的訊息驅動和異步處理機制,幫助讀者掌握執行緒間通信模型。
第五部分為Package Manager篇(第8~9章),著重分析Android應用程式的解析和安裝流程。
第六部分為Activity Manager篇(第10~12章),著重分析Activity Manager Service的運行機制、應用程式和進程的啟動流程、進程管理機制。