Android性能優化問題總結
性能優化這塊,分為UI性能優化、內存優化、數據庫優化、網絡優化、耗電優化等等。可以從1.如何發現問題,2.怎么解決問題,3.解決效果對比,這幾個方面去描述。舉個簡單例子——UI優化,可以從 UI出現什么問題(卡頓不流暢),怎么查找問題(手機開發者權限>GPU過度繪制 發現層級問題,TraceView CPU使用情況分析),怎么解決問題(降低層級、自定義View繪圖出現問題等),解決問題后性能再次對比。
一、UI優化
a.合理選擇RelativeLayout、LinearLayout、FrameLayout,RelativeLayout會讓子View調用2次onMeasure,而且布局相對復雜時,onMeasure相對比較復雜,效率比較低,LinearLayout在weight>0時也會讓子View調用2次onMeasure。LinearLayout weight測量分配原則。
b.使用標簽
c.減少布局層級,可以通過手機開發者選項>GPU過渡繪制查看,一般層級控制在4層以內,超過5層時需要考慮是否重新排版布局。
d.自定義View時,重寫onDraw()方法,不要在該方法中新建對象,否則容易觸發GC,導致性能下降
e.使用ListView時需要復用contentView,并使用Holder減少findViewById加載View。
f.去除不必要背景,getWindow().setBackgroundDrawable(null)
g.使用TextView的leftDrawabel/rightDrawable代替ImageView+TextView布局
二、內存優化
主要為了避免OOM和頻繁觸發到GC導致性能下降
a.Bitmap.recycle(),Cursor.close,inputStream.close()
b.大量加載Bitmap時,根據View大小加載Bitmap,合理選擇inSampleSize,RGB_565編碼方式;使用LruCache緩存
c.使用 靜態內部類+WeakReference 代替內部類,如Handler、線程、AsyncTask
d.使用線程池管理線程,避免線程的新建
e.使用單例持有Context,需要記得釋放,或者使用全局上下文
f.靜態集合對象注意釋放
g.屬性動畫造成內存泄露
h.使用webView,在Activity.onDestory需要移除和銷毀,webView.removeAllViews()和webView.destory()
備:使用LeakCanary檢測內存泄露
三、響應速度優化
Activity如果5秒之內無法響應屏幕觸碰事件和鍵盤輸入事件,就會出現ANR,而BroadcastReceiver如果10秒之內還未執行操作也會出現ANR,Serve20秒會出現ANR 為了避免ANR,可以開啟子線程執行耗時操作,但是子線程不能更新UI,因此需要Handler消息機制、AsyncTask、IntentService進行線程通信。
備:出現ANR時,adb pull data/anr/tarces.txt 結合log分析
四、其他性能優化
a.常量使用static final修飾
b.使用SparseArray代替HashMap
c.使用線程池管理線程
d.ArrayList遍歷使用常規for循環,LinkedList使用foreach
e.不要過度使用枚舉,枚舉占用內存空間比整型大
f.字符串的拼接優先考慮StringBuilder和StringBuffer
g.數據庫存儲是采用批量插入+事務
https://www.jianshu.com/p/6d855e984b99
https://blog.csdn.net/hanchendong/article/details/61920501
https://blog.csdn.net/jiankeufo/article/details/79277063
http://www.rzrgm.cn/fangfuhai/p/7197750.html
1、Android性能優化第(一)篇---基本概念http://www.jianshu.com/p/c0e5c13d5ecb
第一篇簡單回顧java的內存區域劃分、引用、內存泄露以及場景,還有垃圾回收
2、Android性能優化第(二)篇---Memory Monitor檢測內存泄露http://www.jianshu.com/p/ef9081050f5c
第二篇主要是使用過Android Studio自帶工具Memory Monitor 檢測內存泄露
3、Android性能優化第(三)篇---MAT比Menmery Monitor更強大http://www.jianshu.com/p/2d47d1cf5ccf
接上一篇,介紹另外一種內存泄露的檢測工具MAT
4、Android性能優化第(四)篇---Android渲染機制http://www.jianshu.com/p/9ac245657127
學習一下Android渲染機制,為什么16ms沒完成繪制就會卡頓?
5、Android性能優化第(五)篇---Allaction Tracing追蹤內存分配的軌跡http://www.jianshu.com/p/d9e426c10581
Allaction Tracing是追蹤內存分配的工具,可以很直觀的看到某個操作是如何一步步分配的
6、Android性能優化第(六)篇---TraceView 分析圖怎么看http://www.jianshu.com/p/388c693c1b58
TraceView 是 Android 平臺特有的數據采集和分析工具,主要用做熱點分析,找出最需要優化的點。我就是靠它將我公司的項目的啟動速度明顯的提高了。
7、Android性能優化第(七)篇---StrickMode嚴苛模式檢測耗時與內存問題http://www.jianshu.com/p/2ebc9363ea16
StrictMode意思為嚴格模式,是用來檢測程序中違例情況的開發者工具。使用一般是場景是檢測主線程中本地磁盤和網絡讀寫等耗時的操作。注意這個StrictMode是在Anroid2.3以后引入的。嚴格模式主要檢測兩大問題,一個是線程策略,即TreadPolicy,另一個是VM策略,即VmPolicy。
8、Android性能優化第(八)篇---App啟動速度優化之耗時檢測處理http://www.jianshu.com/p/a0e242d57360
介紹如何統計應用的啟動時間和性能檢查項,并且用TraceView逐個修復
9、Android性能優化第(九)篇---App啟動速度優化之啟動頁設計http://www.jianshu.com/p/777fe2f71039
因為啟動頁一般View的數量比較少,業務邏輯比較簡單,啟動不太費勁,但是該怎么寫啟動頁面讓應用的啟動速度更快呢?
10、Android性能優化第(十)篇---布局優化http://www.jianshu.com/p/c0e0cca14162
Android系統每隔16ms就重新繪制一次Activity,如果沒有完成就會有丟幀的現象。為了減輕UI繪制的負擔,有必要把Layout編寫的一些注意事項總結一下
11、Android性能優化第(十 一)篇---卡頓分析,正確評測流暢度http://www.jianshu.com/p/d126640eccb1
說到應用的流暢度,都會想到FPS,FPS評測應用流暢度不準確,系統獲取FPS的原理是:手機屏幕顯示的內容是通過Android系統的SurfaceFLinger類,把當前系統里所有進程需要顯示的信息合成一幀,然后提交到屏幕上進行顯示,FPS就是1秒內SurfaceFLinger提交到屏幕的幀數。但是用FPS來評測一個應用是否真的卡頓存在兩個問題,我們可以使用Choreographer幀率檢測。
浙公網安備 33010602011771號