深入解析 Android 虛擬機

鐘世禮

  • 出版商: 人民郵電
  • 出版日期: 2016-09-01
  • 定價: $594
  • 售價: 8.5$505
  • 語言: 簡體中文
  • 頁數: 595
  • 裝訂: 平裝
  • ISBN: 7115423539
  • ISBN-13: 9787115423535
  • 相關分類: Android
  • 立即出貨 (庫存 < 3)

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

商品描述

<內容簡介>

Android系統從誕生到現在的短短幾年時間裡,憑藉其易用性和開發的簡潔性,贏得了廣大開發者的支持。在整個Android系統中,Dalvik VM一直是貫穿從底層內核到高層應用開發的核心。本書循序漸進地講解了Android虛擬機系統的基本知識,並剖析了其整個內存系統的進程和運作流程,並對虛擬機系統優化和異常處理的知識進行了詳細講解。本書幾乎涵蓋了Dalvik VM系統的所有主要內容,並且講解方法通俗易懂,特別有利於讀者學習並消化。
本書適合Android初學者、Android底層開發人員、源代碼分析人員和虛擬機開發人員學習,也可以作為大專院校相關專業師生的學習用書和培訓學校的教材。

<章節目錄>

第1章獲取並編譯Android源碼1
1.1獲取Android源碼1
1.1.1在Linux系統獲取Android
源碼1
1.1.2在Windows平臺獲取Android
源碼2
1.1.3 Windows獲取Android L源碼4
1.2分析Android源碼結構6
1.3編譯Android源碼8
1.3.1搭建編譯環境8
1.3.2開始編譯9
1.3.3在模擬器中運行10
1.3.4常見的錯誤分析10
1.3.5實踐演練—演示兩種編譯Android程序的方法11
1.4編譯Android Kernel 14
1.4.1獲取Goldfish內核代碼14
1.4.2獲取MSM內核代碼17
1.4.3獲取OMAP內核代碼17
1.4.4編譯Android的Linux內核17
第2章Java虛擬機基礎19
2.1虛擬機的作用19
2.2 Java虛擬機概述20
2.2.1 JVM的數據類型20
2.2.2 Java虛擬機體系結構21
2.2.3 JVM的生命週期25
2.3 JVM的安全性26
2.3.1 JVM的安全模型26
2.3.2沙箱模型的4種組件27
2.3.3分析Java的策略機制28
2.4網絡移動性29
2.4.1現實需要網絡移動性29
2.4.2網絡移動性30
2.5內存異常和垃圾處理31
2.5.1內存分配中的棧和堆31
2.5.2運行時的數據區域33
2.5.3對象訪問34
2.5.4內存洩露35
2.5.5 JVM的垃圾收集策略36
2.5.6垃圾收集器37
2.6 Java內存模型37
2.6. 1 Java內存模型概述38
2.6.2主內存與工作內存38
2.6.3內存間交互操作39
第3章Dalvik和ART基礎40
3.1 Dalvik VM和JVM的差異40
3.2 Dalvik虛擬機的主要特徵41
3.3 Dalvik VM架構42
3.3.1 Dalvik虛擬機的代碼結構42
3.3.2 dx工具44
3.3.3 Dalvik VM的進程管理44
3.3.4 Android的初始化流程44
3.4 Dalvik VM控制VM命令詳解45
3.4.1基本命令45
3.4 .2擴展的JNI檢測45
3.4.3斷言46
3.4.4字節碼校驗和優化46
3.4.5 Dalvik VM的運行模式47
3.4.6死鎖預測47
3.4.7 dump堆棧追蹤48
3.4.8 dex文件和校驗48
3.4.9產生標誌位48
3.5 ART機制基礎48
3.5.1什麼是ART模式48
3.5.2 ART優化機制基礎50
第4章分析JNI 52
4.1 JNI的本質52
4.2分析Java層54
4.2 .1加載JNI庫54
4.2.2實現掃描工作55
4.2.3讀取並保存信息56
4.2.4刪除SD卡外的信息58
4.2.5直接轉向JNI 58
4.2.6掃描函數scanFile 59
4.2.7 JNI中的異常處理59
4.3分析JNI層60
4.3.1將Native對象的指針保存到
Java對象60
4.3.2創建Native層的MediaScanner
對象60
4.4 Native(本地)層61
4.4.1註冊JNI函數61
4.4.2完成註冊工作63
4.4.3動態註冊64
4.4.4處理路徑參數65
4.4.5掃描文件66
4.4.6添加TAG信息66
4.4.7總結函數JNI_OnLoad()與函數JNI_OnUnload()的用途67
4.4.8 Java與JNI基本數據類型
轉換67
4.4.9 JNIEnv接口69
4.4.10 JNI中的環境變量70
第5章分析內存系統71
5.1分析Android的進程通信機制71
5.1.1 Android的進程間通信(IPC)
機制Binder 71
5.1.2 Service Manager是Binder
機制的上下文管理者72
5.1.3 Service Manager服務86
5.2匿名共享內存子系統詳解89
5.2.1基礎數據結構89
5.2.2初始化處理90
5.2.3打開匿名共享內存設備文件91
5.2.4內存映射93
5.2.5讀寫操作94
5.2.6鎖定和解鎖95
5.2.7回收內存塊100
5.3 C++訪問接口層詳解101
5.3.1接口MemoryBase 101
5.3.2接口MemoryBase 108
5.4 Java訪問接口層詳解111
第6章Android程序的生命週期管理115
6.1 Android程序的生命週期115
6.1.1進程和線程115
6.1.2進程的類型116
6.2 Activity的生命週期116
6.2.1 Activity的幾種狀態117
6.2.2分解剖析Activity 117
6.2.3幾個典型的場景119
6.2.4管理Activity的生命週期119
6.2.5 Activity的實例化與啟動120
6.2.6 Activity的暫停與繼續120
6.2.7 Activity的關閉/銷毀與
重新運行121
6.2.8 Activity的啟動模式121
6.3進程與線程122
6.3.1進程122
6.3.2線程123
6.3.3線程安全的方法123
6.3.4 Android的線程模型123
6.4測試生命週期125
6.5 Service的生命週期129
6.5.1 Service的基本概念和用途129
6.5.2 Service的生命週期詳解129
6.5.3 Service與Activity通信129
6.6 Android廣播的生命週期133
6.6.1 Android的廣播機制133
6.6 .2編寫廣播程序133
6.7 ART進程管理135
第7章IPC進程通信機制147
7.1 Binder機制概述147
7.2 Service Manager是Binder機制的
上下文管理者148
7.2.1入口函數148
7.2.2打開Binder設備文件149
7.2 .3創建設備文件149
7.2.4管理內存映射地址空間154
7.2.5發生通知156
7.2.6循環等待161
7.3內存映射162
7.3.1實現內存分配功能162
7.3.2分配物理內存164
7.3.3釋放物理頁面166
7.3.4分配內核緩衝區167
7.3.5釋放內核緩衝區168
7.3.6查詢內核緩衝區170
第8章init進程詳解171
8.1 init基礎171
8.2分析入口函數172
8.3配置文件詳解174
8.3. 1 init.rc簡介174
8.3.2分析init.rc的過程176
8.4解析service 179
8.4.1 Zygote對應的service action 179
8.4.2 init組織service 180
8.4.3函數parse_service和parse_line_service 181
8.5字段on 184
8.5. 1 Zygote對應的on action 184
8.5.2 init組織on 185
8.5.3解析on用到的函數186
8.6在init控制service 186
8.6.1啟動Zygote 186
8.6.2啟動service 187
8.6.3 4種啟動service的方式191
8.7控制屬性服務194
8.7.1引入屬性194
8.7.2初始化屬性服務197
8.7.3啟動屬性服務197
8.7.4處理設置屬性的請求200
第9章Dalvik VM的進程系統202
9.1 Zygote(孕育)進程詳解202
9.1.1 Zygote基礎202
9.1.2分析Zygote的啟動過程203
9.2 System進程詳解216
9.2.1啟動System進程前的準備
工作216
9.2.2分析SystemServer 217
9.2.3分析EntropyService 220
9.2.4分析DropBoxManagerService 222
9.2.5分析DiskStatsService 227
9.2.6分析DeviceStorageManager Service 231
9.2.7分析SamplingProfilerService 233
9.2.8分析ClipboardService 241
9.3應用程序進程詳解247
9.3.1創建應用程序247
9.3.2啟動線程池256
9.3.3創建信息循環257
第10章Dalvik VM運作流程詳解259
10.1 Dalvik VM相關的可執行程序259
10.1.1 dalvikvm、dvz和app_process
 簡介259
