本篇文章是經(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 通用方案
- 節(jié)制地使用Service
- 當(dāng)界面不可見時釋放內(nèi)存
- 當(dāng)內(nèi)存緊張時釋放內(nèi)存
- 避免在Bitmap上浪費內(nèi)存
- 使用優(yōu)化過的數(shù)據(jù)集合
- 使用ProGuard簡化代碼
- 利用工具檢測內(nèi)存泄漏(https://developer.android.google.cn/studio/preview/features/android-profiler.html#advanced-profiling)
博客: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)存泄露
四、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