Android性能優(yōu)化建議

Android性能優(yōu)化主要從卡頓捌治、內(nèi)存泄漏和崩潰、代碼質(zhì)量和邏輯纽窟、安裝包過大四方面入手肖油。在使用時(shí)避免出現(xiàn)卡頓,響應(yīng)速度快臂港,減少用戶等待的時(shí)間森枪,滿足用戶期望视搏;同時(shí)減低 crash 率和 ANR 率,不要在用戶使用過程中崩潰和無響應(yīng)疲恢;節(jié)省流量和耗電凶朗,減少用戶使用成本,避免使用時(shí)導(dǎo)致手機(jī)發(fā)燙显拳;安裝包小可以降低用戶的安裝成本棚愤。

1、卡頓優(yōu)化

Android 系統(tǒng)每隔 16ms 發(fā)出 VSYNC 信號(hào)杂数,觸發(fā)對 UI 進(jìn)行渲染宛畦,如果每次渲染都成功,這樣就能夠達(dá)到流暢的畫面所需的 60FPS揍移。在理想情況下次和,60 FPS 就感覺不到卡,這意味著每個(gè)繪制時(shí)長應(yīng)該在16 ms 左右那伐。如果某個(gè)操作花費(fèi)的時(shí)間是 24ms 踏施,系統(tǒng)在得到 VSYNC 信號(hào)時(shí)就無法正常進(jìn)行正常渲染,這樣就發(fā)生了丟幀現(xiàn)象罕邀。也就是延遲了畅形。

布局優(yōu)化:

  • 合理使用背景色,避免重復(fù)繪制背景色诉探,例如:父布局和子布局的背景色一樣的日熬,子布局無需在設(shè)背景色,父布局設(shè)置即可

  • 減少布局嵌套肾胯,一般不建議超過5層竖席,google推出ConstraintLayout可以使用

  • 合理使用 include、merge 和 ViewStub,使用include和merge增加復(fù)用敬肚,減少層級; ViewStub 按需加載

  • 盡可能少用wrap_content毕荐。wrap_content 會(huì)增加布局 measure 時(shí)計(jì)算成本,在已知寬高為固定值時(shí)艳馒,不用wrap_content

  • 刪除控件中無用的屬性

繪制優(yōu)化:在onDraw中不要?jiǎng)?chuàng)建嵌套對象和做耗時(shí)的任務(wù)东跪;在databinding數(shù)據(jù)刷新的是盡量局部刷新,不要全局刷新鹰溜。

啟動(dòng)優(yōu)化:盡量在Application和Activity onCreate中進(jìn)行耗時(shí)操作虽填,同時(shí)避免在生命周期避免 I/O 操作、反序列化曹动、網(wǎng)絡(luò)操作斋日、布局嵌套等

2、內(nèi)存優(yōu)化

通常在以下的場景容易導(dǎo)致內(nèi)存泄漏:

  • 資源性對象未關(guān)閉墓陈。比如Cursor恶守、File第献、Bitmap等,往往都用了一些緩沖兔港,在不使用時(shí)庸毫,應(yīng)該及時(shí)關(guān)閉它們

  • 注冊對象未注銷。比如事件注冊后未注銷衫樊,會(huì)導(dǎo)致觀察者列表中維持著對象的引用飒赃。例如EventBus或者RxJava

  • 單類或者靜態(tài)變量持有大數(shù)據(jù)對象

  • 引用的context是生命周期短造成,比如Toast科侈,我們傳入的是MainActivity载佳,但MainActivity沒有用了,需要被銷毀臀栈,但我們的Tost依然持有其引用導(dǎo)致無法回收蔫慧,這就導(dǎo)致了內(nèi)存泄漏

  • 匿名內(nèi)部類或非靜態(tài)內(nèi)部類的靜態(tài)實(shí)例

  • Handler臨時(shí)性內(nèi)存泄漏。如果Handler是非靜態(tài)的权薯,容易導(dǎo)致 Activity 或 Service 不會(huì)被回收

  • 容器中的對象沒清理造成的內(nèi)存泄漏

  • WebView姑躲。WebView 存在著內(nèi)存泄漏的問題,在應(yīng)用中只要使用一次 WebView盟蚣,內(nèi)存就不會(huì)被釋放掉

  • 手動(dòng)注冊廣播時(shí)黍析,退出時(shí)忘記 unregisterReceiver()

  • Service 執(zhí)行完后忘記 stopSelf()

