深入解析Android虛擬機


深入解析Android虛擬機

本書的內容

本書特色

本書參考資料

讀者對象

1 獲取並編譯Android源碼

1.1 獲取Android源碼

1.1.1 在Linux系統獲取Android源碼
1.1.2 在Windows平台獲取Android源碼
1.1.3 Windows獲取Android L源碼

1.2 分析Android源碼結構

1.3 編譯Android源碼

1.3.1 搭建編譯環境
1.3.2 開始編譯
1.3.3 在模擬器中運行
1.3.4 常見的錯誤分析
1.3.5 實踐演練——演示兩種編譯Android程序的方法

1.4 編譯Android Kernel

1.4.1 獲取Goldfish內核代碼
1.4.2 獲取MSM內核代碼
1.4.3 獲取OMAP內核代碼
1.4.4 編譯Android的Linux內核

2 Java虛擬機基礎

2.1 虛擬機的作用

2.2 Java虛擬機概述

2.2.1 JVM的數據類型
2.2.2 Java虛擬機體系結構
2.2.3 JVM的生命周期

2.3 JVM的安全性

2.3.1 JVM的安全模型
2.3.2 沙箱模型的4種組件
2.3.3 分析Java的策略機制

2.4 網絡移動性

2.4.1 現實需要網絡移動性
2.4.2 網絡移動性

2.5 內存異常和垃圾處理

2.5.1 內存分配中的棧和堆
2.5.2 運行時的數據區域
2.5.3 對象訪問
2.5.4 內存泄露
2.5.5 JVM的垃圾收集策略
2.5.6 垃圾收集器

2.6 Java內存模型

2.6.1 Java內存模型概述
2.6.2 主內存與工作內存
2.6.3 內存間交互操作

3 Dalvik和ART基礎

3.1 Dalvik VM和JVM的差異

3.2 Dalvik虛擬機的主要特征

3.3 Dalvik VM架構

3.3.1 Dalvik虛擬機的代碼結構
3.3.2 dx工具
3.3.3 Dalvik VM的進程管理
3.3.4 Android的初始化流程

3.4 Dalvik VM控制VM命令詳解

3.4.1 基本命令
3.4.2 擴展的JNI檢測
3.4.3 斷言
3.4.4 字節碼校驗和優化
3.4.5 Dalvik VM的運行模式
3.4.6 死鎖預測
3.4.7 dump堆棧追蹤
3.4.8 dex文件和校驗
3.4.9 產生標志位

3.5 ART機制基礎

3.5.1 什么是ART模式
3.5.2 ART優化機制基礎

4 分析JNI

4.1 JNI的本質

4.2 分析Java層

4.2.1 加載JNI庫
4.2.2 實現掃描工作
4.2.3 讀取並保存信息
4.2.4 刪除SD卡外的信息
4.2.5 直接轉向JNI
4.2.6 掃描函數scanFile
4.2.7 JNI中的異常處理

4.3 分析JNI層

4.3.1 將Native對象的指針保存到Java對象
4.3.2 創建Native層的MediaScanner對象

4.4 Native(本地)層

4.4.1 注冊JNI函數
4.4.2 完成注冊工作
4.4.3 動態注冊
4.4.4 處理路徑參數
4.4.5 掃描文件
4.4.6 添加TAG信息
4.4.7 總結函數JNI_OnLoad()與函數JNI_OnUnload()的用途
4.4.8 Java與JNI基本數據類型轉換
4.4.9 JNIEnv接口
4.4.10 JNI中的環境變量

5 分析內存系統

5.1 分析Android的進程通信機制

5.1.1 Android的進程間通信(IPC)機制Binder
5.1.2 Service Manager是Binder機制的上下文管理者
5.1.3 Service Manager服務

5.2 匿名共享內存子系統詳解

5.2.1 基礎數據結構
5.2.2 初始化處理
5.2.3 打開匿名共享內存設備文件
5.2.4 內存映射
5.2.5 讀寫操作
5.2.6 鎖定和解鎖
5.2.7 回收內存塊

5.3 C++訪問接口層詳解

5.3.1 接口MemoryBase
5.3.2 接口MemoryBase

