Android性能優(yōu)化

性能優(yōu)化的方法:
1.布局優(yōu)化
2.繪制優(yōu)化
3.內(nèi)存泄漏優(yōu)化
4.響應(yīng)速度優(yōu)化
5.ListView和bitmap優(yōu)化
6.線程優(yōu)化

一、布局優(yōu)化

盡量減少布局文件的層級(jí),層級(jí)越少,意味Android繪制的工作量越少,程序性能自然就提高

1.刪除布局中無(wú)用的層級(jí)和控件
2.有選擇的使用性能比較低的ViewGroup, 如RelativeLayout
3.優(yōu)先使用LinearLayout,相對(duì)于RelativeLayout,其功能比較簡(jiǎn)單,花費(fèi)較少CPU時(shí)間
4.需要復(fù)雜嵌套實(shí)現(xiàn)效果時(shí),建議采用RelativeLayout
5.采用<include標(biāo)簽用于布局重用
<merge>一般和<include>配合使用,可降低布局層級(jí),如去掉一層LinearLayout,標(biāo)簽降低減少布局層級(jí)

ViewStub按需加載:ViewStub繼承了View,非常的輕量級(jí),寬高都是0,因此本身不參與任何布局和繪制過(guò)程。在實(shí)際開發(fā)中,有很多布局在正常情況下不會(huì)顯示,如網(wǎng)絡(luò)異常。使用<ViewStub>可以做到在使用的時(shí)候再加載提供程序初始化的性能

//加載出來(lái)用view接收(ViewStub只能被inflate一次,之后ViewStub對(duì)象會(huì)被置空。)
View view = ((ViewStub)findViewById(R.id.view_stub)).inflate();  
TextView tv = (TextView) view.findViewById(R.id.text); 
//用view訪問(wèn)它的子控件
tv.setText("ViewStub");

二、繪制優(yōu)化

view 的onDraw()要避免大量執(zhí)行操作
1.onDraw()中不要?jiǎng)?chuàng)建新的局部對(duì)象(onDraw()會(huì)被頻繁調(diào)用,如果在這里面創(chuàng)建新的局部對(duì)象,會(huì)產(chǎn)生很多臨時(shí)對(duì)象,不僅占用過(guò)多內(nèi)存,還影響系統(tǒng)的GC,降低程序執(zhí)行效率)
2.onDraw()中不要進(jìn)行耗時(shí)任務(wù),不能執(zhí)行復(fù)雜的循環(huán),即使循環(huán)時(shí)輕量級(jí)的,大量的循環(huán)會(huì)搶占CPU的時(shí)間片,造成繪制過(guò)程的不流暢
3.Google標(biāo)準(zhǔn)的最佳繪制幀率是60fps,要求每幀繪制時(shí)間不超過(guò)16ms。盡量降低onDraw()的復(fù)雜度是很有效的

三、內(nèi)存泄漏優(yōu)化

內(nèi)存泄漏和內(nèi)存溢出

四、響應(yīng)速度優(yōu)化

避免在主線程做耗時(shí)操作,避免ANR(application not responding 程序無(wú)響應(yīng))

Android規(guī)定以下狀態(tài)下會(huì)觸發(fā)ANR
Activity如果5s之內(nèi)無(wú)法響應(yīng)屏幕觸摸事件或者鍵盤輸入時(shí)間
BroadcastReceiver前臺(tái)10s、后臺(tái)60s之內(nèi)還未執(zhí)行完操作
Service 前臺(tái)20S,后臺(tái)200s未處理完
contentPrivider publish 10s內(nèi)沒(méi)處理完

ANR機(jī)制主體實(shí)現(xiàn)在系統(tǒng)層,所有ANR相關(guān)消息都會(huì)經(jīng)過(guò)系統(tǒng)進(jìn)程調(diào)度,然后派發(fā)到應(yīng)用進(jìn)程完成對(duì)消息的實(shí)際處理。系統(tǒng)進(jìn)程還有不同的超時(shí)限制去跟蹤消息的處理。一旦應(yīng)用程序處理消息不當(dāng),超時(shí)限制就起了作用,它收集一些系統(tǒng)信息,如CPU/IO使用情況、進(jìn)程函數(shù)調(diào)用棧,報(bào)告給用戶有哪些進(jìn)程無(wú)響應(yīng)了(ANR對(duì)話框提示)

發(fā)生ANR時(shí)會(huì)調(diào)用AppNotRespondingDialog.show()方法提示用戶

ANR原因:
1.主線程代碼處理超時(shí)
2.主線程IO(輸入輸出流)
3.鎖競(jìng)爭(zhēng)
4.死鎖

避免ANR
1.UI線程盡量只做UI相關(guān)工作
2.耗時(shí)工作(數(shù)據(jù)庫(kù)操作、I/O、連接網(wǎng)絡(luò)等其他有可能阻礙UI線程的操作)放到單獨(dú)的線程中處理
3.盡量用Handler來(lái)處理UI thread之間的交互
4.實(shí)在避免不了在主線程,可嘗試Hander延遲加載
5.廣播中有耗時(shí)操作,建議放到IntentService中執(zhí)行,或者通過(guò)goAsync() + handlerThread分發(fā)執(zhí)行

分析ANR側(cè)重
1.CPU占用率
分析各個(gè)進(jìn)程的CPU時(shí)間占用率,來(lái)判斷是否為某個(gè)進(jìn)程長(zhǎng)時(shí)間占用CPU,導(dǎo)致該進(jìn)程無(wú)法獲取到足夠的CPU處理時(shí)間導(dǎo)致ANR。重點(diǎn)關(guān)注CPU的負(fù)載,各個(gè)進(jìn)程的CPU、用戶CPU、核心CPU、IOwait COU 的時(shí)間占用率
2.內(nèi)存
看當(dāng)前應(yīng)用的native和dalvik層內(nèi)存使用情況,結(jié)合系統(tǒng)給各個(gè)應(yīng)用分配的最大內(nèi)存來(lái)分析

ANR 日志
出現(xiàn)ANR在data/anr 目錄下生成traces.txt日志文件,每次發(fā)生都會(huì)刪除舊的日志文件,只保留最后一次ANR日志

五、ListView和bitmap

listView快速滑動(dòng)的時(shí)候不要加載圖片,bitmap太大就壓縮,用后釋放

六、線程優(yōu)化

多使用線程池

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容