10.1.2對比app_process和dalvikvm的
 執行過程260
10.2初始化Dalvik虛擬機262
10.2 .1開始虛擬機的準備工作262
10.2.2初始化跟蹤顯示系統262
10.2.3初始化垃圾回收器263
10.2.4初始化線程列表和主線程
 環境參數263
10.2.5分配內部操作方法的表格
 內存264
10.2. 6初始化虛擬機的指令碼相關
 的內容264
10.2.7分配指令寄存器狀態的
 內存264
10.2.8分配指令寄存器狀態的內存
 和最基本用的Java庫265
10.2.9初始化使用的Java類庫
 線程類266
10.2.10初始化虛擬機使用的異常
 Java類庫267
10.2.11初始化其他對象268
10.3啟動Zygote 276
10.3.1在init.rc中配置Zygote啟動
 參數276
10.3.2啟動Socket服務埠276
10.3.3加載preload -classes 277
10.3.4加載preload-resources 277
10.3.5使用folk啟動新進程278
10.4啟動SystemServer進程278
10.4.1啟動各種系統服務線程279
10.4.2啟動第一個Activity 280
10.5加載class類文件281
10.5.1 DexFile在內存中的映射281
10.5.2 ClassObject—Class在
 加載後的表現形式283
10.5.3加載Class並生成相應
 ClassObject的函數283
