Android性能優(yōu)化之工具和優(yōu)化點(diǎn)總結(jié)

Android性能優(yōu)化學(xué)習(xí)

本文為作者原創(chuàng),轉(zhuǎn)載請(qǐng)注明作者和出處

最近公司主抓性能優(yōu)化工作,借此春風(fēng)也學(xué)習(xí)到了許多Android性能優(yōu)化方面的知識(shí)。由于組內(nèi)隊(duì)友的給力荞彼,優(yōu)化的成果也是比較喜人。同時(shí)也學(xué)習(xí)和實(shí)踐了不少知識(shí)待笑,特此記錄鸣皂。

1.性能優(yōu)化分析工具學(xué)習(xí)

工欲善其事,必先利其器暮蹂。在開始代碼優(yōu)化之前寞缝,先得學(xué)會(huì)使用性能分析工具。以下三個(gè)工具都是谷歌官方推出的仰泻,可以幫助我們定位分析問(wèn)題第租,從而優(yōu)化我們的APP。

  • System Trace

Systrace是一個(gè)收集和檢測(cè)時(shí)間信息的工具, 它能顯示CPU和時(shí)間被消耗在哪兒了, 每個(gè)進(jìn)程和線程都在其CPU時(shí)間片內(nèi)做了什么事兒. 而且會(huì)指示哪個(gè)地方出了問(wèn)題, 以及給出Fix建議我纪。給出的結(jié)果trace文件是以html形式打開的慎宾,直接用瀏覽器打開查看十分方便丐吓。打開方法:打開DDMS后,連接手機(jī)趟据,點(diǎn)擊手機(jī)上方一排按鈕中的SysTrace按鈕券犁。
打開的效果如下圖:

System Trace

在代碼中打點(diǎn)方式如下

Trace.beginSection("name");
//要檢測(cè)運(yùn)行時(shí)間的代碼
Trace.endSection();
  • Hierarchy Viewer

Hierarchy Viewer提供了一個(gè)可視化的界面來(lái)觀測(cè)布局的層級(jí), 讓我們可以優(yōu)化布局層級(jí), 刪除多余的不必要的View層級(jí), 提升布局速度。另外汹碱,開發(fā)者模式中調(diào)試GPU過(guò)度繪制選項(xiàng)也可以進(jìn)行視圖層級(jí)調(diào)試粘衬。在SDK-> tools目錄下打開hierarchyviewer.bat即可。
效果如下圖:

Hierarchy Viewer
  • TraceView

一個(gè)圖形化的工具, 用來(lái)展示和分析方法的執(zhí)行時(shí)間咳促。也是一款性能優(yōu)化的神器稚新。可以通過(guò)像打log一樣的方式去定位代碼的執(zhí)行時(shí)間跪腹,從而可以準(zhǔn)確定位是哪一段代碼的執(zhí)行消耗了太多時(shí)間褂删。相比SysTrace,功能更強(qiáng)大冲茸,使用起來(lái)也更復(fù)雜屯阀。

TraceView

2.布局優(yōu)化

