Android性能優化之道:從底層原理到一線實踐 趙子健
定 價:¥99
中 教 價:¥54.45 (5.50折)
庫 存 數: 6
這是一本深度解讀Android性能優化底層原理并給出可落地的一線實踐指導的專業技術書。書中不僅原理講解透徹,而且會給出很多基于讀者實際工作成績的實戰案例。本書共分為11章,其中第1章總體介紹Android性能優化的背景、本質、方法論和落地方向,第2~10章從原理和實戰兩個層面分別對內存優化、速度優化、穩定性優化、包體積優化及其他優化進行解讀。最后一章是作者多年優化從業經驗的總結。
這是Google認證的Android方向開發專家撰寫的一本專著,源于作者10年大廠的一線開發經驗。全書沒有無用的理論介紹,所有內容均從底層原理和一線實踐兩個維度對性能優化的方方面面進行深度解讀。本書基于 Android 14 撰寫,提供全部源碼下載(具體下載方式見前言)。
前 言為何寫這本書Android 性能優化的重要性體現在能為程序帶來更大的價值及幫助 Android 開發者增強職業競爭力這兩個方向上。性能優化可以提升程序的穩定性、運行速度和流暢性,從而提高用戶滿意度,增加用戶的留存率,促進業務增長。對于大中型公司來說,每個程序都會有專門的性能品質團隊來負責優化性能,由此可見性能優化對提升程序價值的重要性。對于Android開發者來說,掌握性能優化技術可增強職業競爭力,并有更好的職場表現。在平時的工作中,大多數人只關注基本的業務需求,很少有人關注業務需求之上的體驗需求,所以開發者若是能具備很強的性能優化能力,就可以通過產品為業務帶來更多的額外價值,那么自然就能獲得更高的認可。另外,在面試中,性能優化也是必考內容,它是開發者高階技術實力的體現,擅長性能優化的開發者更容易,在面試中脫穎而出,從而提升面試的成功率。網絡上有很多與性能優化相關的文章,市面上也有不少與性能優化相關的書籍,但是其中所講的內容大都是一個個具體的性能優化案例,看完這些案例后,我們僅知道了在某個具體場景下怎么做。但是在實際開發中,我們面對的場景是多樣且復雜的,不同的業務類型、不同的性能設備都會導致性能優化方法的不同。因此,很多時候我們會因為無法在網上找到同樣場景的優化方案,而不知道從哪里開始下手,或者即便找到了類似的場景,并參考別人的方案制定了自己的優化方案,但是最終的優化效果很差,甚至可能出現優化方案根本無法落地的情況。基于此,筆者決定寫一本關于Android性能優化的圖書。筆者擁有豐富的Android性能優化經驗,先后負責過快應用引擎、飛書客戶端等多個大型Android應用的性能優化工作。在多年的性能優化工作中,筆者總結了大量的經驗和技巧,并經過兩年的提煉和總結,形成了一套完整的性能優化體系。筆者認為,要想做好性能優化,僅通過博客等網絡渠道進行零碎學習是不夠的,而是需要扎實且成體系地學習硬件、系統、應用等多個層面的知識點。所以本書不僅會講解具體的性能優化實例,還會深入講解實現性能優化需要具備的知識體系。筆者希望讀者基于本書所講的知識體系和經驗,能夠構建出自己的性能優化方法論,真正了解性能優化的本質,從而能夠根據具體場景靈活制定性能優化方案。本書特色相較于其他同類圖書或者網絡文章,本書具有如下特色。直指本質:針對所有性能問題,本書都從底層原理進行剖析,幫助讀者理解出現類似問題的根本原因。實戰性強:本書所有內容都來自筆者多年的實際工作總結和思考,以落地實操為最終目標,可以幫助讀者真正解決實際工作中遇到的問題。內容全面:本書包含內存優化、速度和流暢性優化、穩定性優化、包體積優化、耗電優化、磁盤占用優化、流量優化等典型優化內容,覆蓋了應用層、系統層、硬件層等多個維度。體系性強:本書力求構建出一套性能優化方法論,這套方法論可以幫助讀者從多個角度思考性能優化問題,從而靈活構建可以滿足自己場景需求的性能優化方案。案例豐富:本書給出了大量涉及應用層、系統層、硬件層等多個維度的針對監控和優化等環節的具體案例。基于Android 14 撰寫:本書主要基于Android 14進行講解,這樣可以確保讀者所學的知識點都是較新的。但是,出于兼容性考慮,實際工作中往往要基于各個系統版本來做性能優化,所以本書也會涉及 Android 14以外的其他Android版本的源碼。提供全部源碼下載:因為很多問題都是通過示例程序講解的,所以書中涉及大量源碼,對這些源碼均提供了完整下載,下載鏈接為https://github.com/helsonzhao/android_performance。本書讀者對象本書適合以下讀者閱讀。初級Android開發者:這部分讀者雖然主要精力放在基本業務需求上,但是要想快速成長并跑贏競爭對手,不可錯過本書。中級Android開發者:這部分讀者在日常工作中已經開始關注性能問題,本書是他們突破瓶頸、高質量完成開發工作的最佳選擇。所有從事性能優化工作的人員:除了Android性能優化相關從業者,其他操作系統的性能優化人員也可以通過本書學到性能優化的原理和方法,這些原理和方法其實并不局限于具體的平臺或者系統,而是相通的。對Android底層原理感興趣的讀者:本書剖析了大量Android底層源碼,讀者可以通過這部分內容深入理解Android底層原理。如何閱讀本書對于初級Android開發人員,建議重點研讀原理部分,這些知識點能幫助這部分讀者建立完整的知識體系,有了這些知識,便可以輕松應對日常開發工作。至于實戰部分,這部分讀者可以在之后的開發工作中慢慢地閱讀和實踐。對于中級Android開發人員,因為性能優化工作是其日常工作中的重要組成部分,所以建議從前到后通讀全書,全方位了解 Android 性能優化知識。書中有不少優化案例用到了比較復雜的技術,如 Native Hook 技術、字節碼插樁等,這些技術是Android進階要掌握的知識點,可以幫助這部分讀者在技術方面更上一層樓。對于其他讀者,建議選擇自己喜歡或者需要的章節進行針對性閱讀。致謝感謝太太張藝,由于本書的內容較多,專業性較強,很多時候筆者都懷疑自己是否能夠完成本書的寫作,是你的鼓勵才讓筆者堅持下來。還要感謝許多活躍在技術社區的朋友們,感謝大家提出的建議和長期以來對筆者的支持,希望本書能夠不辜負你們的期望。
現為字節跳動資深 Android 開發工程師,負責飛書客戶端性能品質優化工作。熟悉 Android 和 Linux 系統底層原理,擅長性能優化。曾任職于騰訊、阿里巴巴,有豐富的項目性能優化和架構經驗。谷歌開發者社區深度參與者(多次進行技術分享),谷歌認證的國內Android方向的GDE(谷歌開發者專家,目前國內僅有12位Android方向的谷歌開發者專家)之一。
目 錄?Contents前 言引言 如何才能做好性能優化 1第1章 內存優化原理 81.1 虛擬內存 91.1.1 為什么需要虛擬內存 91.1.2 什么是虛擬內存 101.1.3 ELF文件 111.1.4 虛擬內存申請和釋放 141.1.5 虛擬內存到物理內存 161.2 內存數據的組成 171.2.1 maps文件 171.2.2 Java堆內存 181.2.3 Native內存 261.3 內存優化方法論 261.3.1 及時清理數據 261.3.2 減少數據的加載 271.3.3 增加內存大小 29第2章 內存優化實戰 302.1 Java內存泄漏檢測 312.1.1 手動分析 312.1.2 自動分析 362.2 Native內存泄漏檢測 402.2.1 攔截malloc和free函數 402.2.2 獲取Native堆棧 502.2.3 Native堆棧信息還原 512.2.4 開源工具介紹 552.3 Bitmap治理 552.3.1 字節碼操作 562.3.2 超大Bitmap優化 612.3.3 Bitmap泄漏優化 652.4 線程棧優化 662.4.1 線程創建流程 672.4.2 減少線程數量 692.4.3 減小線程默認的棧空間大小 702.5 默認webview內存釋放 722.5.1 通過maps文件尋找地址 732.5.2 通過系統變量尋找地址 75第3章 速度與流暢性優化原理 813.1 CPU 813.1.1 CPU的結構 823.1.2 CPU的工作流程 823.1.3 匯編指令 843.2 緩存 843.2.1 緩存的結構 843.2.2 寄存器 853.2.3 高速緩存 863.2.4 主存 863.3 任務調度 863.3.1 進程與線程的狀態 873.3.2 進程調度 883.3.3 協程和線程 893.4 速度與流暢性優化方法論 903.4.1 提升CPU執行效率 903.4.2 提升緩存效率 923.4.3 提升任務調度效率 92第4章 速度與流暢性優化實戰 934.1 充分利用CPU閑置時刻 944.1.1 proc文件方案 944.1.2 times函數方案 984.2 減少CPU的等待 1004.2.1 鎖等待優化 1004.2.2 I/O等待優化 1084.3 綁定CPU大核 1104.3.1 線程綁核函數 1114.3.2 獲取大核序列 1114.4 GC抑制 1134.4.1 GC的執行流程 1144.4.2 抑制GC執行的方案 1204.5 緩存策略優化 1264.5.1 常用的淘汰策略 1274.5.2 LFUCache 1284.6 Dex類文件重排序 1314.6.1 局部性原理 1314.6.2 Redex使用流程 1324.7 提升核心線程優先級 1334.7.1 調整線程優先級的方式 1344.7.2 需要調整優先級的線程 1354.8 線程池優化 1374.8.1 默認的線程池創建方式 1374.8.2 線程池配置解析 1394.8.3 線程池類型及創建 1414.8.4 線程池監控 147第5章 穩定性優化原理 1525.1 ANR 1535.1.1 ANR的類型 1535.1.2 常見的ANR歸因 1685.2 Crash 1695.2.1 Java Crash 1695.2.2 Native Crash 1725.3 穩定性優化方法論 174第6章 穩定性優化實戰 1766.1 Native Crash監控方案 1776.1.1 異常信號捕獲 1776.1.2 獲取Native堆棧 1786.1.3 使用開源庫 1826.2 ANR監控方案 1886.2.1 信號捕獲檢測方案 1886.2.2 AMS接口檢測方案 1916.2.3 抓取Trace文件 1926.2.4 使用開源框架 1936.3 OOM監控方案 1936.3.1 Hprof文件結構 1946.3.2 Hprof裁剪方案 1976.3.3 使用開源框架 1986.4 Native Crash分析思路 1986.4.1 初步分析 1996.4.2 堆棧分析 2006.4.3 指令分析 2006.5 ANR分析思路 2016.5.1 初步分析 2026.5.2 性能分析 2036.5.3 直接和間接分析 2056.6 慢函數監控 2066.6.1 慢函數檢測方法 2066.6.2 主線程方法插樁 207第7章 包體積優化原理 2087.1 APK組成分析 2087.1.1 dex文件 2097.1.2 資源和so庫文件 2107.2 APK包構建流程 2127.2.1 編譯和打包流程 2137.2.2 Gradle任務 2167.3 包體積優化方法論 218第8章 包體積優化實戰 2208.1 精簡資源 2228.1.1 刪除無用資源 2228.1.2 刪除重復圖片 2248.1.3 混淆文件名 2328.1.4 使用開源工具 2338.2 精簡dex文件 2338.2.1 刪減無用的代碼 2338.2.2 開啟編譯優化 2368.2.3 dex重排 2388.2.4 移除行號信息 2398.3 精簡so庫 2448.3.1 刪除無用代碼 2448.3.2 刪除冗余的so文件 2458.3.3 刪除符號信息 2458.4 壓縮dex文件 2468.5 壓縮so庫 2498.5.1 官方方案壓縮so 2498.5.2 自定義方案壓縮so 2498.6 動態加載資源文件 2528.6.1 資源加載原理 2538.6.2 動態加載資源 2608.7 動態加載類文件 2628.7.1 類加載原理 2628.7.2 動態加載類 2678.8 動態加載so庫文件 2678.8.1 so庫加載原理 2678.8.2 動態加載so庫 2708.9 動態加載四大組件 2718.9.1 Activity啟動流程 2718.9.2 啟動攔截 2858.9.3 方法重定向 2908.9.4 開源插件化框架 291第9章 其他優化 2929.1 耗電優化 2939.1.1 耗電統計原理 2939.1.2 耗電監控 3019.1.3 耗電治理 3059.2 流量優化 3069.2.1 流量消耗監控 3069.2.2 流量分類 3109.2.3 流量優化 3129.3 磁盤占用優化 3139.3.1 磁盤監控 3139.3.2 存儲目錄 3149.3.3 磁盤優化 3159.4 降級優化 3169.4.1 性能指標采集和異常判斷 3179.4.2 降級任務的添加和調度 3189.4.3 降級框架的效果度量 3199.4.4 方案實現 320