5.4 Java訪問接口層詳解

6 Android程序的生命周期管理

6.1 Android程序的生命周期

6.1.1 進程和線程
6.1.2 進程的類型

6.2 Activity的生命周期

6.2.1 Activity的幾種狀態
6.2.2 分解剖析Activity
6.2.3 幾個典型的場景
6.2.4 管理Activity的生命周期
6.2.5 Activity的實例化與啟動
6.2.6 Activity的暫停與繼續
6.2.7 Activity的關閉/銷毀與重新運行
6.2.8 Activity的啟動模式

6.3 進程與線程

6.3.1 進程
6.3.2 線程
6.3.3 線程安全的方法
6.3.4 Android的線程模型

6.4 測試生命周期

6.5 Service的生命周期

6.5.1 Service的基本概念和用途
6.5.2 Service的生命周期詳解
6.5.3 Service與Activity通信

6.6 Android廣播的生命周期

6.6.1 Android 的廣播機制
6.6.2 編寫廣播程序

6.7 ART進程管理

7 IPC進程通信機制

7.1 Binder機制概述

7.2 Service Manager是Binder機制的上下文管理者

7.2.1 入口函數
7.2.2 打開Binder設備文件
7.2.3 創建設備文件
7.2.4 管理內存映射地址空間
7.2.5 發生通知
7.2.6 循環等待

7.3 內存映射

7.3.1 實現內存分配功能
7.3.2 分配物理內存
7.3.3 釋放物理頁面
7.3.4 分配內核緩沖區
7.3.5 釋放內核緩沖區
7.3.6 查詢內核緩沖區

8 init進程詳解

8.1 init基礎

8.2 分析入口函數

8.3 配置文件詳解

8.3.1 init.rc簡介
8.3.2 分析init.rc的過程

8.4 解析service

8.4.1 Zygote對應的service action
8.4.2 init組織service
8.4.3 函數parse_service和parse_line_service

8.5 字段on

8.5.1 Zygote對應的on action
8.5.2 init組織on
8.5.3 解析on用到的函數

8.6 在init控制service

8.6.1 啟動Zygote
8.6.2 啟動service
8.6.3 4種啟動service的方式

8.7 控制屬性服務

8.7.1 引入屬性
8.7.2 初始化屬性服務
8.7.3 啟動屬性服務
8.7.4 處理設置屬性的請求

9 Dalvik VM的進程系統

9.1 Zygote(孕育)進程詳解

9.1.1 Zygote基礎
9.1.2 分析Zygote的啟動過程

9.2 System進程詳解

9.2.1 啟動System進程前的准備工作
9.2.2 分析SystemServer
9.2.3 分析EntropyService
9.2.4 分析DropBoxManagerService
9.2.5 分析DiskStatsService
9.2.6 分析DeviceStorageManagerService
9.2.7 分析SamplingProfilerService
9.2.8 分析ClipboardService

9.3 應用程序進程詳解

9.3.1 創建應用程序
9.3.2 啟動線程池
9.3.3 創建信息循環

10 Dalvik VM運作流程詳解

10.1 Dalvik VM相關的可執行程序

10.1.1 dalvikvm、dvz和app_process簡介
10.1.2 對比app_process和dalvikvm的執行過程

10.2 初始化Dalvik虛擬機

10.2.1 開始虛擬機的准備工作
10.2.2 初始化跟蹤顯示系統
10.2.3 初始化垃圾回收器
10.2.4 初始化線程列表和主線程環境參數
10.2.5 分配內部操作方法的表格內存
10.2.6 初始化虛擬機的指令碼相關的內容
10.2.7 分配指令寄存器狀態的內存
10.2.8 分配指令寄存器狀態的內存和最基本用的Java庫
10.2.9 初始化使用的Java類庫線程類
10.2.10 初始化虛擬機使用的異常Java類庫
10.2.11 初始化其他對象

10.3 啟動Zygote

10.3.1 在init.rc中配置Zygote啟動參數
10.3.2 啟動Socket服務端口
10.3.3 加載preload-classes
10.3.4 加載preload-resources
10.3.5 使用folk啟動新進程

