Android性能優(yōu)化:手把手教你如何讓App更快笆檀、更穩(wěn)忌堂、更省(含內(nèi)存酗洒、布局優(yōu)化等)

前言

  • Android開(kāi)發(fā)中士修,性能優(yōu)化策略十分重要
  • 因?yàn)槠錄Q定了應(yīng)用程序的開(kāi)發(fā)質(zhì)量:可用性、流暢性樱衷、穩(wěn)定性等棋嘲,是提高用戶留存率的關(guān)鍵
  • 本文全面講解性能優(yōu)化中的所有知識(shí),獻(xiàn)上一份 Android性能優(yōu)化的詳細(xì)攻略矩桂, 含:優(yōu)化方向沸移、原因 & 具體優(yōu)化方案,希望你們會(huì)喜歡

文章較長(zhǎng)侄榴,建議預(yù)留較長(zhǎng)時(shí)間閱讀 / 收藏


目錄

示意圖

1. 性能優(yōu)化的目的

性能優(yōu)化的目的是為了讓?xiě)?yīng)用程序App 更快雹锣、更穩(wěn)定 & 更省。具體介紹如下:

  • 更快:應(yīng)用程序 運(yùn)行得更加流暢癞蚕、不卡頓蕊爵,能快速響應(yīng)用戶操作
  • 更穩(wěn)定:應(yīng)用程序 能 穩(wěn)定運(yùn)行 & 解決用戶需求,在用戶使用過(guò)程中不出現(xiàn)應(yīng)用程序崩潰(Crash) 和 無(wú)響應(yīng)(ANR)的問(wèn)題
  • 更疏肷健:節(jié)省耗費(fèi)的資源攒射,包括 內(nèi)存占有醋旦、電池量、網(wǎng)絡(luò)資源等

2. 需優(yōu)化的性能指標(biāo)

針對(duì)上述目的会放,需優(yōu)化的性能指標(biāo) 含:流暢性浑度、穩(wěn)定性、資源節(jié)省性


3. 優(yōu)化方向

  • 針對(duì)上述性能指標(biāo)鸦概,本文主要講解的優(yōu)化方向如下:
示意圖
  • 下面箩张,我將針對(duì)每一種性能指標(biāo),詳細(xì)講解其優(yōu)化方案

4. 流暢性

  • 優(yōu)化原因
    利于 減少使用中的卡頓窗市、響應(yīng)時(shí)間久等問(wèn)題先慷,給與用戶一個(gè)操作流暢的體驗(yàn)
  • 優(yōu)化方向
    主要針對(duì)3個(gè)方面優(yōu)化:?jiǎn)?dòng)速度、頁(yè)面顯示速度咨察、響應(yīng)速度

4.1 啟動(dòng)速度

  • 優(yōu)化原因(即 啟動(dòng)速度慢的原因)
    初次打開(kāi)應(yīng)用時(shí)论熙,需加載很多資源 or 功能邏輯
  • 優(yōu)化方案
    采用 異步加載(多線程)、分步加載摄狱、延期加載的策略脓诡,減少啟動(dòng)應(yīng)用時(shí)加載的任務(wù),從而提高啟動(dòng)速度

由于我們打開(kāi)的頁(yè)面大多是Activity媒役,下面將給出加速啟動(dòng)Activity的方式

示意圖

4.2 頁(yè)面顯示速度

  • 優(yōu)化原因(即 頁(yè)面顯示速度慢的原因)
    a. 頁(yè)面需繪制的內(nèi)容(布局 & 控件)太多祝谚,從而導(dǎo)致頁(yè)面測(cè)量時(shí)間過(guò)長(zhǎng)
    b. 繪制效率過(guò)低,從而導(dǎo)致繪制時(shí)間過(guò)長(zhǎng)

  • 優(yōu)化方案
    布局優(yōu)化 & 繪制優(yōu)化酣衷。具體請(qǐng)看文章:

  1. Android性能優(yōu)化:手把手帶你全面了解 繪制優(yōu)化
  2. Android性能優(yōu)化:布局優(yōu)化 詳細(xì)解析(含<include>交惯、<ViewStub>、<merge>講解 )

4.3 響應(yīng)速度

  • 優(yōu)化原因
    應(yīng)用程序出現(xiàn) ANR 情況穿仪,從而導(dǎo)致 應(yīng)用程序響應(yīng)速度慢

關(guān)于ANR的簡(jiǎn)介如下

示意圖
  • 優(yōu)化方案
    使用多線程席爽,將大量 & 耗時(shí)操作放在工作線程中執(zhí)行
  1. 多線程的方式 包括:AsyncTask、繼承 Thread類啊片、實(shí)現(xiàn) Runnable接口只锻、Handler消息機(jī)制、HandlerThread
  2. 注:實(shí)際開(kāi)發(fā)中紫谷,當(dāng)一個(gè)進(jìn)程發(fā)生了ANR后齐饮,系統(tǒng)會(huì)在 /data/anr目錄下創(chuàng)建一個(gè)文件 traces.txt,通過(guò)分析該文件可定位出ANR的原因