10.5.4加載基本類庫文件284
10.5.5加載用戶類文件284
第11章DEX文件詳解285
11.1 DEX文件介紹285
11.2 DEX文件的格式285
11.2.1 map_list 286
11.2.2 string_id_item 288
11.2.3 type_id_item 291
11.2.4 proto_id_item 292
11.2.5 ield_id_item 293
11.2.6 method_id_item 293
11.2.7 class_def_item 294
11.3 DEX文件結構297
11.3.1文件頭(File Header) 297
11.3.2魔數字段298
11.3.3檢驗碼字段298
11.3.4 SHA-1簽名字段300
11.3.5 map_off字段300
11.3 .6 string_ids_size和off字段301
11.4 DEXFile接口詳解303
11.4.1構造函數303
11.4.2公共方法304
11.5 DEX和動態加載類機制306
11.5.1類加載機制306
11.5.2具體加載306
11.5.3代碼加密308
11.6動態加載jar和DEX 309
第12章Dvlik VM內存系統詳解310
12.1如何分配內存310
12.2內存管理機制詳解312
12.3優化Dalvik虛擬機的堆內存分配326
第13章Dalvik VM垃圾收集機制328
13.1引用計數算法328
13.2 Mark Sweep算法328
13.3和垃圾收集算法有關的函數330
13.4垃圾回收的時機346
13.5調試信息347
13.6 Dalvik VM和JVM垃圾收集機制的
 區別348
第14章Dalvik VM內存優化機制詳解350
14.1 sp和wp簡介350
14.1.1 sp基礎350
14.1.2 wp基礎351
14.2智能指針詳解351
14.2.1智能指針基礎352
14.2.2輕量級指針353
14.2.3強指針355
14.2.4弱指針365
第15章分析Dalvik VM的啟動過程369
15.1 Dalvik VM啟動流程概覽369
15.2 Dalvik VM啟動過程詳解370
15.2.1創建Dalvik VM實例370
15.2.2指定一系列控制選項371
15.2.3創建並初始化Dalvik VM
 實例376
15.2. 4創建JNIEnvExt對象378
15.2.5設置當前進程和進程組ID 382
15.2.6註冊Android核心類的JNI
 方法382
15.2.7創建javaCreateThreadEtc
 鉤子385
第16章註冊Dalvik VM並創建線程387
16.1註冊Dalvik VM的JNI方法387
16.1.1設置加載程序387
16.1.2加載so文件並驗證387
16.1.3獲取描述類392
16.1.4註冊JNI方法392
16.1.5實現JNI操作394
16.2創建Dalvik VM進程395
16.2.1分析底層啟動過程395
16.2.2創建Dalvik VM進程395
16.2.3初始化運行的Dalvik VM 398
16.3創建Dalvik VM線程399
16.3.1檢查狀態值399
16.3.2創建線程399
16.3.3分析啟動過程402
16.3.4清理線程404
第17章Dalvik VM異常處理詳解407
17.1 Java異常處理機制407
17.1.1方法調用棧407
17.1.2 Java提供的異常處理類409
17.2 Java VM異常處理機制詳解409
17.2.1 Java語言及虛擬機的異常
 處理機制410
17.2.2 COSIX虛擬機異常處理的
 設計與實現410
17.3分析Dalvik虛擬機異常處理的
 源碼414
17.3.1初始化虛擬機使用的異常
 Java類庫414