10.4 啟動SystemServer進程

10.4.1 啟動各種系統服務線程
10.4.2 啟動第一個Activity

10.5 加載class類文件

10.5.1 DexFile在內存中的映射
10.5.2 ClassObject——Class在加載后的表現形式
10.5.3 加載Class並生成相應ClassObject的函數
10.5.4 加載基本類庫文件
10.5.5 加載用戶類文件

11 DEX文件詳解

11.1 DEX文件介紹

11.2 DEX文件的格式

11.2.1 map_list
11.2.2 string_id_item
11.2.3 type_id_item
11.2.4 proto_id_item
11.2.5 ield_id_item
11.2.6 method_id_item
11.2.7 class_def_item

11.3 DEX文件結構

11.3.1 文件頭(File Header)
11.3.2 魔數字段
11.3.3 檢驗碼字段
11.3.4 SHA-1簽名字段
11.3.5 map_off字段
11.3.6 string_ids_size和off字段

11.4 DEXFile接口詳解

11.4.1 構造函數
11.4.2 公共方法

11.5 DEX和動態加載類機制

11.5.1 類加載機制
11.5.2 具體加載
11.5.3 代碼加密

11.6 動態加載jar和DEX

12 Dvlik VM內存系統詳解

12.1 如何分配內存

12.2 內存管理機制詳解

12.3 優化Dalvik虛擬機的堆內存分配

13 Dalvik VM垃圾收集機制

13.1 引用計數算法
13.2 Mark Sweep算法
13.3 和垃圾收集算法有關的函數
13.4 垃圾回收的時機
13.5 調試信息
13.6 Dalvik VM和JVM垃圾收集機制的區別

14 Dalvik VM內存優化機制詳解

14.1 sp和wp簡介
14.1.1 sp基礎
14.1.2 wp基礎
14.2 智能指針詳解
14.2.1 智能指針基礎
14.2.2 輕量級指針
14.2.3 強指針
14.2.4 弱指針

15 分析Dalvik VM的啟動過程

15.1 Dalvik VM啟動流程概覽
15.2 Dalvik VM啟動過程詳解
15.2.1 創建Dalvik VM實例
15.2.2 指定一系列控制選項
15.2.3 創建並初始化Dalvik VM實例
15.2.4 創建JNIEnvExt對象
15.2.5 設置當前進程和進程組ID
15.2.6 注冊Android核心類的JNI方法
15.2.7 創建javaCreateThreadEtc鈎子

16 注冊Dalvik VM並創建線程

16.1 注冊Dalvik VM的JNI方法
16.1.1 設置加載程序
16.1.2 加載so文件並驗證
16.1.3 獲取描述類
16.1.4 注冊JNI方法
16.1.5 實現JNI操作
16.2 創建Dalvik VM進程
16.2.1 分析底層啟動過程
16.2.2 創建Dalvik VM進程
16.2.3 初始化運行的Dalvik VM
16.3 創建Dalvik VM線程
16.3.1 檢查狀態值
16.3.2 創建線程
16.3.3 分析啟動過程
16.3.4 清理線程

17 Dalvik VM異常處理詳解

17.1 Java異常處理機制
17.1.1 方法調用棧
17.1.2 Java提供的異常處理類
17.2 Java VM異常處理機制詳解
17.2.1 Java語言及虛擬機的異常處理機制
17.2.2 COSIX虛擬機異常處理的設計與實現
17.3 分析Dalvik虛擬機異常處理的源碼
17.3.1 初始化虛擬機使用的異常Java類庫
17.3.2 拋出一個線程異常
17.3.3 持續拋出進程
17.3.4 找出異常原因
17.3.5 找出異常原因
17.3.6 清除掛起的異常和等待初始化的異常
17.3.7 包裝“現在等待”異常的不同例外
17.3.8 輸出跟蹤當前異常的錯誤信息
17.3.9 搜索和當前異常相匹配的方法
17.3.10 獲取匹配的捕獲塊
17.3.11 進行堆棧跟蹤
17.3.12 生成堆棧跟蹤元素
17.3.13 將內容添加到堆棧跟蹤日志中
17.3.14 將內容添加到堆棧跟蹤日志中
17.4 常見異常的類型與原因
17.4.1 SQLException:操作數據庫異常類
17.4.2 ClassCastException:數據類型轉換異常
17.4.3 NumberFormatException:字符串轉換為數字類型時拋出的異常
17.5 調用堆棧跟蹤分析異常
17.5.1 解決段錯誤
17.5.2 跟蹤Android Callback調用堆棧

