Android 性能優(yōu)化的重要性(帶面試題)~

性能優(yōu)化對于Android開發(fā)的重要性非常大。隨著Android設(shè)備的不斷升級,用戶對應(yīng)用的要求也越來越高饮戳,包括應(yīng)用的運行速度、響應(yīng)速度测蹲、流暢度等方面莹捡。如果應(yīng)用的性能不能滿足用戶的需求,很可能會導(dǎo)致用戶流失扣甲、差評以及應(yīng)用被卸載等情況篮赢。

另外齿椅,隨著移動互聯(lián)網(wǎng)的普及和應(yīng)用市場的競爭越來越激烈,開發(fā)人員需要盡可能地提高應(yīng)用的性能启泣,以提高用戶的使用體驗和滿意度涣脚。同時,在性能方面的優(yōu)化還可以減少應(yīng)用的資源占用和耗電量寥茫,也可以為用戶節(jié)省設(shè)備存儲空間和流量消耗遣蚀。

因此一些公司在招聘欄中就有明確的說明:

所以在面試過程中,關(guān)于性能優(yōu)化的問題頻率自然也不會少纱耻,下面列舉了一些面試題及參考答案芭梯,大家可以進行參考,如果你在面試中被問到弄喘,你會怎么樣的正面回答面試官的問題玖喘?

1. 什么是 ANR?如何避免 ANR蘑志?

什么是 ANR累奈?

在 Android 系統(tǒng)中,如果應(yīng)用程序有一段時間響應(yīng)不夠靈敏急但,系統(tǒng)會向用戶顯示一個對話框澎媒,這個對話框稱作應(yīng)用程序無響應(yīng)(ANR:ApplicationNotResponding)對話框。 用戶可以選擇讓程序繼續(xù)運行波桩,但是戒努,他們在使用你的應(yīng)用程序時,并不希望每次都要處理這個對話框突委。因此 柏卤,在程序里對響應(yīng)性能的設(shè)計很重要,這樣系統(tǒng)就不會顯示 ANR 給用戶匀油。

ANR的觸發(fā)

1缘缚、Activity、BroadCastReceiver敌蚜、Service觸發(fā)ANR的時間

Android 系統(tǒng)會監(jiān)控程序的響應(yīng)狀況桥滨,不同的組件發(fā)生 ANR 的時間不一樣:

  • Activity:5 秒。應(yīng)用在 5 秒內(nèi)未響應(yīng)用戶的輸入事件(如按鍵或者觸摸)
  • BroadCastReceiver :10 秒弛车。 BroadcastReceiver 未在 10 秒內(nèi)完成相關(guān)的處理
  • Service:20 秒(均為前臺)齐媒。Service 在20 秒內(nèi)無法處理完成

2、引起ANR的原因

  • 主線程被 IO 操作(從 4.0 之后網(wǎng)絡(luò) IO 不允許在主線程中)阻塞纷跛;
  • 主線程中存在耗時的計算喻括;
  • 主線程中錯誤的操作,比如 Thread.wait 或者 Thread.sleep 等贫奠。

3唬血、ANR信息查看
如果開發(fā)機器上出現(xiàn)問題望蜡,我們可以查看/data/anr/traces.txt,最新的 ANR 信息在最開始部分拷恨。

避免ANR的建議

1脖律、使用 AsyncTask 處理耗時 IO 操作。
2腕侄、使用 Thread 或者 HandlerThread 時小泉,要設(shè)置線程優(yōu)先級。未調(diào)用 Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)設(shè)置優(yōu)先級冕杠,仍然會降低程序響應(yīng)微姊,因為默認(rèn) Thread 的優(yōu)先級和主線程相同。
3分预、使用 Handler 處理工作線程結(jié)果柒桑,而不是使用 Thread.wait()或者 Thread.sleep() 來阻塞主線程。
4噪舀、Activity 的 onCreate 和 onResume 回調(diào)中盡量避免耗時的代碼。
5飘诗、BroadcastReceiver 中 onReceive 代碼也要盡量減少耗時与倡,建議使用 IntentService 處理。

