作 者:鐘世禮 著
定 價:99
出 版 社:人民郵電出版社
出版日期:2016年09月01日
頁 數:595
裝 幀:簡裝
ISBN:9787115423535
依次講解了Java虛擬機基礎、Android虛擬機基礎分析JNI、內存繫統、Android程序的生命周期管理、IPC進程通信機制、init進程,講解了Dalvik VM的進程繫統和運作流程、Dvlik VM內存繫統詳解、Dalvik VM垃圾收集機制、Dalvik VM內存優化機制、Dalvik VM的啟動過程、Dalvik VM異常處理,以及Dalvik VM內存優化和Dalvik VM性能優化等內容。
●目錄章 獲取並編譯Android源碼 11.1 獲取Android源碼 11.1.1 在Linux繫統獲取Android源碼 11.1.2 在Windows平臺獲取Android源碼 21.1.3 Windows獲取Android L源碼 41.2 分析Android源碼結構 61.3 編譯Android源碼 81.3.1 搭建編譯環境 81.3.2 開始編譯 91.3.3 在模擬器中運行 101.3.4 常見的錯誤分析 101.3.5 實踐演練—演示兩種編譯Android程序的方法 111.4 編譯Android Kernel 141.4.1 獲取Goldfish內核代碼 141.4.2 獲取MSM內核代碼 171.4.3 獲取OMAP內核代碼 171.4.4 編譯Android的Linux內核 17第2章 Java虛擬機基礎 192.1 虛擬機的作用 192.2 Java虛擬機概述 202.2.1 JVM的數據類型 202.2.2 Java虛擬機體繫結構 212.2.3 JVM的生命周期 252.3 JVM的安全性 262.3.1 JVM的安全模型 262.3.2 沙箱模型的4種組件 272.3.3 分析Java的策略機制 282.4 網絡移動性 292.4.1 現實需要網絡移動性 292.4.2 網絡移動性 302.5 內存異常和垃圾處理 312.5.1 內存分配中的棧和堆 312.5.2 運行時的數據區域 332.5.3 對像訪問 342.5.4 內存洩露 352.5.5 JVM的垃圾收集策略 362.5.6 垃圾收集器 372.6 Java內存模型 372.6.1 Java內存模型概述 382.6.2 主內存與工作內存 382.6.3 內存間交互操作 39第3章 Dalvik和ART基礎 403.1 Dalvik VM和JVM的差異 403.2 Dalvik虛擬機的主要特征 413.3 Dalvik VM架構 423.3.1 Dalvik虛擬機的代碼結構 423.3.2 dx工具 443.3.3 Dalvik VM的進程管理 443.3.4 Android的初始化流程 443.4 Dalvik VM控制VM命令詳解 453.4.1 基本命令 453.4.2 擴展的JNI檢測 453.4.3 斷言 463.4.4 字節碼校驗和優化 463.4.5 Dalvik VM的運行模式 473.4.6 死鎖預測 473.4.7 dump堆棧追蹤 483.4.8 dex文件和校驗 483.4.9 產生標志位 483.5 ART機制基礎 483.5.1 什麼是ART模式 483.5.2 ART優化機制基礎 50第4章 分析JNI 524.1 JNI的本質 524.2 分析Java層 544.2.1 加載JNI庫 544.2.2 實現掃描工作 554.2.3 讀取並保存信息 564.2.4 刪除SD卡外的信息 584.2.5 直接轉向JNI 584.2.6 掃描函數scanFile 594.2.7 JNI中的異常處理 594.3 分析JNI層 604.3.1 將Native對像的指針保存到Java對像 604.3.2 創建Native層的MediaScanner對像 604.4 Native(本地)層 614.4.1 注冊JNI函數 614.4.2 完成注冊工作 634.4.3 動態注冊 644.4.4 處理路徑參數 654.4.5 掃描文件 664.4.6 添加TAG信息 664.4.7 總結函數JNI_OnLoad()與函數JNI_OnUnload()的用途 674.4.8 Java與JNI基本數據類型轉換 674.4.9 JNIEnv接口 694.4.10 JNI中的環境變量 70第5章 分析內存繫統 715.1 分析Android的進程通信機制 715.1.1 Android的進程間通信(IPC)機制Binder 715.1.2 Service Manager是Binder機制的上下文管理者 725.1.3 Service Manager服務 865.2 匿名共享內存子繫統詳解 895.2.1 基礎數據結構 895.2.2 初始化處理 905.2.3 打開匿名共享內存設備文件 915.2.4 內存映射 935.2.5 讀寫操作 945.2.6 鎖定和解鎖 955.2.7 回收內存塊 1005.3 C++訪問接口層詳解 1015.3.1 接口MemoryBase 1015.3.2 接口MemoryBase 1085.4 Java訪問接口層詳解 111第6章 Android程序的生命周期管理 1156.1 Android程序的生命周期 1156.1.1 進程和線程 1156.1.2 進程的類型 1166.2 Activity的生命周期 1166.2.1 Activity的幾種狀態 1176.2.2 分解剖析Activity 1176.2.3 幾個典型的場景 1196.2.4 管理Activity的生命周期 1196.2.5 Activity的實例化與啟動 1206.2.6 Activity的暫停與繼續 1206.2.7 Activity的關閉/銷毀與重新運行 1216.2.8 Activity的啟動模式 1216.3 進程與線程 1226.3.1 進程 1226.3.2 線程 1236.3.3 線程安全的方法 1236.3.4 Android的線程模型 1236.4 測試生命周期 1256.5 Service的生命周期 1296.5.1 Service的基本概念和用途 1296.5.2 Service的生命周期詳解 1296.5.3 Service與Activity通信 1296.6 Android廣播的生命周期 1336.6.1 Android 的廣播機制 1336.6.2 編寫廣播程序 1336.7 ART進程管理 135第7章 IPC進程通信機制 1477.1 Binder機制概述 1477.2 Service Manager是Binder機制的上下文管理者 1487.2.1 入口函數 1487.2.2 打開Binder設備文件 1497.2.3 創建設備文件 1497.2.4 管理內存映射地址空間 1547.2.5 發生通知 1567.2.6 循環等待 1617.3 內存映射 1627.3.1 實現內存分配功能 1627.3.2 分配物理內存 1647.3.3 釋放物理頁面 1667.3.4 分配內核緩衝區 1677.3.5 釋放內核緩衝區 1687.3.6 查詢內核緩衝區 170第8章 init進程詳解 1718.1 init基礎 1718.2 分析入口函數 1728.3 配置文件詳解 1748.3.1 init.rc簡介 1748.3.2 分析init.rc的過程 1768.4 解析service 1798.4.1 Zygote對應的service action 1798.4.2 init組織service 1808.4.3 函數parse_service和parse_line_service 1818.5 字段on 1848.5.1 Zygote對應的on action 1848.5.2 init組織on 1858.5.3 解析on用到的函數 1868.6 在init控制service 1868.6.1 啟動Zygote 1868.6.2 啟動service 1878.6.3 4種啟動service的方式 1918.7 控制屬性服務 1948.7.1 引入屬性 1948.7.2 初始化屬性服務 1978.7.3 啟動屬性服務 1978.7.4 處理設置屬性的請求 200第9章 Dalvik VM的進程繫統 2029.1 Zygote(孕育)進程詳解 2029.1.1 Zygote基礎 2029.1.2 分析Zygote的啟動過程 2039.2 System進程詳解 2169.2.1 啟動System進程前的準備工作 2169.2.2 分析SystemServer 2179.2.3 分析EntropyService 2209.2.4 分析DropBoxManagerService 2229.2.5 分析DiskStatsService 2279.2.6 分析DeviceStorageManager Service 2319.2.7 分析SamplingProfilerService 2339.2.8 分析ClipboardService 2419.3 應用程序進程詳解 2479.3.1 創建應用程序 2479.3.2 啟動線程池 2569.3.3 創建信息循環 2570章 Dalvik VM運作流程詳解 25910.1 Dalvik VM相關的可執行程序 25910.1.1 dalvikvm、dvz和app_process 簡介 25910.1.2 對比app_process和dalvikvm的 執行過程 26010.2 初始化Dalvik虛擬機 26210.2.1 開始虛擬機的準備工作 26210.2.2 初始化跟蹤顯示繫統 26210.2.3 初始化垃圾回收器 26310.2.4 初始化線程列表和主線程 環境參數 26310.2.5 分配內部操作方法的表格 內存 26410.2.6 初始化虛擬機的指令碼相關 的內容 26410.2.7 分配指令寄存器狀態的 內存 26410.2.8 分配指令寄存器狀態的內存 和最基本用的Java庫 26510.2.9 初始化使用的Java類庫 線程類 26610.2.10 初始化虛擬機使用的異常 Java類庫 26710.2.11 初始化其他對像 26810.3 啟動Zygote 27610.3.1 在init.rc中配置Zygote啟動 參數 27610.3.2 啟動Socket服務端口 27610.3.3 加載preload-classes 27710.3.4 加載preload-resources 27710.3.5 使用folk啟動新進程 27810.4 啟動SystemServer進程 27810.4.1 啟動各種繫統服務線程 27910.4.2 啟動個Activity 28010.5 加載class類文件 28110.5.1 DexFile在內存中的映射 28110.5.2 ClassObject—Class在 加載後的表現形式 28310.5.3 加載Class並生成相應 ClassObject的函數 28310.5.4 加載基本類庫文件 28410.5.5 加載用戶類文件 2841章 DEX文件詳解 28511.1 DEX文件介紹 28511.2 DEX文件的格式 28511.2.1 map_list 28611.2.2 string_id_item 28811.2.3 type_id_item 29111.2.4 proto_id_item 29211.2.5 ield_id_item 29311.2.6 method_id_item 29311.2.7 class_def_item 29411.3 DEX文件結構 29711.3.1 文件頭(File Header) 29711.3.2 魔數字段 29811.3.3 檢驗碼字段 29811.3.4 SHA-1簽名字段 30011.3.5 map_off字段 30011.3.6 string_ids_size和off字段 30111.4 DEXFile接口詳解 30311.4.1 構造函數 30311.4.2 公共方法 30411.5 DEX和動態加載類機制 30611.5.1 類加載機制 30611.5.2 具體加載 30611.5.3 代碼加密 30811.6 動態加載jar和DEX 3092章 Dvlik VM內存繫統詳解 31012.1 如何分配內存 31012.2 內存管理機制詳解 31212.3 優化Dalvik虛擬機的堆內存分配 3263章 Dalvik VM垃圾收集機制 32813.1 引用計數算法 32813.2 Mark Sweep算法 32813.3 和垃圾收集算法有關的函數 33013.4 垃圾回收的時機 34613.5 調試信息 34713.6 Dalvik VM和JVM垃圾收集機制的 區別 3484章 Dalvik VM內存優化機制詳解 35014.1 sp和wp簡介 35014.1.1 sp基礎 35014.1.2 wp基礎 35114.2 智能指針詳解 35114.2.1 智能指針基礎 35214.2.2 輕量級指針 35314.2.3 強指針 35514.2.4 弱指針 3655章 分析Dalvik VM的啟動過程 36915.1 Dalvik VM啟動流程概覽 36915.2 Dalvik VM啟動過程詳解 37015.2.1 創建Dalvik VM實例 37015.2.2 指定一繫列控制選項 37115.2.3 創建並初始化Dalvik VM 實例 37615.2.4 創建JNIEnvExt對像 37815.2.5 設置當前進程和進程組ID 38215.2.6 注冊Android核心類的JNI 方法 38215.2.7 創建javaCreateThreadEtc 鉤子 3856章 注冊Dalvik VM並創建線程 38716.1 注冊Dalvik VM的JNI方法 38716.1.1 設置加載程序 38716.1.2 加載so文件並驗證 38716.1.3 獲取描述類 39216.1.4 注冊JNI方法 39216.1.5 實現JNI操作 39416.2 創建Dalvik VM進程 39516.2.1 分析底層啟動過程 39516.2.2 創建Dalvik VM進程 39516.2.3 初始化運行的Dalvik VM 39816.3 創建Dalvik VM線程 39916.3.1 檢查狀態值 39916.3.2 創建線程 39916.3.3 分析啟動過程 40216.3.4 清理線程 4047章 Dalvik VM異常處理詳解 40717.1 Java異常處理機制 40717.1.1 方法調用棧 40717.1.2 Java提供的異常處理類 40917.2 Java VM異常處理機制詳解 40917.2.1 Java語言及虛擬機的異常 處理機制 41017.2.2 COSIX虛擬機異常處理的 設計與實現 41017.3 分析Dalvik虛擬機異常處理的 源碼 41417.3.1 初始化虛擬機使用的異常 Java類庫 41417.3.2 拋出一個線程異常 41517.3.3 持續拋出進程 41517.3.4 找出異常原因 41617.3.5 找出異常原因 41717.3.6 清除掛起的異常和等待 初始化的異常 42017.3.7 包裝“現在等待”異常的 不同例外 42017.3.8 輸出跟蹤當前異常的錯誤 信息 42117.3.9 搜索和當前異常相匹配的 方法 42117.3.10 獲取匹配的捕獲塊 42317.3.11 進行堆棧跟蹤 42417.3.12 生成堆素 42517.3.13 將內容添加到堆棧跟蹤 日志中 42617.3.14 將內容添加到堆棧跟蹤 日志中 42717.4 常見異常的類型與原因 42817.4.1 SQLException:操作數據庫 異常類 42817.4.2 ClassCastException:數據 類型轉換異常 42817.4.3 NumberFormatException: 字符串轉換為數字類型時 拋出的異常 42817.5 調用堆棧跟蹤分析異常 42917.5.1 解決段錯誤 42917.5.2 跟蹤Android Callback調用 堆棧 4318章 JIT編譯 43418.1 JIT簡介 43418.1.1 JIT概述 43418.1.2 Java虛擬機主要的優化 技術 43618.1.3 Dalvik中JIT的實現 43618.2 Dalvik VM對JIT的支持 43618.3 彙編代碼和改動 43818.3.1 彙編部分代碼 43818.3.2 對C文件的改動 43818.4 Dalvik VM中的JIT源碼 43918.4.1 入口文件 43918.4.2 核心函數 44718.4.3 編譯文件 45018.4.4 BasicBlock處理 45818.4.5 內存初始化 45918.4.6 對JIT源碼的總結 4629章 Dalvik VM內存優化 46319.1 Android內存優化的作用 46319.2 查看Android內存和CPU使用情況 46419.2.1 利用Android API函數查看 46419.2.2 直接對Android文件進行 解析查詢 46419.2.3 通過Runtime類實現 46519.2.4 使用DDMS工具獲取 46519.2.5 其他方法 46919.3 Android的內存洩露 47219.3.1 什麼是內存洩漏 47219.3.2 為什麼會發生內存洩露 47319.3.3 shallow size、retained size 47419.3.4 查看Android內存洩露的 工具——MAT 47519.3.5 查看Android內存洩露的 方法 47819.3.6 Android(Java)中常見的容易 引起內存洩漏的不良代碼 48019.4 常見的引起內存洩露的壞習慣 48019.4.1 查詢數據庫時忘記 關閉遊標 48119.4.2 構造Adapter時不習慣使用 緩存的convertView 48119.4.3 沒有及時釋放對像的引用 48219.4.4 不在使用Bitmap對像時調用 recycle()釋放內存 48219.5 解決內存洩露實踐 48319.5.1 使用MAT根據heap dump分析Java代碼內存洩漏的根源 48319.5.2 演練Android中內存洩露 代碼優化及檢測 489第20章 Dalvik VM性能優化 49120.1 加載APK/DEX文件優化 49120.1.1 APK文件介紹 49220.1.2 DEX文件優化 49320.1.3 使用類動態加載技術實現 加密優化 49320.2 SD卡優化 49620.3 虛擬機優化詳解 49720.3.1 平臺優化—ARM的流水線 技術 49720.3.2 Android對C庫優化 50120.3.3 優化創建的進程 50420.3.4 渲染優化 504第21章 分析ART的啟動過程 50821.1 運行環境的轉換 50821.2 運行 app_process 進程 50921.3 準備啟動 51221.4 創建運行實例 51821.5 注冊本地JNI函數 51921.6 啟動守護進程 52021.7 解析參數 52121.8 初始化類、方法和域 528第22章 執行ART主程序 53422.1 進入main主函數 53422.2 查找目標類 53522.2.1 函數LookupClass() 53522.2.2 函數DefineClass() 53722.2.3 函數InsertClass() 54022.2.4 函數LinkClass() 54122.3 類操作 54322.4 實現托管操作 544第23章 安裝APK應用程序 54923.1 PackageManagerService概述 54923.2 主函數main 54923.3 調用初始化函數 55023.4 創建PackageManagerService服務 55323.5 掃描並解析 55423.6 保存解析信息 570第24章 ART環境安裝APK應用程序 57224.1 Android安裝APK概述 57224.2 啟動時安裝 57224.3 ART安裝 58124.4 實現dex2oat轉換 58624.4.1 參數解析 58624.4.2 創建 OAT文件指針 58824.4.3 dex2oat準備工作 58824.4.4 提取classes.dex文件 58924.4.5 創建OAT文件 59424.5 APK文件的轉換 595
Android繫統從誕生到現在的短短幾年時間裡,憑借其易用性和開發的簡潔性,贏得了廣大開發者的支持。在整個Android繫統中,Dalvik VM一直是貫穿從底層內核到高層應用開發的核心。本書循序漸進地講解了Android虛擬機繫統的基本知識,並剖析了其整個內存繫統的進程和運作流程,並對虛擬機繫統優化和異常處理的知識進行了詳細講解。本書幾乎涵蓋了Dalvik VM繫統的所有主要內容,並且講解方法通俗易懂,特別有利於讀者學習並消化。本書適合Android初學者、Android底層開發人員、源代碼分析人員和虛擬機開發人員學習,也可以作為大專院校相關專業師生的學習用書和培訓學校的教材。
鐘世禮 著
計算機碩士,精通C、C++、Linux、Java開發技術,擅長多媒體硬件處理、多媒體信號采集、嵌入式繫統集成、物聯網、大數據等開發技術,對藍牙技術、傳感器、NFC數據傳播、紅外傳輸技術有獨特的見解。畢業後就職於施耐德公司,負責智能家居繫統的研究、開發和產品設計工作,和開發團隊一起研究出多款功能強大的智能家居、健康儀器、智能電視、車載設備等大型繫統。在Android底層架構和驅動開發方面有著豐富的經驗,硬件驅動開發專家。