3、穩(wěn)定性和耗電優(yōu)化

Android 應(yīng)用的穩(wěn)定性影響穩(wěn)定性的原因很多刁俭,比如內(nèi)存使用不合理、代碼異常場景考慮不周全韧涨、代碼邏輯不合理等牍戚。其中最常見的兩個(gè)場景是:Crash 和 ANR,這兩個(gè)錯(cuò)誤將會(huì)使得程序無法使用虑粥∪缧ⅲ可以下面的方法進(jìn)行解決:

  • 提高代碼質(zhì)量,例如代碼審查娩贷、checkstyle統(tǒng)一風(fēng)格第晰、處理復(fù)雜邏輯時(shí)最好自己畫下流程圖

  • 代碼靜態(tài)掃描工具。常見工具有Android Lint彬祖、Findbugs茁瘦、Checkstyle、PMD等

  • Crash監(jiān)控和上傳储笑。把一些崩潰的信息甜熔,異常信息及時(shí)地記錄下來,以便后續(xù)分析解決突倍;或者有條件的可以使用bugly腔稀,把異常信息上報(bào)

  • 推薦使用 JobScheduler盆昙,來調(diào)整任務(wù)優(yōu)先級等策略來達(dá)到降低損耗的目的

  • 計(jì)算優(yōu)化,避開浮點(diǎn)運(yùn)算等耗時(shí)計(jì)算

  • 避免 WaleLock 使用不當(dāng)

4焊虏、安裝包大小優(yōu)化

安裝包過大淡喜,對用戶的下載欲望有影響,特別是在移動(dòng)網(wǎng)絡(luò)下诵闭,提高用戶進(jìn)入門檻炼团,雖然現(xiàn)在移動(dòng)網(wǎng)絡(luò)已經(jīng)無限流量,但apk過大加大了安裝時(shí)間涂圆,常用應(yīng)用安裝包的構(gòu)成们镜,如圖所示:

image
  • lib文件夾:存放一些第三方庫文件。

  • assets文件夾:存放一些配置文件润歉、資源文件模狭,assets不會(huì)自動(dòng)生成對應(yīng)的 ID,而是通過 AssetManager 類的接口獲取踩衩。

  • res文件夾:res 是 resource 的縮寫嚼鹉,這個(gè)目錄存放資源文件,會(huì)自動(dòng)生成對應(yīng)的 ID 并映射到 .R 文件中驱富,訪問直接使用資源 ID锚赤。

  • META-INF。保存應(yīng)用的簽名信息褐鸥,簽名信息可以驗(yàn)證 APK 文件的完整性线脚。

  • AndroidManifest.xml。這個(gè)文件用來描述 Android 應(yīng)用的配置信息叫榕,一些組件的注冊信息浑侥、可使用權(quán)限等。

  • classes.dex晰绎。Dalvik 字節(jié)碼程序寓落,讓 Dalvik 虛擬機(jī)可執(zhí)行,一般情況下荞下,Android 應(yīng)用在打包時(shí)通過 Android SDK 中的 dx 工具將 Java 字節(jié)碼轉(zhuǎn)換為 Dalvik 字節(jié)碼伶选。

  • resources.arsc。記錄著資源文件和資源 ID 之間的映射關(guān)系尖昏,用來根據(jù)資源 ID 尋找資源仰税。