小結(jié):

將所有耗時操作昆稿,比如訪問網(wǎng)絡(luò)纺座,Socket 通信,查詢大量 SQL 語句溉潭,復(fù)雜邏輯計算等都放在子線程中去净响,然后通過 handler.sendMessage、runonUIThread喳瓣、 AsyncTask馋贤、RxJava 等方式更新 UI。無論如何都要確保用戶界面的流暢度畏陕。如果耗時操作需要讓用戶等待配乓,那么可以在界面上顯示度條。

2. 如何檢測內(nèi)存泄漏惠毁?

內(nèi)存泄漏通常是由于對象未被垃圾回收而導(dǎo)致的犹芹,造成了內(nèi)存浪費和性能問題。我們可以通過一些工具來檢測內(nèi)存泄漏鞠绰,例如 Android Studio 自帶的 Memory Profiler腰埂,可以查看應(yīng)用的內(nèi)存分配和回收情況,找出內(nèi)存浪費的區(qū)域蜈膨;另外屿笼,我們還可以使用第三方庫 LeakCanary 來檢測內(nèi)存泄漏牺荠,它會在應(yīng)用中檢測可能的內(nèi)存泄漏,并輸出詳細的報告刁卜,方便我們快速定位問題志电。

3. 如何優(yōu)化 ListView 或 RecyclerView 的滑動性能?

列表的滑動性能是用戶體驗的重要指標(biāo)之一蛔趴,我們可以采取以下措施來優(yōu)化列表的滑動性能:

(1) 使用 ViewHolder 模式來復(fù)用 Item View挑辆,避免重復(fù)創(chuàng)建和銷毀 View 造成性能問題;

(2) 使用異步圖片加載庫來異步加載圖片孝情,避免圖片加載卡頓鱼蝉;

(3) 使用分頁加載或滑動到底部自動加載的方式,避免一次性加載大量數(shù)據(jù)箫荡;

(4) 優(yōu)化布局和控件的復(fù)雜度魁亦,減少嵌套,使用簡單的控件羔挡,避免復(fù)雜布局導(dǎo)致的性能問題洁奈;

(5) 使用硬件加速和渲染緩存來提升列表的滑動性能,借助 Android 系統(tǒng)的優(yōu)化機制實現(xiàn)更好的性能绞灼。

4. 如何優(yōu)化應(yīng)用啟動時間利术?

應(yīng)用的啟動時間對用戶使用體驗有很大的影響,因此我們需要使用一些方法來優(yōu)化應(yīng)用的啟動時間低矮。一些優(yōu)化策略包括:

(1) 去除無關(guān)的啟動項印叁,減少啟動階段的工作量,例如去除不必要的檢查和操作军掂;

(2) 延遲初始化轮蜕,延遲占位等方式,避免應(yīng)用啟動阻塞蝗锥,效果顯著跃洛;

(3) 優(yōu)化應(yīng)用的資源加載,例如減小圖片玛追、資源等的大小税课,采用增量更新等策略;

(4) 使用 Profiler 工具等方式來分析啟動過程的瓶頸痊剖,進一步優(yōu)化應(yīng)用的啟動時間韩玩。

5. 如何優(yōu)化應(yīng)用的網(wǎng)絡(luò)請求性能?

應(yīng)用的網(wǎng)絡(luò)請求性能對用戶體驗也有很大的影響陆馁,我們可以使用以下策略來優(yōu)化應(yīng)用的網(wǎng)絡(luò)請求性能:

(1) 使用緩存機制找颓,避免重復(fù)請求相同的數(shù)據(jù),減少網(wǎng)絡(luò)請求量叮贩;

(2) 使用合適的文件下載方式击狮,例如分片下載等方式佛析,加快下載速度,提升用戶體驗彪蓬;

(3) 使用合適的請求庫寸莫,例如 Retrofit、OkHttp 等档冬,它們提供了更高效的請求方式和優(yōu)化策略膘茎;

