深入解析Android虛擬機

深入解析Android虛擬機

《深入解析Android虛擬機》是2014年由清華大學出版社出版的圖書,作者是張子言。

基本介紹

  • 書名:深入解析Android虛擬機
  • 作者:張子言
  • ISBN:9787302344087
  • 定價:49.50元
  • 出版社:清華大學出版社
  • 出版時間:2013-12-27
  • 裝幀:平裝
圖書簡介,目錄,

圖書簡介

本書循序漸進地講解了Android虛擬機技術的基本知識,內容新穎、知識全面、講解詳細。全書分為13個章節,分別講解了Android系統的基礎知識、Android系統的結構和核心框架、Java虛擬機和Dalvik虛擬機的知識、實現程式編譯和調試、Dalvik的運作流程、DEX最佳化和安全管理、Android虛擬機生命周期管理和記憶體分配策略、虛擬機垃圾收集和執行緒管理、JNI的基本原理、JIT編譯的基 本過程和具體方法,以及虛擬機中的異常管理機制方面的知識。

目錄

第1章Android系統介紹 1
1.1Android是一款智慧型手機 1
1.1.1什麼是智慧型手機 1
1.1.2當前主流的智慧型手機系統 2
1.2Android的巨大優勢 3
1.3在電腦上啟動Android虛擬機 4
1.3.1安裝AndroidSDK 4
1.3.2安裝JDK、Eclipse、
AndroidSDK 5
1.3.3設定AndroidSDKHome 12
1.4Android模擬器 13
1.4.1Android模擬器簡介 14
1.4.2模擬器和仿真機究竟有何區別 14
1.4.3創建Android虛擬設備(AVD) 14
1.4.4模擬器的總結 16
1.5搭建環境過程中的常見問題 18
1.5.1不能線上更新 18
1.5.2顯示“Projectnamemustbe
specified”提示 20
1.5.3Target列表中沒有Target選項 21
第2章Android系統的結構 23
2.1Android安裝檔案簡介 23
2.1.1AndroidSDK目錄結構 23
2.1.2android.jar及內部結構 24
2.1.3SDK幫助文檔 25
2.1.4解析AndroidSDK實例 26
2.2分析Android的系統架構 26
2.2.1Android體系結構介紹 27
2.2.2Android工程檔案結構 29
2.2.3應用程式的生命周期 32
2.3簡析Android核心 34
2.3.1Android繼承於Linux 34
2.3.2Android核心和Linux核心的
區別 35
2.4簡析Android源碼 37
2.4.1獲取並編譯Android源碼 37
2.4.2Android對Linux的改造 38
2.4.3為Android構建Linux的
作業系統 39
2.4.4分析Android源碼結構 39
2.4.5編譯Android源碼 44
2.4.6運行Android源碼 45
2.5實踐演練——演示兩種編譯Android
程式的方法 46
2.5.1編譯NativeC的helloworld
模組 46
2.5.2手工編譯C模組 47
第3章虛擬機概述 51
3.1虛擬機的作用 51
3.2Java虛擬機 51
3.2.1理解Java虛擬機 51
3.2.2Java虛擬機的數據類型 52
3.2.3Java虛擬機的體系結構 53
3.2.4Java虛擬機的生命周期 58
3.3Android虛擬機——DalvikVM 59
3.3.1Dalvik架構 59
3.3.2和Java虛擬機的差異 60
3.3.3DalvikVM的主要特徵 61
3.3.4DalvikVM的代碼結構 61
3.4Dalvik控制VM詳解 63
3.5DalvikVM架構 66
3.5.1Dalvik的進程管理 67
3.5.2Android的初始化流程 67
第4章編譯和調試 68
4.1Windows環境編譯Dalvik 68
4.2GDB調試Dalvik 71
4.2.1準備工作 71
4.2.2GDB調試C程式 72
4.2.3GDB調試Dalvik 74
4.3使用dexdump 75
4.3.1dexdump的反編譯功能 75
4.3.2使用dexdump查看jar檔案 76
4.4Dalvik虛擬機編譯腳本 80
4.4.1Android.mk檔案 80
4.4.2ReconfigureDvm.mk檔案 81
4.4.3dvm.mk檔案 84
4.5Android4.0.1源碼下載、模擬器編譯和
運行 85
第5章Dalvik虛擬機的運作流程 88
5.1Dalvik虛擬機相關的可執行程式 88
5.1.1dalvikvm 88
5.1.2dvz 89
5.1.3app_process 90
5.2Dalvik虛擬機的初始化 92
5.2.1開始虛擬機的準備工作 92
5.2.2初始化跟蹤顯示系統 93
5.2.3初始化垃圾回收器 93
5.2.4初始化執行緒列表和主執行緒環境
參數 93
5.2.5分配內部操作方法的表格記憶體 95
5.2.6初始化虛擬機的指令碼相關的
內容 95
5.2.7分配指令暫存器狀態的記憶體 95
5.2.8分配指令暫存器狀態的記憶體 96
5.2.9初始化虛擬機最基本用的
Java庫 96
5.2.10進一步使用的Java類庫
執行緒類 97
5.2.11初始化虛擬機使用的異常
Java類庫 99
5.2.12釋放字元串哈希表 100
5.2.13初始化本地方法庫的表 101
5.2.14初始化內部本地方法 101
5.2.15初始化JNI調用表 101
5.2.16快取Java類庫里的反射類 104
5.2.17最後的工作 106
5.3啟動zygote 110
5.3.1在init.rc中配置zygote啟動
參數 111
5.3.2啟動Socket服務連線埠 111
5.3.3載入preload-classes 113
5.3.4載入preload-resources 114
5.3.5使用folk啟動新進程 115
5.4啟動SystemServer進程 116
5.4.1啟動各種系統服務執行緒 117
5.4.2啟動第一個Activity 119
5.5class類檔案的載入 119
5.5.1DexFile在記憶體中的映射 119
5.5.2ClassObject——Class在載入後
的表現形式 121
5.5.3findClassNoInit——載入Class
並生成相應ClassObject的
函式 122
5.5.4載入基本類庫檔案 123
5.5.5載入用戶類檔案 124
5.6解釋執行類 124
5.6.1Dalvik虛擬機位元組碼和
JVM位元組碼的區別 124
5.6.2Davik虛擬機的解釋器最佳化 125
第6章dex的最佳化和安全管理 127
6.1Androiddex檔案最佳化簡介 127
6.2dex檔案的格式 128
6.2.1map_list 129
6.2.2string_id_item 131
6.2.3type_id_item 135
6.2.4proto_id_item 136
6.2.5field_id_item 137
6.2.6method_id_item 137
6.2.7class_def_item 138
6.3dex檔案結構 141
6.3.1檔案頭(FileHeader) 142
6.3.2魔數欄位 143
6.3.3檢驗碼欄位 143
6.3.4SHA-1簽名欄位 145
6.3.5map_off欄位 146
6.3.6string_ids_size和off欄位 147
6.4Android的DexFile接口 149
6.4.1構造函式 149
6.4.2公共方法 149
6.5Dex和動態載入類機制 151
6.5.1類載入機制 151
6.5.2Dalvik虛擬機類載入機制 151
6.5.3具體的實際操作 153
6.5.4代碼加密 153
6.6Android動態載入jar和DEX 154
6.6.1Android的動態載入 154
6.6.2演練動態載入 154
6.7dex檔案的再最佳化 157
第7章生命周期管理 158
7.1Android程式的生命周期 158
7.1.1進程和執行緒 158
7.1.2進程的類型 159
7.2Activity的生命周期 160
7.2.1Activity的幾種狀態 160
7.2.2分解剖析Activity 161
7.2.3幾個典型的場景 162
7.2.4管理Activity的生命周期 163
7.2.5Activity的實例化與啟動 163
7.2.6Activity的暫停與繼續 164
7.2.7Activity的關閉/銷毀與
重新運行 165
7.2.8Activity的啟動模式 166
7.3Android進程與執行緒 166
7.3.1進程 167
7.3.2執行緒 167
7.3.3執行緒安全的方法 167
7.4測試生命周期 168
7.5Service的生命周期 172
7.5.1Service的基本概念和用途 172
7.5.2Service的生命周期詳解 172
7.5.3Service與Activity通信 172
7.6Android廣播的生命周期 178
7.7Dalvik的進程管理 180
7.7.1Zygote 180
7.7.2Dalvik的進程模型 191
7.7.3Dalvik虛擬機的進程通信 196
第8章記憶體分配策略 201
8.1Java的記憶體分配管理 201
8.1.1記憶體分配中的棧和堆 201
8.1.2堆和棧的合作 204
8.2運行時的數據區域 207
8.2.1程式計數器
(ProgramCounterRegister) 208
8.2.2Java的虛擬機棧VMStack 209
8.2.3本地方法棧NativeMethod
Stack 209
8.2.4Java堆(JavaHeap) 210
8.2.5方法區 210
8.2.6運行時常量池 211
8.2.7直接記憶體 212
8.3對象訪問 212
8.3.1對象訪問基礎 213
8.3.2具體測試 214
8.4記憶體泄漏 220
8.4.1記憶體泄漏的分類 221
8.4.2記憶體泄漏的定義 221
8.4.3記憶體泄漏的常見問題和後果 221
8.4.4檢測記憶體泄漏 223
8.5Davlik虛擬機的記憶體分配 223
8.6分析Dalvik虛擬機的記憶體管理
機制源碼 225
8.6.1表示堆的結構體 225
8.6.2表示點陣圖堆的結構體數據 226
8.6.3HeapSource結構體 226
8.6.4和markbits相關的結構體 227
8.6.5結構體GcHeap 228
8.6.6初始化垃圾回收器 230
8.6.7初始化和Heap相關的信息 230
8.6.8創建GcHeap 231
8.6.9追蹤位置 233
8.6.10實現空間分配 234
8.6.11其他模組 237
8.7最佳化Dalvik虛擬機的堆記憶體分配 242
8.8查看Android記憶體泄漏的工具
——MAT 243
第9章垃圾收集 247
9.1初探Java虛擬機中的垃圾收集 247
9.1.1何謂垃圾收集 247
9.1.2常見的垃圾收集策略 247
9.1.3Java虛擬機的垃圾收集策略 249
9.2Java虛擬機垃圾收集的算法 250
9.2.1“標記-清除”算法 251
9.2.2複製算法 251
9.2.3標記-整理算法 252
9.2.4分代收集算法 253
9.3垃圾收集器 253
9.3.1Serial收集器 254
9.3.2ParNew收集器 255
9.3.3ParallelScavenge收集器 256
9.3.4SerialOld收集器 256
9.3.5ParallelOld收集器 257
9.3.6CMS收集器 257
9.3.7G1收集器 258
9.3.8垃圾收集器參數總結 259
9.4Android中的垃圾回收 260
9.4.1sp和wp簡析 260
9.4.2詳解智慧型指針(androidrefbase類
(sp和wp)) 262
9.5Dalvik垃圾收集的三種算法 264
9.5.1引用計數 264
9.5.2MarkSweep算法 264
9.5.3和垃圾收集算法有關的函式 266
9.5.4在什麼時候進行垃圾回收 275
9.5.5調試信息 276
9.6Dalvik虛擬機和Java虛擬機垃圾收集
機制的區別 277
第10章執行緒管理 279
10.1Java中的執行緒機制 279
10.1.1Java的多執行緒 279
10.1.2執行緒的實現 280
10.1.3執行緒調度 282
10.1.4執行緒狀態間的轉換 283
10.1.5執行緒安全 287
10.1.6執行緒安全的實現方法 290
10.1.7無狀態類 294
10.2Android的執行緒模型 296
10.2.1Android的單執行緒模型 297
10.2.2MessageQueue 297
10.2.3AsyncTask 298
10.3分析Android的進程通信機制 299
10.3.1Android的進程間通信(IPC)
機制Binder 299
10.3.2ServiceManager是Binder
機制的上下文管理者 301
10.3.3分析Server和Client獲得
ServiceManager的過程 319
第11章JNI接口 323
11.1JNI技術基礎 323
11.1.1JNI概述 323
11.1.2JNI帶來了什麼 323
11.1.3JNI的結構 324
11.1.4JNI的實現方式 325
11.1.5JNI的代碼實現和調用 325
11.2JNI技術的功能 326
11.2.1解決性能問題 326
11.2.2解決本機平台接口調用問題 327
11.2.3嵌入式開發套用 327
11.3在Android中使用JNI 328
11.3.1使用JNI的流程 328
11.3.2使用JNI技術來進行
二次封裝 328
11.3.3AndroidJNI使用的數據
結構JNINativeMethod 330
11.3.4通過JNI實現Java對
C/C++函式的調用 331
11.3.5調用Native(本地)方法傳遞
參數並且返回結果 335
11.3.6使用JNI調用C/C++開發的
共享庫 337
11.3.7使用執行緒及回調更新UI 341
11.3.8使用JNI實現Java與C之間
傳遞數據 343
11.4Dalvik虛擬機的JNI測試函式 348
11.5總結Android中JNI編程的
一些技巧 349
11.5.1傳遞Java的基本類型 349
11.5.2傳遞String參數 350
11.5.3傳遞數組類型 351
11.5.4二維數組和String數組 351
第12章JIT編譯 356
12.1JIT簡介 356
12.1.1JIT概述 356
12.1.2Java虛擬機主要的最佳化技術 358
12.1.3Dalvik虛擬機中JIT的實現 359
12.2Dalvik虛擬機對JIT的支持 359
12.3彙編代碼和改動 360
12.3.1彙編部分代碼 361
12.3.2對C檔案的改動 361
12.4Dalvik虛擬機中的源碼分析 361
12.4.1入口檔案 362
12.4.2核心函式 373
12.4.3編譯檔案 376
12.4.4BasicBlock處理 387
12.4.5記憶體初始化 388
12.4.6對JIT源碼的總結 392
第13章異常管理 394
13.1Java中的異常處理 394
13.1.1認識異常 394
13.1.2Java的異常處理機制 395
13.1.3Java提供的異常處理類 397
13.2處理Java異常的方式 398
13.2.1使用try…catch處理異常 398
13.2.2在異常中使用finally關鍵字 399
13.2.3訪問異常信息 399
13.2.4拋出異常 400
13.2.5自定義異常 401
13.2.6Java異常處理語句的規則 402
13.3Java虛擬機的異常處理機制 404
13.3.1Java異常處理機制基礎 404
13.3.2COSIX虛擬機異常處理的
設計與實現 405
13.4分析Dalvik虛擬機異常處理的源碼 409
13.4.1初始化虛擬機使用的異常
Java類庫 409
13.4.2拋出一個執行緒異常 410
13.4.3持續拋出進程 411
13.4.4拋出異常名 413
13.4.5找出異常的原因 413
13.4.6清除掛起的異常和等待
初始化的異常 417
13.4.7包裝“現在等待”異常的
不同例外 417
13.4.8輸出跟蹤當前異常的
錯誤信息 418
13.4.9搜尋和當前異常相匹配的
方法 419
13.4.10獲取匹配的捕獲塊 421
13.4.11進行堆疊跟蹤 423
13.4.12生成堆疊跟蹤元素 425
13.4.13將內容添加到堆疊跟蹤
日誌中 426
13.4.14列印輸出為堆疊跟蹤信息 427

相關詞條

熱門詞條

聯絡我們