17.3.2拋出一個線程異常415
17.3.3持續拋出進程415
17.3.4找出異常原因416
17.3.5找出異常原因417
17.3.6清除掛起的異常和等待
 初始化的異常420
17.3.7包裝“現在等待”異常的
 不同例外420
17.3.8輸出跟蹤當前異常的錯誤
 信息421
17.3.9搜索和當前異常相匹配的
 方法421
17.3.10獲取匹配的捕獲塊423
17.3.11進行堆棧跟蹤424
17.3.12生成堆棧跟蹤元素425
17.3. 13將內容添加到堆棧跟蹤
 日誌中426
17.3.14將內容添加到堆棧跟蹤
 日誌中427
17.4常見異常的類型與原因428
17.4.1 SQLException:操作數據庫
 異常類428
17.4.2 ClassCastException:數據
 類型轉換異常428
17.4.3 NumberFormatException:
 字符串轉換為數字類型時
 拋出的異常428
17.5調用堆棧跟蹤分析異常429
17.5.1解決段錯誤429
17.5.2跟蹤Android Callback調用
 堆棧431
第18章JIT編譯434
18.1 JIT簡介434
18.1.1 JIT概述434
18.1.2 Java虛擬機主要的優化
 技術436
18.1.3 Dalvik中JIT的實現436
18.2 Dalvik VM對JIT的支持436
18.3彙編代碼和改動438
18.3.1彙編部分代碼438
18.3.2對C文件的改動438
18.4 Dalvik VM中的JIT源碼439
18.4.1入口文件439
18.4.2核心函數447
18.4.3編譯文件450
18.4.4 BasicBlock處理458
18.4.5內存初始化459
18.4.6對JIT源碼的總結462
第19章Dalvik VM內存優化463
19.1 Android內存優化的作用463
19.2查看Android內存和CPU使用情況464
19.2.1利用Android API函數查看464
19.2.2直接對Android文件進行
 解析查詢464
19.2.3通過Runtime類實現465
19.2.4使用DDMS工具獲取465
19.2.5其他方法469
19.3 Android的內存洩露472
19.3.1什麼是內存洩漏472
19.3.2為什麼會發生內存洩露473
19.3.3 shallow size、retained size 474
19.3.4查看Android內存洩露的
 工具——MAT 475
19.3.5查看Android內存洩露的
 方法478
19.3.6 Android(Java)中常見的容易
 引起內存洩漏的不良代碼480
19.4常見的引起內存洩露的壞習慣480
19.4.1查詢數據庫時忘記
 關閉光標481
19.4.2構造Adapter時不習慣使用
 緩存的convertView 481
19.4.3沒有及時釋放對象的引用482
19.4.4不在使用Bitmap對象時調用
 recycle()釋放內存482
19.5解決內存洩露實踐483
19.5.1使用MAT根據heap dump分析Java代碼內存洩漏的根源483
19.5.2演練Android中內存洩露
 代碼優化及檢測489
第20章Dalvik VM性能優化491
20.1加載APK/DEX文件優化491
20.1.1 APK文件介紹492
20.1.2 DEX文件優化493
20.1.3使用類動態加載技術實現
 加密優化493
20.2 SD卡優化496
20.3虛擬機優化詳解497
20.3.1平臺優化—ARM的流水線
 技術497
20.3 .2 Android對C庫優化501
20.3.3優化創建的進程504
20.3.4渲染優化504
第21章分析ART的啟動過程508
21.1運行環境的轉換508
21.2運行app_process進程509
21.3準備啟動512
21.4創建運行實例518
21.5註冊本地JNI函數519
21.6啟動守護進程520
21.7解析參數521
21.8初始化類、方法和域528
第22章執行ART主程序534
22.1進入main主函數534
22.2查找目標類535
22.2.1函數LookupClass() 535
22.2.2函數DefineClass() 537
22.2.3函數InsertClass() 540
22.2.4函數LinkClass() 541
22.3類操作543
22.4實現託管操作544
第23章安裝APK應用程序549
23.1 PackageManagerService概述549

23.2主函數main 549
23.3調用初始化函數550
23.4創建PackageManagerService服務553
23.5掃描並解析554
23.6保存解析信息570
第24章ART環境安裝APK應用程序572
24.1 Android安裝APK概述572
24.2啟動時安裝572
24.3 ART安裝581
24.4實現dex2oat轉換586
24.4.1參數解析586
24.4.2創建OAT文件指針588
24.4.3 dex2oat準備工作588
24.4.4提取classes.dex文件589
24.4.5創建OAT文件594
24.5 APK文件的轉換595