布局優(yōu)化相對(duì)比較容易,優(yōu)化可以先從布局來(lái)展開轴术。使用Hierarchy Viewer和開發(fā)者模式中關(guān)于布局繪制的選項(xiàng)难衰,可以查到一些問(wèn)題然后進(jìn)行修改。

  • 布局嵌套過(guò)深 有的時(shí)候?yàn)榱粟s進(jìn)度逗栽,布局設(shè)計(jì)的不是很好盖袭。層級(jí)嵌套過(guò)深的話,深度遍歷各個(gè)節(jié)點(diǎn)會(huì)非常消耗時(shí)間彼宠,這也是布局優(yōu)化余地最大的一個(gè)點(diǎn)了鳄虱。很多過(guò)深的層級(jí)是不必要的。如果布局真的很復(fù)雜兵志,不深度嵌套沒法實(shí)現(xiàn)想要的效果醇蝴。試試最新的約束布局Constraintlayout吧宣肚。沒有使用過(guò)的話想罕,下面這篇官方文檔可以幫助你:
    Constraintlayout官方介紹文檔

  • 使用合適的布局 三種常見的ViewGroup的繪制速度:FrameLayout > LinerLayout > RelativeLayout。當(dāng)然霉涨,如果用RelativeLayout可以避免布局嵌套的話是值得的按价。可以根據(jù)這些去決定選用什么樣的布局笙瑟。

  • 列表控件優(yōu)化 不論是ListView還是RecycleView都有優(yōu)化點(diǎn)楼镐,一個(gè)是convertView的復(fù)用,一個(gè)是ViewHolder的使用避免重復(fù)遍歷節(jié)點(diǎn)往枷。當(dāng)然這些都是基礎(chǔ)中的基礎(chǔ)了框产。如果發(fā)現(xiàn)項(xiàng)目中的代碼ListView或者RecycleView的使用不規(guī)范的話凄杯,趕緊進(jìn)行修改吧。

  • 使用include標(biāo)簽 在布局文件中秉宿,<include>標(biāo)簽可以指定插入一段布局文件到當(dāng)前布局戒突。這樣的話既提高了布局復(fù)用,也減少了我們的代碼書寫描睦。另外膊存,<merge>標(biāo)簽可以和<include>的標(biāo)簽一起使用從而減少布局層級(jí)。

  • ViewStub延時(shí)加載 有些布局忱叭,比如網(wǎng)絡(luò)出錯(cuò)的布局隔崎,沒必要在所有時(shí)候都加載出來(lái)。使用ViewStub可以實(shí)現(xiàn)按需加載韵丑。ViewStub本身沒有寬高爵卒,加載起來(lái)幾乎不消耗什么資源。當(dāng)對(duì)他setVisibility(View.VISIBLE)的時(shí)候會(huì)調(diào)用它引用的真實(shí)布局填充到當(dāng)前位置埂息,從而實(shí)現(xiàn)了延時(shí)加載技潘,節(jié)省了正常加載的時(shí)間。

  • 移除Activity默認(rèn)背景 只要我們不需要Activity的默認(rèn)背景千康,就可以移除掉享幽,以減少Activity啟動(dòng)時(shí)的渲染時(shí)間,提升啟動(dòng)效率拾弃。移動(dòng)方法見下:

 <style name="MyStyle" parent="AppTheme">
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowBackground">@null</item>  
 </style>

3.線程優(yōu)化

線程的創(chuàng)建和銷毀會(huì)帶來(lái)比較大的性能開銷值桩。因此線程優(yōu)化也很有必要。查看項(xiàng)目中是否存在隨意new thread豪椿,線程缺乏管理的情況奔坟。使用AsyncTask或者線程池對(duì)線程進(jìn)行管理,可以提升APP的性能搭盾。另外咳秉,我比較推薦使用Rxjava來(lái)實(shí)現(xiàn)異步操作,既方便又優(yōu)雅鸯隅。

推薦一篇Rxjava的入門文章

4.內(nèi)存泄露

內(nèi)存泄露會(huì)導(dǎo)致APP占用內(nèi)存過(guò)高澜建,影響效率,嚴(yán)重的話會(huì)導(dǎo)致OOM蝌以。因此如果項(xiàng)目存在內(nèi)存泄露的話要優(yōu)先解決炕舵。查找內(nèi)存泄露可以用LeakCanary等工具,具體怎么解決跟畅,有哪些泄露點(diǎn)咽筋,以后有時(shí)間也寫篇總結(jié)。

5.算法優(yōu)化