18 JIT編譯

18.1 JIT簡介
18.1.1 JIT概述
18.1.2 Java虛擬機主要的優化技術
18.1.3 Dalvik中JIT的實現
18.2 Dalvik VM對JIT的支持
18.3 匯編代碼和改動
18.3.1 匯編部分代碼
18.3.2 對C文件的改動
18.4 Dalvik VM中的JIT源碼
18.4.1 入口文件
18.4.2 核心函數
18.4.3 編譯文件
18.4.4 BasicBlock處理
18.4.5 內存初始化
18.4.6 對JIT源碼的總結

19 Dalvik VM內存優化

19.1 Android內存優化的作用
19.2 查看Android內存和CPU使用情況
19.2.1 利用Android API函數查看
19.2.2 直接對Android文件進行解析查詢
19.2.3 通過Runtime類實現
19.2.4 使用DDMS工具獲取
19.2.5 其他方法
19.3 Android的內存泄露
19.3.1 什么是內存泄漏
19.3.2 為什么會發生內存泄露
19.3.3 shallow size、retained size
19.3.4 查看Android內存泄露的工具——MAT
19.3.5 查看Android內存泄露的方法
19.3.6 Android(Java)中常見的容易引起內存泄漏的不良代碼
19.4 常見的引起內存泄露的壞習慣
19.4.1 查詢數據庫時忘記關閉游標
19.4.2 構造Adapter時不習慣使用緩存的convertView
19.4.3 沒有及時釋放對象的引用
19.4.4 不在使用Bitmap對象時調用recycle()釋放內存
19.5 解決內存泄露實踐
19.5.1 使用MAT根據heap dump分析Java代碼內存泄漏的根源
19.5.2 演練Android中內存泄露代碼優化及檢測

20 Dalvik VM性能優化

20.1 加載APK/DEX文件優化

20.1.1 APK文件介紹
20.1.2 DEX文件優化
20.1.3 使用類動態加載技術實現加密優化

20.2 SD卡優化

20.3 虛擬機優化詳解

20.3.1 平台優化—ARM的流水線技術
20.3.2 Android對C庫優化
20.3.3 優化創建的進程
20.3.4 渲染優化

21 分析ART的啟動過程

21.1 運行環境的轉換
21.2 運行 app_process 進程
21.3 准備啟動
21.4 創建運行實例
21.5 注冊本地JNI函數
21.6 啟動守護進程
21.7 解析參數
21.8 初始化類、方法和域

22 執行ART主程序

22.1 進入main主函數
22.2 查找目標類
22.2.1 函數LookupClass()
22.2.2 函數DefineClass()
22.2.3 函數InsertClass()
22.2.4 函數LinkClass()
22.3 類操作
22.4 實現托管操作

23 安裝APK應用程序

23.1 PackageManagerService概述
23.2 主函數main
23.3 調用初始化函數
23.4 創建PackageManagerService服務
23.5 掃描並解析
23.6 保存解析信息

24 ART環境安裝APK應用程序

24.1 Android安裝APK概述
24.2 啟動時安裝
24.3 ART安裝
24.4 實現dex2oat轉換
24.4.1 參數解析
24.4.2 創建 OAT 文件指針
24.4.3 dex2oat 准備工作
24.4.4 提取 classes.dex 文件
24.4.5 創建 OAT 文件
24.5 APK 文件的轉換
讀書筆記

思維導圖

深入解析Android虛擬機

防止博客圖床圖片失效,防止圖片源站外鏈:

http://www.processon.com/chart_image/5e5b2feae4b02bc3ad6a1372.png)

思維導圖在線編輯鏈接:

https://www.processon.com/view/5e5b2feae4b02bc3ad6a136f


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM