標簽: 很多App都會遇到以下幾個常見的性能問題: 啟動速度慢;界面跳轉慢;事件響應慢;滑動和動畫卡頓。 一、啟動速度優(yōu)化。 優(yōu)化初始化任務: 1. 把一些初始化任務懶加載初始化 2. 把初始化任務并行化(異步化) 3. 使初始化任務可以插拔(一個任務出問題不會影響到其他的任務) 其他: 1. 控制線程數量,注意線程的使用,用自己的線程池替換三方或者二方SDK的線程池,線程太多占用cpu資源, 2. 使用緩存來減少I/O操作(讀數據庫,讀文件,SharedPreference)減少網絡請求(判斷無網絡直接返回) 3. 對于SharedPreference進行了專門的優(yōu)化,減少單個文件的大小,將毫無聯(lián)系的存儲鍵值分開到不同文件中, 并且防止將大數據塊存儲到SharedPreference中,這樣既不利于性能也不利于內存, 因為SharedPreference會有額外的一份緩存長期存在。 4. Activity使用熱啟動,在按Back鍵,不銷毀activity,釋放一些圖片等占用內存大的資源 二、界面優(yōu)化 布局復雜、過渡繪制多、Activity主要函數耗時、內容展示慢、界面重新布局(Layout)、GC次數 這些問題會導致界面卡頓。 1. 過度繪制 Activity使用默認主題背景,在layout中view盡量減少背景的設置(有前景內容,就不要設置和展示背景), 減少多層布局結構背景設置,減少Drawable的復雜Shape使用。 2. 優(yōu)化布局層級 層級越多,測量和布局的時間就會相應增加,創(chuàng)建硬件列表的時間也會相應增加。 有時我們會嵌套很多布局來實現原本只要簡單布局就可以實現的功能,有時還會添加一些測試階段才會使用的布局。 通過刪除無用的層級,使用Merge標簽或者ViewStub標簽來優(yōu)化整個布局性能。比如一些顯示錯誤界面、加載提示框界面等, 不是必須顯示的這些布局可以使用ViewStub標簽來提升性能。 另外要靈活使用布局,并不是層級越多就會性能越差, 有時候1層的RelativeLayout會比3層嵌套的LinearLayout實現的性能更糟糕。 除了靈活使用布局,另外我們還通過提前inflate以及在線程中做一些必要的inflate等來提前初始化布局, 減少實際顯示時候的耗時。對于一些復雜的布局,做復用池,減少inflate帶來的性能損耗,特別是在列表中。 3. 加快界面展示 1. 減少主線程的GC停頓,因為即使并行GC,也會對heap加鎖,如果主線程請求分配內存的話,也會被掛起, 避免在onDraw中頻繁分配較多和較大的對象,去掉ListView ,ScrollView等控件的EdgeEffect效果,來減少內存分配和加快控件的創(chuàng)建時間 2. 可以通過TraceView工具找出主線程的耗時操作以及操作次數和其他耗時的線程并作優(yōu)化; 3. 對于網絡請求,做好本地緩存,在網速慢或者無網絡的時候展示,減少不必要的數據協(xié)議字段,減少名字長度等,并作壓縮。 還可以通過分頁加載數據來加快傳輸解析時間。因為JSON越大,傳輸和解析時間也會越久,引發(fā)的內存對象分配也會越多; 4. 注意線程的優(yōu)先級,對于占用CPU較多時間的函數,也要判斷線程的優(yōu)先級。 5. 重寫方法requestLayout、onSizeChanged,如果大小沒有變化就阻斷過多Layout請求。 4. 減少GC 1.減少對象分配,找出不必要的對象分配,如可以使用非包裝類型的時候,使用了包裝類型;字符串的+號和擴容;減少Handler.post(Runnable r)等頻繁使用。 2. 對象的復用,對于頻繁分配的對象需要使用復用池。 3. 盡早釋放無用對象的引用,特別是大對象和集合對象,通過置為NULL,及時回收。 4. 防止泄露,除了最基本的文件、流、數據庫、網絡訪問等都要記得關閉以及unRegister自己注冊的一些事件外,還要盡量少的使用靜態(tài)變量和單例。 5. 控制finalize方法的使用,在高頻率函數中使用重寫了finalize的類,會加重GC負擔,使得性能上有幾倍的差別。 6. 合理選擇容器,在性能上優(yōu)先考慮數組,即使我們現在習慣了使用容器,也要注意頻繁使用容器在性能上的隱患點:首先是擴容開銷, HashMap擴容時重新Hash的開銷較大。其次是內存開銷,HashMap需要額外的Map.Entry對象分配 ,需要額外內存,也容易產生更多的內存碎片。SparseArray和ArrayList等在內存方面更有優(yōu)勢。再次是遍歷,對于實現了RandomAccess接口的容器如ArryList的遍歷,不應該使用foreach循環(huán)。 5. 用性能分析工具采集數據,分析數據,找出性能優(yōu)化點 通過Memory Monitor查看內存波動和GC情況,還可通過AlloCation Tracker工具觀察內存的分配,發(fā)現很多小對象的分配問題。 利用Trace For OpenGL工具找出界面上導致硬件加速耗時的點,例如一些圓角圖片的處理等。 使用TraceView分析方法耗時,開啟GPU過度繪制監(jiān)視以及GPU呈現模式使用Systrace分析界面渲染問題。 6. 編碼時優(yōu)化點 靈活使用final關鍵字,避免在循環(huán)中使用try catch,盡量少用Enum類型,可以使用臨時變量代替this.member等 7. 測試啟動時間方式 log方式在oncreate和onwindowFocus打點,記錄Activity啟動到界面展示的時間 可以使用hock方式記錄啟動時間,使用測試網站來測試, android 5.0以上 使用adb shell am start -W 來測試時間。
標簽: |
|