毋庸置疑徊件,使用合適的算法處理事務(wù)可以大幅提升APP的性能奸攻。當(dāng)然算法不是我的強(qiáng)項(xiàng)蒜危,也只能給出一些大致的點(diǎn):查詢考慮二分查找節(jié)省時(shí)間,盡量不要使用耗時(shí)的遞歸算法睹耐。必要的時(shí)候可以空間換時(shí)間來(lái)提高APP運(yùn)行效率舰褪。

6.其他優(yōu)化點(diǎn)

  • 異步處理耗時(shí)任務(wù) 在Activity、Fragemnt的onCreate等初始化方法中疏橄,如果執(zhí)行了太耗時(shí)的操作(例如讀取各種數(shù)據(jù))占拍,會(huì)影響頁(yè)面的加載速度,讓用戶覺得APP太慢捎迫。這時(shí)候可以異步處理這些耗時(shí)任務(wù)晃酒,減小應(yīng)用啟動(dòng)的時(shí)候的負(fù)擔(dān)。

  • 替換矢量圖 盡管矢量圖有諸多優(yōu)點(diǎn)窄绒,但矢量圖的繪制是消耗性能的贝次。在應(yīng)用初始化加載等比較影響用戶體驗(yàn)的地方,還是建議使用Bitmap來(lái)代替矢量圖彰导,提高APP開啟效率蛔翅。

  • 正則表達(dá)式 經(jīng)小伙伴用TraceView不斷的打點(diǎn)發(fā)現(xiàn),正則表達(dá)式非常消耗時(shí)間位谋。因此盡管正則表達(dá)式非常優(yōu)雅山析,涉及到性能問(wèn)題的時(shí)候,可以改為其他判斷方式來(lái)提高APP性能掏父。

  • 浮點(diǎn)類型 在Java中浮點(diǎn)類型的運(yùn)算大概比整型數(shù)據(jù)慢兩倍笋轨,因此整型數(shù)據(jù)能解決的問(wèn)題盡量用整型。

  • 減少冗余l(xiāng)og 開發(fā)的時(shí)候用于調(diào)試的log赊淑,在項(xiàng)目上線的時(shí)候沒用的要及時(shí)刪除爵政。當(dāng)然有用的log還是要留下,以便以后分析問(wèn)題陶缺。

  • 刪除無(wú)用資源 沒用用的資源會(huì)增大APK大小钾挟,既然沒有用了,上線的時(shí)候當(dāng)然要及時(shí)刪除饱岸。

  • Lint代碼檢查 使用Lint等靜態(tài)代碼檢查工具可以幫助我們發(fā)現(xiàn)很多隱藏的問(wèn)題掺出。Lint檢查出來(lái)的問(wèn)題越少,說(shuō)明代碼越規(guī)范伶贰,越不容易出現(xiàn)各種問(wèn)題蛛砰,APP性能自然也會(huì)提升罐栈。

  • 濫用全局廣播 全局廣播也是十分消耗性能的一個(gè)點(diǎn)黍衙。對(duì)于應(yīng)用內(nèi)的通訊,使用接口回調(diào)荠诬,EventBus等手段比起廣播是更好地選擇琅翻。動(dòng)態(tài)注冊(cè)廣播的時(shí)候位仁,也不要忘了廣播的注銷。

7.總結(jié)