(4) 避免頻繁的網(wǎng)絡(luò)請求,例如避免鎖屏下無用的請求等酷誓,同時也能減少資源的消耗和服務(wù)器的壓力披坏。

6. 如何避免常見的內(nèi)存抖動現(xiàn)象?

內(nèi)存抖動是由于頻繁的內(nèi)存分配和釋放導(dǎo)致的盐数,通常會造成性能問題和內(nèi)存泄漏棒拂,我們可以采取以下措施來避免內(nèi)存抖動:

(1) 使用合適的數(shù)據(jù)結(jié)構(gòu)和算法,避免大量的對象頻繁創(chuàng)建和銷毀玫氢;

(2) 使用對象池來重用對象帚屉,避免頻繁的內(nèi)存分配和釋放;

(3) 適當(dāng)提高 Dalvik VM 的堆棧大小漾峡,減少 GC 的開銷涮阔,提高性能;

(4) 避免大量的循環(huán)和遞歸灰殴,避免造成內(nèi)存抖動或棧溢出等問題。

7. 如何優(yōu)化應(yīng)用的電量消耗掰邢?

應(yīng)用的電量消耗是用戶關(guān)注的一個問題牺陶,我們可以采取以下措施來優(yōu)化應(yīng)用的電量消耗:

(1) 使用合適的網(wǎng)絡(luò)模式,例如使用始終連接模式辣之、長輪詢等方式掰伸,避免頻繁的網(wǎng)絡(luò)請求;

(2) 避免鎖屏或者屏幕關(guān)閉時仍然進行無用的操作怀估,例如避免持續(xù)的計算任務(wù)或者網(wǎng)絡(luò)請求等狮鸭;

(3) 使用省電模式,例如調(diào)整 CPU 頻率多搀、屏幕亮度歧蕉、禁用傳感器等方式,適當(dāng)降低應(yīng)用的資源消耗和電量消耗康铭。

8. 如何優(yōu)化布局的嵌套層數(shù)惯退?

布局的嵌套層數(shù)過多會影響應(yīng)用的性能,我們可以采取以下措施來優(yōu)化布局的嵌套層數(shù):

(1) 避免過度的布局嵌套从藤;

(2) 減少視圖層級催跪,盡量使用簡單的布局锁蠕;

(3) 使用 ConstraintLayout 取代 LinearLayout 和 RelativeLayout;

(4) 減少 background 使用懊蒸,盡量使用簡單的 color 或 drawable荣倾;

(5) 刪除不必要的視圖。

9. 如何優(yōu)化應(yīng)用的數(shù)據(jù)庫操作性能骑丸?

應(yīng)用的數(shù)據(jù)庫操作也會影響到應(yīng)用的性能舌仍,我們可以采取以下措施來優(yōu)化應(yīng)用的數(shù)據(jù)庫操作性能:

(1) 使用事務(wù)進行批量操作;

(2) 使用索引來提高查詢速度者娱;

(3) 避免查詢過多數(shù)據(jù)抡笼,應(yīng)該使用分頁或者分塊查詢數(shù)據(jù);

(4) 注意數(shù)據(jù)庫表設(shè)計黄鳍,避免建立大量的多對多關(guān)系推姻;

(5) 不要在主線程進行數(shù)據(jù)庫操作。

10. 如何優(yōu)化應(yīng)用的內(nèi)存占用框沟?

應(yīng)用的內(nèi)存占用也會影響到應(yīng)用的性能藏古,我們可以采取以下措施來優(yōu)化應(yīng)用的內(nèi)存占用:

(1) 使用合適的數(shù)據(jù)結(jié)構(gòu)和算法,避免大量的內(nèi)存分配和釋放忍燥;

(2) 注意內(nèi)存釋放拧晕,及時清理無用的對象和引用;

(3) 盡量避免在主線程中進行大量的計算或者 IO 操作梅垄;

(4) 使用合適的對象池和緩存機制厂捞。

11. 如何優(yōu)化應(yīng)用的圖片加載性能?

應(yīng)用中大量使用的圖片也會對性能造成影響队丝,我們可以采取以下措施來優(yōu)化應(yīng)用的圖片加載性能:

