Android性能優(yōu)化大集結(jié)

本篇文章是經(jīng)過多篇博文參考和學(xué)習(xí)下記錄的,僅供參考學(xué)習(xí)用,如有侵權(quán)或異議,請聯(lián)系我修改。

一、App啟動速度優(yōu)化

1.1 Google 加速方案

  • 利用提前展示出來的Window,快速展示出來一個界面,給用戶快速反饋的體驗;
  • 避免在啟動時做密集沉重的初始化(Heavy app initialization);
  • 定位問題:避免I/O操作、反序列化、網(wǎng)絡(luò)操作、布局嵌套等。

1.2 通用加速方案:

  • 利用主題快速顯示界面;
  • 異步初始化組件;
  • 梳理業(yè)務(wù)邏輯,延遲初始化組件、操作;
  • 正確使用線程;
  • 去掉無用代碼、重復(fù)邏輯等

1.3 啟動方式:

  • 冷啟動

當(dāng)啟動應(yīng)用時,后臺沒有該應(yīng)用的進程(常見如:進程被殺、首次啟動等),這時系統(tǒng)會重新創(chuàng)建一個新的進程分配給該應(yīng)用

  • 暖啟動

當(dāng)啟動應(yīng)用時,后臺已有該應(yīng)用的進程(常見如:按back鍵、home鍵,應(yīng)用雖然會退出,但是該應(yīng)用的進程是依然會保留在后臺,可進入任務(wù)列表查看),所以在已有進程的情況下,這種啟動會從已有的進程中來啟動應(yīng)用

  • 熱啟動

相比暖啟動,熱啟動時應(yīng)用做的工作更少,啟動時間更短。熱啟動產(chǎn)生的場景很多,常見如:用戶使用返回鍵退出應(yīng)用,然后馬上又重新啟動應(yīng)用

熱啟動和暖啟動因為會從已有的進程中來啟動,不會再創(chuàng)建和初始化Application

平時我們討論中基本都會將暖啟動和熱啟動合在一起統(tǒng)稱為熱啟動,因為暖啟動與熱啟動差異很小,如果不是特別留意啟動流程,那么在用戶體驗和感官上沒有直接差異,但是在framework層執(zhí)行時是有一定差異的。本次優(yōu)化點也是圍繞冷啟動和熱啟動來做,將暖啟動與熱啟動統(tǒng)稱為熱啟動
另外有一點,從絕對時間上來看,app安裝后的首次啟動將會最耗時,因為首次啟動會新建數(shù)據(jù)庫,sp文件,各種緩存,配置等

白屏/黑屏問題

  • 白屏或黑屏,具體是哪一個,取決于app的Theme使用的是dark還是light主題

  • Android Studio 引起的白屏
    2.x時代的AS開啟了instant run以后可能會導(dǎo)致白屏,但實際完整的apk包不會出現(xiàn)此問題

  • 冷啟動引起的白屏/黑屏

點擊你app那一刻到系統(tǒng)調(diào)用Activity.onCreate()之間的時間段。在這個時間段內(nèi),WindowManager會先加載app主題樣式中的windowBackground作為app的預(yù)覽元素,然后再真正去加載activity的layout布局

  • 暖啟動/熱啟動引起的白屏/黑屏

這點在配置較好,內(nèi)存空間充足的手機上不是很明顯,但低端手機或者內(nèi)存吃緊的情況下依舊會出現(xiàn)”閃屏”效果,持續(xù)時間很短,一閃而過。

博客地址:https://github.com/DanluTeam

二、布局優(yōu)化方案

2.1 通用布局優(yōu)化方案

  • 調(diào)試GPU過度繪制,將Overdraw降低到合理范圍內(nèi);
  • 減少嵌套層次及控件個數(shù),保持view的樹形結(jié)構(gòu)盡量扁平(使用Hierarchy Viewer可以方便的查看),同時移除所有不需要渲染的view;
  • 使用GPU配置渲染工具,定位出問題發(fā)生在具體哪個步驟,使用TraceView精準定位代碼;
  • 使用標(biāo)簽,Merge減少嵌套層次、ViewStub延遲初始化。

相關(guān)工具:

(1)、打開Show GPU Overrdraw的選項:設(shè)置 -> 開發(fā)者選項 -> 調(diào)試GPU過度繪制 -> 顯示GPU過度繪制;

(2)、Hierarchy Viewer

博客:http://blog.csdn.net/lmj623565791/article/details/45556391/

http://www.trinea.cn/android/layout-performance/

2.2 檢測應(yīng)用在UI線程的卡頓

  • 利用UI線程Looper打印的日志;
  • 利用Choreographer。

開源地址

https://github.com/markzhai/AndroidPerformanceMonitor[方式1]

https://github.com/wasabeef/Takt[方式2]

https://github.com/friendlyrobotnyc/TinyDancer [方式2]

三、內(nèi)存優(yōu)化方案

3.1 通用方案

博客:http://blog.csdn.net/guolin_blog/article/details/42238627

3.2 Android開發(fā)常見的內(nèi)存泄漏

  • 單例造成的內(nèi)存泄漏
  • 非靜態(tài)內(nèi)部類創(chuàng)建靜態(tài)實例造成的內(nèi)存泄漏
  • Handler造成的內(nèi)存泄漏
  • 線程造成的內(nèi)存泄漏
  • 資源未關(guān)閉造成的內(nèi)存泄漏
  • 使用了靜態(tài)的Activity和View
  • 注冊了系統(tǒng)的服務(wù),但onDestory未注銷
  • 不需要用的監(jiān)聽未移除會發(fā)生內(nèi)存泄露

博客:https://mp.weixin.qq.com/s?__biz=MzAxMTI4MTkwNQ==&mid=2650822597&idx=1&sn=462b116f97623f239ecf667d3bdef446&chksm=80b7835bb7c00a4d4cbc9f7e19829d9a99f3cf58c1bc43dace16ffec58c98668927c9fa8dcda&scene=21#wechat_redirect

四、APK瘦身

4.1 通用方案

  • 利用ProGuard壓縮代碼去除無用資源;
  • andresguard進一步壓縮與混淆資源;
  • 第三方開源庫的瘦身,僅保留自己需要的部分;
  • 極致的圖片壓縮與webp的使用;
  • 合理配置去除不必要的配置,僅保留中文配置等...
  • so的優(yōu)化與配置,只保留一類so;
  • 動態(tài)下發(fā)一些資源:字庫、so、換膚包等。

檢測應(yīng)用情況工具:https://nimbledroid.com/

博客:1.http://www.itdecent.cn/p/8f14679809b3# 2.http://t.cn/RGjNpam

Android性能全分析博客:https://mp.weixin.qq.com/s/QVOYF2nfoWMCbM5YsxQgRQ

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容