Android應用性能優化
A. 【Android性能優化】:ProGuard,混淆,R8優化
使用Java編寫的源代碼編譯後生成了標準的class文件,面臨反編譯風險,需要進行代碼混淆以保護應用安全。ProGuard作為常用的混淆工具,具備壓縮、優化、混淆功能。其工作流程包括shrink(縮減)、optimize(優化)、obfuscate(混淆)和preverigy(預驗證)四個步驟。通過ProGuard,可以實現代碼縮減,移除未使用的類、欄位、方法和屬性,優化代碼結構。
在Android構建中,R8編譯器取代了ProGuard進行代碼優化與混淆。R8通過檢測代碼中未使用的部分,並移除它們來實現代碼縮減。例如,若項目依賴多個庫,但僅使用其中一部分,R8會檢測應用代碼入口(如啟動的第一個Activity),構建訪問圖,並移除未訪問的代碼。
在R8配置中,通過proguard-rules.pro文件決定保留哪部分代碼。R8支持來自不同來源的配置文件,如自定義配置、AGP生成的規則、AAR或JAR庫中包含的規則,以及AAPT2生成的保留規則。通過minifyEnabled屬性設置為true,可啟用R8的代碼縮減功能。需要注意的是,R8對反射調用和JNI調用的檢測不足,可能需要在配置中進行額外處理以避免移除必要的代碼。
R8在代碼縮減後進行資源縮減,以去除不使用的資源文件。開啟代碼縮減並使用shrinkResources屬性即可進行資源縮減。同時,可以使用tools:keep或tools:discard對特定資源文件進行保留或刪除。
代碼混淆通過替換類名、方法名和屬性名,使反編譯變得困難。混淆規則和模板的添加有助於保護應用安全。
R8進一步優化代碼,通過深度分析移除更多未使用的代碼,或重寫代碼以簡化結構。優化點可參考Jake Wharton的R8優化博文。
總結,R8編譯器通過代碼縮減、資源縮減、代碼混淆和代碼優化等操作,全面提升了APK文件的性能。為了深入了解性能優化,可獲取相關核心筆記,內容涵蓋啟動優化、內存優化、UI優化、網路優化、Bitmap優化與圖片壓縮、多線程並發優化、數據傳輸效率優化、體積包優化,以及性能監控框架和框架學習手冊。這些資源將幫助開發者全面掌握性能優化技術。
B. Android 性能優化方案之:電量優化、UI優化、內存優化……
本文將深入探討Android性能優化的關鍵領域:電量優化、UI優化和內存優化。通過有效的策略和技術,我們可以顯著提高應用的性能和用戶體驗。
在UI優化方面,我們主要關注過度繪制(Overdraw)的問題。過度繪制指的是在單個幀內對同一個像素進行多次繪制,這不僅消耗CPU資源,還會導致性能下降和卡頓現象。要減少過度繪制,我們應避免在重疊的不可見元素上重復繪制。具體措施包括:合理選擇布局容器,如LinearLayout與RelativeLayout;去掉window的默認背景;去掉不必要的背景;使用自定義View的clipRect方法來控制顯示區域;使用ViewStub作為高效佔位符;製作draw9patch以優化背景透明區域;以及利用Merge標簽減少不必要的嵌套。
內存性能優化涉及內存分配與回收、內存測試插件(如LeakCanary)的使用,以及針對不同設備內存閾值的緩存設計。開發者應謹慎使用large heap,避免不必要的內存佔用。通過綜合考慮設備內存閾值與其他因素,設計合適的緩存大小。在資源文件存放方面,應選擇合適的文件夾以避免因縮放導致的內存消耗。使用try-catch機制處理可能的內存分配錯誤,如嘗試在捕獲到OOM異常時降級內存分配。避免使用靜態對象,特別注意單例對象中的不當持有。謹慎管理Service資源,使用IntentService以避免內存泄漏。應用ProGuard進行代碼優化和混淆,減少內存消耗。選擇更輕量級的數據結構,如ArrayMap/SparseArray,避免使用Enum。優化Bitmap對象的內存佔用,使用更小的圖片,並避免在內存敏感方法中創建新對象。重復利用對象和系統資源,及時關閉Cursor,避免在onDraw等方法中創建新對象。利用StringBuilder減少字元串拼接操作,避免Activity泄漏,尤其是通過Handler管理的泄漏。最後,考慮使用Application Context以避免無意的Activity泄露。
電量優化同樣重要,盡管通常被開發者視為最後考慮的因素。然而,確保應用不會成為電量消耗的罪魁禍首至關重要。優化策略可能包括減少網路使用、關閉不必要的服務、優化啟動性能和降低後台運行需求。雖然本文未能詳述所有優化領域,但我們提供了一個性能優化知識的概述,以幫助開發者深入挖掘並提升應用性能。對於更深入的優化內容,我們已整理成PDF文檔,歡迎感興趣的朋友通過下方鏈接或私信獲取。
C. Android性能優化原理:APP運行時的內存模型
為了深入了解Android App運行時的內存模型並掌握內存優化的原理,我們分三個部分進行探討:內存描述指標、內存數據獲取方法,以及內存模型的全面解析。
### 內存描述指標
在進行內存優化前,我們需要熟悉內存描述指標,這些指標能夠幫助我們量化App的內存使用情況,並在優化過程中直觀地展示效果。常用的內存描述指標包括但不限於共享庫按比例分擔的Pss、進程在RAM中的實際保存總內存RSS、獨占物理內存的Private Clean和Private Dirty、Swap Pss Dirty以及Heap Alloc和空閑的虛擬內存Heap Free。獲取這些指標通常有兩種方法:線下通過adb命令獲取,線上則通過代碼實現。
### 內存數據獲取
了解了描述指標後,接下來是獲取內存數據的方法。主要分為兩種:一是通過adb命令進行線下調試,二是在線上通過代碼收集數據。盡管獲取方式不同,原理相同,它們都依賴於調用android_os_Debug對象中的android_os_Debug_getDirtyPagesPid介面。此外,獲取內存數據的原理和實現邏輯較為復雜,涉及到介面調用、文件解析等技術細節。
### 內存模型詳解
深入探討App運行時的內存模型,以系統設置為例,通過adb命令獲取的內存數據分為A區域和B區域。A區域的數據主要通過android_os_Debug_getMemInfo介面獲得,而B區域則是對A區域數據的匯總處理。A區域的數據又可以進一步細分為由maps文件數據、與graphic相關的數據以及Alloc內存組成。
- **maps文件數據**:maps文件是分析內存的關鍵文件,其中詳細記錄了進程內存中的數據類型和格式,通過解析maps文件,我們能了解Dalvik Heap、Native Heap等數據的構成,這對於在線上異常監控時定位和排查內存問題非常有幫助。
- **graphic相關數據**:這部分數據由兩部分組成,一部分通過load_maps函數解析獲取,另一部分通過read_memtrack_memory函數讀取。這些數據是GPU驅動寫入的,通過解析這些數據,可以深入了解App的圖形內存使用情況。
- **Alloc內存**:這部分數據是通過malloc、mmap、calloc等內存申請函數累積而來,獲取這些數據的效率最高,性能消耗最小,適合在代碼中進行監控。
B區域的數據是對A區域數據的匯總,主要用於方便查看,內容相對簡單。
### 小結
掌握App運行時的內存模型,對於進行有效的內存優化至關重要。了解內存描述指標、內存數據獲取方法,以及深入解析內存模型,是實現內存優化的基礎。在此基礎上,結合《Android性能優化核心筆記》中的詳細知識和實踐指南,可以更系統地學習和應用Android性能優化的策略和技巧。通過這些資源和方法,不僅能夠優化內存使用,還能提升整體應用性能,實現更流暢、高效的應用體驗。