可以看到除了工具的使用外方椎,性能優(yōu)化是很考驗(yàn)代碼功底的聂抢。因此想要做好性能優(yōu)化,強(qiáng)化基本功不可少棠众。性能優(yōu)化也是一件相對(duì)枯燥而難度大的工作琳疏。因?yàn)楹芏鄡?yōu)化的努力可能立馬看不到效果,或者說(shuō)優(yōu)化的成果在數(shù)據(jù)上難以體現(xiàn)闸拿。我們?cè)谧鲂阅軆?yōu)化的時(shí)候也遇到果瓶頸空盼,找不到優(yōu)化方向而感到泄氣。但是堅(jiān)持下來(lái)新荤,利用好工具揽趾,從各個(gè)點(diǎn)去優(yōu)化,總會(huì)有撥開云霧見青天的一天苛骨!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末篱瞎,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子痒芝,更是在濱河造成了極大的恐慌俐筋,老刑警劉巖,帶你破解...
    沈念sama閱讀 218,858評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件严衬,死亡現(xiàn)場(chǎng)離奇詭異校哎,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)瞳步,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門闷哆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人单起,你說(shuō)我怎么就攤上這事抱怔。” “怎么了嘀倒?”我有些...
    開封第一講書人閱讀 165,282評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵屈留,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我测蘑,道長(zhǎng)灌危,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,842評(píng)論 1 295
  • 正文 為了忘掉前任碳胳,我火速辦了婚禮勇蝙,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘挨约。我一直安慰自己味混,他們只是感情好产雹,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評(píng)論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著翁锡,像睡著了一般蔓挖。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上馆衔,一...
    開封第一講書人閱讀 51,679評(píng)論 1 305
  • 那天瘟判,我揣著相機(jī)與錄音,去河邊找鬼角溃。 笑死荒适,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的开镣。 我是一名探鬼主播刀诬,決...
    沈念sama閱讀 40,406評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼邪财!你這毒婦竟也來(lái)了陕壹?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤树埠,失蹤者是張志新(化名)和其女友劉穎糠馆,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體怎憋,經(jīng)...
    沈念sama閱讀 45,767評(píng)論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡又碌,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評(píng)論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了绊袋。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片毕匀。...
    茶點(diǎn)故事閱讀 40,090評(píng)論 1 350
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖癌别,靈堂內(nèi)的尸體忽然破棺而出皂岔,到底是詐尸還是另有隱情,我是刑警寧澤展姐,帶...
    沈念sama閱讀 35,785評(píng)論 5 346
  • 正文 年R本政府宣布躁垛,位于F島的核電站,受9級(jí)特大地震影響圾笨,放射性物質(zhì)發(fā)生泄漏教馆。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評(píng)論 3 331
  • 文/蒙蒙 一擂达、第九天 我趴在偏房一處隱蔽的房頂上張望土铺。 院中可真熱鬧,春花似錦、人聲如沸舒憾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)镀迂。三九已至,卻和暖如春唤蔗,著一層夾襖步出監(jiān)牢的瞬間探遵,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評(píng)論 1 271
  • 我被黑心中介騙來(lái)泰國(guó)打工妓柜, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留箱季,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,298評(píng)論 3 372
  • 正文 我出身青樓棍掐,卻偏偏與公主長(zhǎng)得像藏雏,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子作煌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,163評(píng)論 25 707
  • 發(fā)現(xiàn) 關(guān)注 消息 iOS 第三方庫(kù)掘殴、插件、知名博客總結(jié) 作者大灰狼的小綿羊哥哥關(guān)注 2017.06.26 09:4...
    肇東周閱讀 12,105評(píng)論 4 62
  • #暮色四合# 才剛看了30頁(yè)粟誓,就已經(jīng)被@兔子老愚 的筆觸浸染得體無(wú)完膚奏寨。同為西府人,出生的年代鹰服、故鄉(xiāng)的面貌病瞳、家庭的...
    effelee閱讀 312評(píng)論 0 0
  • @應(yīng)童想在群里和大家談?wù)撓庐?dāng)孩子總是丟東西,東西丟了是在需要用的時(shí)候才發(fā)現(xiàn)悲酷,老師會(huì)如何處理呢套菜? 王安現(xiàn)在你聽好接下...
    小寶媽_b9af閱讀 102評(píng)論 0 0
  • 最重要的人,永遠(yuǎn)是你自己设易。 只需掌握這兩個(gè)模塊笼踩,從此情商一路飆升。 管理自己的情緒是管理他人情緒的基礎(chǔ)亡嫌。 只要我們...
    魚生指教閱讀 1,553評(píng)論 15 30