減少安裝包大小的常用方案

  • 代碼混淆。使用proGuard 代碼混淆器工具抽诉,它包括壓縮肖卧、優(yōu)化、混淆等功能掸鹅。

  • 資源優(yōu)化塞帐。比如使用 Android Lint 刪除冗余資源拦赠,資源文件最少化等。

  • 圖片優(yōu)化葵姥。比如利用 AAPT 工具對 PNG 格式的圖片做壓縮處理荷鼠,降低圖片色彩位數(shù)等,或者使用webp格式圖片榔幸。

  • 插件化允乐。比如功能模塊放在服務(wù)器上,按需下載削咆,可以減少安裝包大小牍疏。

  • 減少lib。能自己寫的lib盡量自己寫拨齐,第三方lib可能會(huì)帶有你未必需要的代碼鳞陨;還有就是如果不想支持x86架構(gòu)的手機(jī),可以刪除x86lib瞻惋,或者打包的時(shí)候排除x86包厦滤。

  • 刪除lombok。這個(gè)apk使用lombok歼狼,雖然帶來了get,set的方便掏导,但是apk也增大了,可以根據(jù)具體需求來決定是否使用羽峰。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末趟咆,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子梅屉,更是在濱河造成了極大的恐慌值纱,老刑警劉巖,帶你破解...
    沈念sama閱讀 219,188評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件履植,死亡現(xiàn)場離奇詭異计雌,居然都是意外死亡悄晃,警方通過查閱死者的電腦和手機(jī)玫霎,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,464評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來妈橄,“玉大人庶近,你說我怎么就攤上這事【祢荆” “怎么了鼻种?”我有些...
    開封第一講書人閱讀 165,562評論 0 356
  • 文/不壞的土叔 我叫張陵,是天一觀的道長沙热。 經(jīng)常有香客問我叉钥,道長罢缸,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,893評論 1 295
  • 正文 為了忘掉前任投队,我火速辦了婚禮枫疆,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘敷鸦。我一直安慰自己息楔,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,917評論 6 392
  • 文/花漫 我一把揭開白布扒披。 她就那樣靜靜地躺著值依,像睡著了一般。 火紅的嫁衣襯著肌膚如雪碟案。 梳的紋絲不亂的頭發(fā)上愿险,一...
    開封第一講書人閱讀 51,708評論 1 305
  • 那天,我揣著相機(jī)與錄音蟆淀,去河邊找鬼拯啦。 笑死,一個(gè)胖子當(dāng)著我的面吹牛熔任,可吹牛的內(nèi)容都是我干的褒链。 我是一名探鬼主播,決...
    沈念sama閱讀 40,430評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼疑苔,長吁一口氣:“原來是場噩夢啊……” “哼瘦赫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起巡莹,我...
    開封第一講書人閱讀 39,342評論 0 276
  • 序言:老撾萬榮一對情侶失蹤泰讽,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后薪贫,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體恍箭,經(jīng)...
    沈念sama閱讀 45,801評論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,976評論 3 337
  • 正文 我和宋清朗相戀三年瞧省,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了扯夭。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,115評論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡鞍匾,死狀恐怖交洗,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情橡淑,我是刑警寧澤构拳,帶...
    沈念sama閱讀 35,804評論 5 346
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響置森,放射性物質(zhì)發(fā)生泄漏斗埂。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,458評論 3 331
  • 文/蒙蒙 一凫海、第九天 我趴在偏房一處隱蔽的房頂上張望蜜笤。 院中可真熱鬧,春花似錦盐碱、人聲如沸把兔。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,008評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽县好。三九已至,卻和暖如春暖混,著一層夾襖步出監(jiān)牢的瞬間缕贡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,135評論 1 272
  • 我被黑心中介騙來泰國打工拣播, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留晾咪,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,365評論 3 373
  • 正文 我出身青樓贮配,卻偏偏與公主長得像谍倦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個(gè)殘疾皇子泪勒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,055評論 2 355

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

  • 用兩張圖告訴你昼蛀,為什么你的 App 會(huì)卡頓? - Android - 掘金 Cover 有什么料? 從這篇文章中你...
    hw1212閱讀 12,732評論 2 59
  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 172,180評論 25 707
  • 說到 Android 系統(tǒng)手機(jī)圆存,大部分人的印象是用了一段時(shí)間就變得有點(diǎn)卡頓叼旋,有些程序在運(yùn)行期間莫名其妙的出現(xiàn)崩潰,...
    cowboy3000閱讀 598評論 0 2
  • 今天非常形象化的學(xué)到一個(gè)新詞——心里模型沦辙。 就是把自己的心理活動(dòng)類比化夫植,想象成一個(gè)具體的形象,這樣能夠更清晰直觀的...
    阿蜜兒閱讀 112評論 0 3
  • (全文共計(jì)750字油讯,閱讀時(shí)間建議2分鐘) 最近迷上了一款手游详民,就是處在風(fēng)口浪尖的《王者榮耀》。說實(shí)話這還是...
    q_檸檬茶_p閱讀 376評論 0 1