4.4 其他優(yōu)化方案

  • 合理的刷新機(jī)制


    示意圖
  • 動(dòng)畫(huà)的使用

    1. 根據(jù)不同場(chǎng)景選擇 合適的動(dòng)畫(huà)框架
    2. 使用 硬件加速的方式 提高流暢度
    3. 使用動(dòng)畫(huà)后需停止動(dòng)畫(huà)

4.5 總結(jié)

下面碴里,總結(jié) 關(guān)于流暢性的性能優(yōu)化方案


示意圖

5. 穩(wěn)定性

  • 影響Android 應(yīng)用穩(wěn)定性的原因有很多沈矿,主要是:應(yīng)用崩潰(Crash)、應(yīng)用無(wú)響應(yīng)(ANR)

這2個(gè)錯(cuò)誤的結(jié)果將導(dǎo)致程序無(wú)法使用

  • 下面咬腋,將主要講解該2個(gè)優(yōu)化方向:應(yīng)用崩潰(Crash)羹膳、應(yīng)用無(wú)響應(yīng)(ANR)

5.1 應(yīng)用無(wú)響應(yīng)(ANR)

  • 簡(jiǎn)介
示意圖
  • 優(yōu)化原理
    盡量避免應(yīng)用程序出現(xiàn) ANR 情況

  • 優(yōu)化方案
    使用多線程,將大量 & 耗時(shí)操作放在工作線程中執(zhí)行

  1. 多線程的方式 包括:AsyncTask根竿、繼承 Thread類陵像、實(shí)現(xiàn) Runnable接口就珠、Handler消息機(jī)制、HandlerThread
  2. 關(guān)于多線程的使用醒颖,可看我寫(xiě)的關(guān)于多線程的文集:多線程系列
  3. 注:實(shí)際開(kāi)發(fā)中妻怎,當(dāng)一個(gè)進(jìn)程發(fā)生了ANR后,系統(tǒng)會(huì)在 /data/anr目錄下創(chuàng)建一個(gè)文件 traces.txt泞歉,通過(guò)分析該文件可定位出ANR的原因

5.2 應(yīng)用崩潰(Crash)

  • 優(yōu)化原理
    應(yīng)用崩潰Crash很多情況是因?yàn)?內(nèi)存溢出逼侦,即OOM;故 需避免出現(xiàn) OOM現(xiàn)象

內(nèi)存溢出 簡(jiǎn)介:


示意圖

5.3 總結(jié)

下面榛丢,總結(jié) 關(guān)于穩(wěn)定性的性能優(yōu)化方案


示意圖

6. 資源節(jié)省性

  • 優(yōu)化原因
    由于移動(dòng)設(shè)備的硬件性能有限,故減少應(yīng)用程序的資源消耗顯得十分重要

  • 優(yōu)化方向
    內(nèi)存大小挺庞、安裝包大小晰赞、耗電量 & 網(wǎng)絡(luò)流量

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

  • 優(yōu)化原因
    避免因不正確使用內(nèi)存 & 缺乏管理,從而出現(xiàn) 內(nèi)存泄露(ML)选侨、內(nèi)存溢出(OOM)掖鱼、內(nèi)存空間占用過(guò)大 等問(wèn)題,最終導(dǎo)致應(yīng)用程序崩潰(Crash

  • 優(yōu)化方向
    常見(jiàn)的內(nèi)存問(wèn)題如下

    1. 內(nèi)存泄露
    2. 內(nèi)存抖動(dòng)
    3. 圖片Bitmap相關(guān)
    4. 代碼質(zhì)量 & 數(shù)量
    5. 日常不正確使用
  • 具體優(yōu)化方案
    下面援制,我將詳細(xì)分析每項(xiàng)的內(nèi)存問(wèn)題 & 給出優(yōu)化方案戏挡。具體請(qǐng)看文章:

  1. Android性能優(yōu)化:這是一份全面&詳細(xì)的內(nèi)存優(yōu)化指南
  2. Android性能優(yōu)化:手把手帶你全面了解 內(nèi)存泄露 & 解決方案

6.2 減少安裝包大小

  • 優(yōu)化原因
    應(yīng)用程序的安裝包大小雖對(duì)應(yīng)用程序的使用無(wú)影響,但影響的是:
  1. 空間占有率:即 應(yīng)用程序占有手機(jī)內(nèi)存的大小
  2. 下載門(mén)檻:應(yīng)用的安裝包越大隘谣,用戶下載的門(mén)檻越高

特別在移動(dòng)網(wǎng)絡(luò)下增拥,用戶下載應(yīng)用時(shí),對(duì)安裝包大小的要求更高寻歧,因此減小安裝包大小可讓更多用戶愿意下載 & 使用產(chǎn)品

  • 安裝包結(jié)構(gòu) 介紹
示意圖
  • 優(yōu)化方案
示意圖

6.3 減少網(wǎng)絡(luò)流量

  • 優(yōu)化原因
    每次獲取資源時(shí) 都通過(guò)流量 & 網(wǎng)絡(luò)加載的方式,將耗費(fèi)大量網(wǎng)絡(luò)流量

  • 優(yōu)化方案
    主要通過(guò) 緩存 減少網(wǎng)絡(luò)流量秩仆,采用三級(jí)緩存方案:即 內(nèi)存緩存 - 硬盤(pán)緩存- 數(shù)據(jù)庫(kù)- 文件 - 網(wǎng)絡(luò)緩存

具體描述:當(dāng)加載資源時(shí)码泛,先從內(nèi)存緩存中尋找;若內(nèi)存緩存中沒(méi)有澄耍,則從文件緩存中尋找噪珊;若文件緩存中沒(méi)有,最終再通過(guò)流量從網(wǎng)絡(luò)中加載獲取

6.4 減少應(yīng)用的耗電量

  • 優(yōu)化原因
    隨著智能手機(jī)普及 & 應(yīng)用程序App的功能發(fā)展齐莲,人們的日常生活都離不開(kāi)智能手機(jī) & 各式各樣的應(yīng)用程序App痢站,故 應(yīng)用程序的耗電量指標(biāo)則顯得十分重要

具體優(yōu)化方案如下:


示意圖

6.5 總結(jié)

下面,總結(jié) 關(guān)于資源節(jié)省性的性能優(yōu)化方案


示意圖

7. 總結(jié)

  • 區(qū)別于 功能性開(kāi)發(fā)需求的短期性选酗,性能優(yōu)化是貫穿整個(gè)應(yīng)用程序App項(xiàng)目的持續(xù)性需求阵难;雖項(xiàng)目一開(kāi)始時(shí),性能優(yōu)化的優(yōu)先級(jí)較低芒填,但當(dāng)應(yīng)用程序App的用戶體量達(dá)到一定規(guī)模時(shí)呜叫,性能優(yōu)化 則非常重要
  • 本文全面總結(jié)了Android開(kāi)發(fā)中的性能優(yōu)化 所有知識(shí)空繁,含:優(yōu)化方向、原因 & 具體優(yōu)化方案朱庆,下面用2張圖總結(jié):
性能優(yōu)化概述
示意圖

請(qǐng)點(diǎn)贊!因?yàn)槟愕墓膭?lì)是我寫(xiě)作的最大動(dòng)力娱颊!