(1) 使用網(wǎng)絡(luò)圖片加載庫靡馁,例如 Glide、Picasso 等机久,它們可以自動處理圖片的壓縮和緩存等問題臭墨;

(2) 盡量使用小圖片,避免加載過大的圖片膘盖;

(3) 預(yù)加載胧弛,例如提前加載下一頁的圖片;

(4) 選擇合適的圖片格式侠畔,例如 PNG结缚、JPEG 等。

12. 如何進行應(yīng)用的混淆和壓縮软棺?

應(yīng)用的混淆和壓縮也是優(yōu)化的重要手段之一掺冠,我們可以采取以下措施:

(1) 使用 Proguard 進行代碼混淆;

(2) 使用 R8 進行代碼混淆和壓縮;

(3) 優(yōu)化資源文件德崭,例如去除無用的資源斥黑、壓縮圖片等;

(4) 使用簽名方式對應(yīng)用進行加固眉厨,提高應(yīng)用的安全性锌奴。

以上都是互聯(lián)網(wǎng)大廠必問的 Android 性能優(yōu)化問題及其詳解,這些問題通常會考察面試者的 Android 技術(shù)水平和問題解決能力憾股,如果你對這塊內(nèi)容掌握的不很好鹿蜀,也不用慌!

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末服球,一起剝皮案震驚了整個濱河市茴恰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌斩熊,老刑警劉巖往枣,帶你破解...
    沈念sama閱讀 207,248評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異粉渠,居然都是意外死亡分冈,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,681評論 2 381
  • 文/潘曉璐 我一進店門霸株,熙熙樓的掌柜王于貴愁眉苦臉地迎上來雕沉,“玉大人,你說我怎么就攤上這事去件∑陆罚” “怎么了?”我有些...
    開封第一講書人閱讀 153,443評論 0 344
  • 文/不壞的土叔 我叫張陵尤溜,是天一觀的道長肠牲。 經(jīng)常有香客問我,道長靴跛,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,475評論 1 279
  • 正文 為了忘掉前任渡嚣,我火速辦了婚禮梢睛,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘识椰。我一直安慰自己绝葡,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 64,458評論 5 374
  • 文/花漫 我一把揭開白布腹鹉。 她就那樣靜靜地躺著藏畅,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上愉阎,一...
    開封第一講書人閱讀 49,185評論 1 284
  • 那天绞蹦,我揣著相機與錄音,去河邊找鬼榜旦。 笑死幽七,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的溅呢。 我是一名探鬼主播澡屡,決...
    沈念sama閱讀 38,451評論 3 401
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼咐旧!你這毒婦竟也來了驶鹉?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,112評論 0 261
  • 序言:老撾萬榮一對情侶失蹤铣墨,失蹤者是張志新(化名)和其女友劉穎室埋,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體踏兜,經(jīng)...
    沈念sama閱讀 43,609評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡词顾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,083評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了碱妆。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片肉盹。...
    茶點故事閱讀 38,163評論 1 334
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖疹尾,靈堂內(nèi)的尸體忽然破棺而出佑笋,到底是詐尸還是另有隱情,我是刑警寧澤昌粤,帶...
    沈念sama閱讀 33,803評論 4 323
  • 正文 年R本政府宣布土思,位于F島的核電站,受9級特大地震影響繁成,放射性物質(zhì)發(fā)生泄漏吓笙。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,357評論 3 307
  • 文/蒙蒙 一巾腕、第九天 我趴在偏房一處隱蔽的房頂上張望面睛。 院中可真熱鬧,春花似錦尊搬、人聲如沸叁鉴。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,357評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽幌墓。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間常侣,已是汗流浹背蜡饵。 一陣腳步聲響...
    開封第一講書人閱讀 31,590評論 1 261
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留袭祟,地道東北人验残。 一個月前我還...
    沈念sama閱讀 45,636評論 2 355
  • 正文 我出身青樓,卻偏偏與公主長得像巾乳,于是被迫代替她去往敵國和親您没。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,925評論 2 344

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