編輯推薦
依次講解瞭Java虛擬機基礎、Android虛擬機基礎
分析JNI、內存係統、Android程序的生命周期管理、IPC進程通信機製、init進程,講解瞭Dalvik VM的進程係統和運作流程、Dvlik VM內存係統詳解、Dalvik VM垃圾收集機製、Dalvik VM內存優化機製、Dalvik VM的啓動過程、Dalvik VM異常處理,
以及Dalvik VM內存優化和Dalvik VM性能優化等內容。
內容簡介
Android係統從誕生到現在的短短幾年時間裏,憑藉其易用性和開發的簡潔性,贏得瞭廣大開發者的支持。在整個Android係統中,Dalvik VM一直是貫穿從底層內核到高層應用開發的核心。本書循序漸進地講解瞭Android虛擬機係統的基本知識,並剖析瞭其整個內存係統的進程和運作流程,並對虛擬機係統優化和異常處理的知識進行瞭詳細講解。本書幾乎涵蓋瞭Dalvik VM係統的所有主要內容,並且講解方法通俗易懂,特彆有利於讀者學習並消化。
本書適閤Android初學者、Android底層開發人員、源代碼分析人員和虛擬機開發人員學習,也可以作為大專院校相關專業師生的學習用書和培訓學校的教材。
作者簡介
鍾世禮,計算機碩士,精通C、C++、Linux、Java開發技術,擅長多媒體硬件處理、多媒體信號采集、嵌入式係統集成、物聯網、大數據等開發技術,對藍牙技術、傳感器、NFC數據傳播、紅外傳輸技術有獨特的見解。畢業後就職於施耐德公司,負責智能傢居係統的研究、開發和産品設計工作,和開發團隊一起研究齣多款功能強大的智能傢居、健康儀器、智能電視、車載設備等大型係統。在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 Cla
深入解析Android虛擬機 下載 mobi epub pdf txt 電子書