相關(guān)文章閱讀
Android開(kāi)發(fā):最全面傲诵、最易懂的Android屏幕適配解決方案
Android事件分發(fā)機(jī)制詳解:史上最全面、最易懂
Android開(kāi)發(fā):史上最全的Android消息推送解決方案
Android開(kāi)發(fā):最全面、最易懂的Webview詳解
Android開(kāi)發(fā):JSON簡(jiǎn)介及最全面解析方法!
Android四大組件:Service服務(wù)史上最全面解析
Android四大組件:BroadcastReceiver史上最全面解析


歡迎關(guān)注Carson_Ho的簡(jiǎn)書(shū)晾嘶!

不定期分享關(guān)于安卓開(kāi)發(fā)的干貨洲愤,追求短、平殖熟、快,但卻不缺深度斑响。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末菱属,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子舰罚,更是在濱河造成了極大的恐慌纽门,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,372評(píng)論 6 498
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件营罢,死亡現(xiàn)場(chǎng)離奇詭異赏陵,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)饲漾,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,368評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門(mén)蝙搔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人考传,你說(shuō)我怎么就攤上這事吃型。” “怎么了僚楞?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,415評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵勤晚,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我泉褐,道長(zhǎng)赐写,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,157評(píng)論 1 292
  • 正文 為了忘掉前任膜赃,我火速辦了婚禮挺邀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己悠夯,他們只是感情好癌淮,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,171評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著沦补,像睡著了一般乳蓄。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上夕膀,一...
    開(kāi)封第一講書(shū)人閱讀 51,125評(píng)論 1 297
  • 那天虚倒,我揣著相機(jī)與錄音,去河邊找鬼产舞。 笑死魂奥,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的易猫。 我是一名探鬼主播耻煤,決...
    沈念sama閱讀 40,028評(píng)論 3 417
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼准颓!你這毒婦竟也來(lái)了哈蝇?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 38,887評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤攘已,失蹤者是張志新(化名)和其女友劉穎炮赦,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體样勃,經(jīng)...
    沈念sama閱讀 45,310評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡吠勘,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,533評(píng)論 2 332
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了峡眶。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片剧防。...
    茶點(diǎn)故事閱讀 39,690評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖幌陕,靈堂內(nèi)的尸體忽然破棺而出诵姜,到底是詐尸還是另有隱情,我是刑警寧澤搏熄,帶...
    沈念sama閱讀 35,411評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站暇赤,受9級(jí)特大地震影響心例,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜鞋囊,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,004評(píng)論 3 325
  • 文/蒙蒙 一止后、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦译株、人聲如沸瓜喇。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,659評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)乘寒。三九已至,卻和暖如春匪补,著一層夾襖步出監(jiān)牢的瞬間伞辛,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,812評(píng)論 1 268
  • 我被黑心中介騙來(lái)泰國(guó)打工夯缺, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留蚤氏,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,693評(píng)論 2 368
  • 正文 我出身青樓踊兜,卻偏偏與公主長(zhǎng)得像竿滨,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子捏境,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,577評(píng)論 2 353

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