Android性能優(yōu)化方案詳情
前言:
上一個(gè)季度在百度工作挺忙碌,在最后期限完成了OKR
目標(biāo),因此有一段時(shí)間沒有寫文章。今天趁有機(jī)會(huì)想分享下在大型Android
項(xiàng)目工程內(nèi)的一些性能優(yōu)化方式。
1、指標(biāo)
量化性能的指標(biāo)有很多,但最重要的就是以下5種:
- 包大小
- 響應(yīng)時(shí)間
- 內(nèi)存
- CPU
- 耗電量
優(yōu)化性能就是可以從以上5點(diǎn)入手。
2、包大小優(yōu)化
顧名思義就是減少apk
包體積大小,apk
大小主要取決于res下的資源文件、.class
文件,
具體優(yōu)化措施有:
壓縮圖片大小,再在項(xiàng)目中使用。
在AndroidStudio
內(nèi),可以將png等格式的圖片壓縮為.webp
格式,這可以進(jìn)一步減少圖片大小。
盡可能地減少本地資源的使用,可從技術(shù)方案上考慮從服務(wù)端拉取圖片、lottie
、so庫(kù)等資源。
利用lottie
替換幀動(dòng)畫的使用,減少幀動(dòng)畫圖片資源的使用。
利用混淆刪除無用代碼,減少dex文件大小。
3、響應(yīng)時(shí)間優(yōu)化
對(duì)用戶來說,響應(yīng)時(shí)間自然越短越好。響應(yīng)時(shí)間越短,操作也就越順暢。
響應(yīng)速度包括啟動(dòng)速度——點(diǎn)擊APP按鈕到APP首頁完全打開的過程盡可能快、頁面響應(yīng)速度——用戶執(zhí)行點(diǎn)擊、滑動(dòng)等操作后,頁面能快速響應(yīng)。APP不能產(chǎn)生卡頓、更不能出現(xiàn)ANR。
具體優(yōu)化措施有:
- 耗時(shí)操作應(yīng)放入子線程進(jìn)行處理,不能阻塞主線程。
- SDK等資源應(yīng)采用懶加載方式,需要時(shí)才進(jìn)行加載,不需要時(shí)可不必加載。
- 線上環(huán)境避免打印大量的日志。
- 使用
BitmapFactory.Option
的inBitmap
變量,來復(fù)用舊的Bitmap
,避免為新Bitmap
多次分配內(nèi)存以及銷毀舊Bitmap
(如果該Bitmap使用頻率高的話)
優(yōu)化view視圖渲染時(shí)間:
①若view
視圖比較復(fù)雜,可考慮使用ConstraintLayout
約束布局,減少視圖渲染的層級(jí)。
②若view視圖比較簡(jiǎn)單,優(yōu)化考慮使用LinearLayout
水平布局(因?yàn)長(zhǎng)inearLayout的渲染時(shí)間比ConstraintLayout、RelativeLayout都要短)。
③避免過度渲染,如果有多個(gè)view
的背景重疊在一起,可以考慮去掉底層被覆蓋的view;主題theme可以設(shè)置為NoBackground模式。
④若view
視圖在需要時(shí)才被創(chuàng)建,使用ViewStub
控件。
recyclerview列表控件優(yōu)化:
①item
的view
視圖優(yōu)化,同第4點(diǎn)。
②增加recyclerview
的item
緩存數(shù)量,將網(wǎng)絡(luò)請(qǐng)求的數(shù)據(jù)緩存,避免二次請(qǐng)求網(wǎng)絡(luò)。
③在onBindViewHolder
避免執(zhí)行耗時(shí)操作,因?yàn)?code>onBindViewHolder是在主線程執(zhí)行,onBindViewHolder
加耗時(shí)操作會(huì)影響滑動(dòng)流暢度。
④如果不需要recyclerview
的默認(rèn)動(dòng)畫,刪除。(如刷新時(shí)閃爍的動(dòng)畫效果)
⑤recyclerview
刷新時(shí)盡量使用局部刷新,避免全局刷新。
查看view
是否過度渲染可在手機(jī)開發(fā)者模式開啟以下設(shè)置:
4、內(nèi)存優(yōu)化
減少內(nèi)存的使用,主要是避免創(chuàng)建過多對(duì)象占用過多內(nèi)存、避免內(nèi)存抖動(dòng)以及避免內(nèi)存泄漏。
內(nèi)存抖動(dòng)即頻繁地創(chuàng)建和銷毀內(nèi)存,在這個(gè)過程中,垃圾回收器也會(huì)頻繁工作,對(duì)內(nèi)存性能造成影響。
內(nèi)存泄漏即應(yīng)該被GC回收的內(nèi)存,由于還在被其他對(duì)象引用,導(dǎo)致無法被回收。內(nèi)存泄漏是比較嚴(yán)重的問題,過多的內(nèi)存泄漏會(huì)導(dǎo)致內(nèi)存溢出,產(chǎn)生OOM的系統(tǒng)錯(cuò)誤。
造成內(nèi)存泄漏的原因主要有:
- 單例類引用
Context
造成內(nèi)存泄漏。 - 非靜態(tài)內(nèi)部類引用外部類造成內(nèi)存泄漏。
handler
引用activity
造成內(nèi)存泄漏。- 屬性動(dòng)畫沒有取消,導(dǎo)致
view
一直被引用造成內(nèi)存泄漏。 - 監(jiān)聽器沒有取消、回調(diào)沒有反注冊(cè)。
內(nèi)存優(yōu)化的措施有:
- 使用線程池復(fù)用線程,因?yàn)榫€程本身會(huì)占用相對(duì)比較大的內(nèi)存,復(fù)用就可以省下部分內(nèi)存。
- 在
onDraw
方法內(nèi)避免創(chuàng)建對(duì)象。因?yàn)?code>onDraw會(huì)被頻繁調(diào)用,導(dǎo)致其內(nèi)部的對(duì)象也會(huì)被頻繁創(chuàng)建,占用過多內(nèi)存。 - 盡量使用
StringBuilder
或StringBuffer
拼接字符串,減少String
的使用。(因?yàn)槠唇幼址畷r(shí),String
會(huì)創(chuàng)建新的對(duì)象,而StringBuilder
、StringBuffer
是在原字符串基礎(chǔ)上拼接) - 視圖資源不可見時(shí)進(jìn)行清除,避免占用內(nèi)存。如Bitmap執(zhí)行
.recycle
方法進(jìn)行清除、對(duì)圖片和lottie資源進(jìn)行銷毀。
針對(duì)內(nèi)存泄漏的問題進(jìn)行優(yōu)化:
①單例類應(yīng)引用Application
的Context
,因?yàn)?code>Application的Context的生命周期是和APP一致的,不會(huì)造成單例類引用某個(gè)activity
的context以致該activity無法被回收的問題。
②將非靜態(tài)內(nèi)部類改為靜態(tài)內(nèi)部類,這樣就不會(huì)引用外部類。
③handler:a.handler
使用結(jié)束時(shí)調(diào)用removeCallbacksAndMessages
(null)清除隊(duì)列;b.靜態(tài)內(nèi)部類+弱引用方式可避免內(nèi)存泄漏。
static class SafeHandler extends Handler { WeakReference<MainActivity> activity; public SafeHandler(MainActivity mainActivity) { activity = new WeakReference<MainActivity>(mainActivity); } @Override public void handleMessage(Message msg) { } }
④屬性動(dòng)畫、監(jiān)聽器使用結(jié)束應(yīng)及時(shí)取消,廣播或其他一些外部庫(kù)的回調(diào)應(yīng)該及時(shí)反注冊(cè)。
5、CPU優(yōu)化
CPU的作用是計(jì)算處理信息、運(yùn)行程序,因此優(yōu)化的方向就是減少CPU計(jì)算的工作,提升CPU的計(jì)算效率。
具體的優(yōu)化措施有:
- 避免主線程執(zhí)行耗時(shí)任務(wù),耗時(shí)任務(wù)在子線程異步執(zhí)行。
- 避免在
onDraw
方法里執(zhí)行大量耗時(shí)操作。 - 暫時(shí)不需要用到的信息進(jìn)行懶加載、延遲初始化。
6、耗電量?jī)?yōu)化
優(yōu)化的措施有:
- 避免頻繁進(jìn)行網(wǎng)絡(luò)請(qǐng)求。
- 避免任務(wù)被頻繁執(zhí)行,可以等任務(wù)形成一定數(shù)量時(shí),再一起執(zhí)行。
- 避免應(yīng)用頻繁喚醒屏幕。(頻繁喚醒屏幕會(huì)導(dǎo)致系統(tǒng)無法進(jìn)入休眠,耗電量大)
保證性能指標(biāo)不下降一直是開發(fā)過程中的重中之重,如果由于開發(fā)新功能導(dǎo)致出現(xiàn)卡頓、機(jī)身發(fā)熱耗電量猛增、內(nèi)存增大等性能問題,那樣反而會(huì)流失用戶,得不償失。因此關(guān)注性能也是RD們的一項(xiàng)隱形工作。希望這篇文章能對(duì)大家有所幫助。
到此這篇關(guān)于Android性能優(yōu)化方案詳情的文章就介紹到這了,更多相關(guān)Android性能優(yōu)化方案內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Android使用DrawerLayout實(shí)現(xiàn)仿QQ雙向側(cè)滑菜單
這篇文章主要介紹了Android使用DrawerLayout實(shí)現(xiàn)仿QQ雙向側(cè)滑菜單的方法和詳細(xì)代碼,有需要的小伙伴可以認(rèn)真參考下。2016-01-01Android線性布局與相對(duì)布局的實(shí)現(xiàn)
大家好,本篇文章主要講的是Android線性布局與相對(duì)布局的實(shí)現(xiàn),感興趣的同學(xué)趕快來看一看吧,對(duì)你有幫助的話記得收藏一下2022-02-02Android自定義view實(shí)現(xiàn)側(cè)滑欄詳解
之前一直沒有寫側(cè)滑菜單的實(shí)現(xiàn)方法,今天計(jì)劃補(bǔ)上。手機(jī)開發(fā)中,往往存在很多功能沒處放的問題。我們可能會(huì)把功能放入一個(gè)菜單列表,但現(xiàn)在一種流行的做法是側(cè)滑菜單2022-11-11Android開發(fā)獲取傳感器數(shù)據(jù)的方法示例【加速度傳感器,磁場(chǎng)傳感器,光線傳感器,方向傳感器】
這篇文章主要介紹了Android開發(fā)獲取傳感器數(shù)據(jù)的方法,結(jié)合實(shí)例形式分析了Android獲取加速度傳感器、磁場(chǎng)傳感器、光線傳感器及方向傳感器數(shù)據(jù)的相關(guān)操作技巧,需要的朋友可以參考下2017-11-11Android自定義View實(shí)現(xiàn)氣泡動(dòng)畫
這篇文章主要為大家詳細(xì)介紹了Android自定義View實(shí)現(xiàn)氣泡動(dòng)畫,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-04-04android中一些特殊字符(如:←↑→↓等箭頭符號(hào))的Unicode碼值
這篇文章主要介紹了android中一些特殊字符(如:←↑→↓等箭頭符號(hào))的Unicode碼值,需要的朋友可以參考下2017-03-03Android利用Intent.ACTION_SEND進(jìn)行分享
這篇文章主要介紹了Android利用Intent.ACTION_SEND進(jìn)行分享,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-05-05