本篇文章是經(jīng)過多篇博文參考和學習下記錄的,僅供參考學習用,如有侵權或異議有决,請聯(lián)系我修改。
一空盼、App啟動速度優(yōu)化
1.1 Google 加速方案
- 利用提前展示出來的Window书幕,快速展示出來一個界面,給用戶快速反饋的體驗揽趾;
- 避免在啟動時做密集沉重的初始化(Heavy app initialization)台汇;
- 定位問題:避免I/O操作、反序列化篱瞎、網(wǎng)絡操作苟呐、布局嵌套等。
1.2 通用加速方案:
- 利用主題快速顯示界面俐筋;
- 異步初始化組件牵素;
- 梳理業(yè)務邏輯,延遲初始化組件澄者、操作笆呆;
- 正確使用線程;
- 去掉無用代碼粱挡、重復邏輯等
1.3 啟動方式:
- 冷啟動
當啟動應用時赠幕,后臺沒有該應用的進程(常見如:進程被殺抱怔、首次啟動等)劣坊,這時系統(tǒng)會重新創(chuàng)建一個新的進程分配給該應用
- 暖啟動
當啟動應用時嘀倒,后臺已有該應用的進程(常見如:按back鍵、home鍵,應用雖然會退出,但是該應用的進程是依然會保留在后臺味混,可進入任務列表查看)蔓挖,所以在已有進程的情況下,這種啟動會從已有的進程中來啟動應用
- 熱啟動
相比暖啟動减细,熱啟動時應用做的工作更少,啟動時間更短怎憋。熱啟動產(chǎn)生的場景很多,常見如:用戶使用返回鍵退出應用皂岔,然后馬上又重新啟動應用
熱啟動和暖啟動因為會從已有的進程中來啟動,不會再創(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以后可能會導致白屏,但實際完整的apk包不會出現(xiàn)此問題冷啟動引起的白屏/黑屏
點擊你app那一刻到系統(tǒng)調(diào)用Activity.onCreate()之間的時間段辫诅。在這個時間段內(nèi)凭戴,WindowManager會先加載app主題樣式中的windowBackground作為app的預覽元素,然后再真正去加載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的樹形結構盡量扁平(使用Hierarchy Viewer可以方便的查看)困后,同時移除所有不需要渲染的view乐纸;
- 使用GPU配置渲染工具,定位出問題發(fā)生在具體哪個步驟摇予,使用TraceView精準定位代碼汽绢;
- 使用標簽,Merge減少嵌套層次侧戴、ViewStub延遲初始化庶喜。
相關工具:
(1)、打開Show GPU Overrdraw的選項:設置 -> 開發(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 檢測應用在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
- 當界面不可見時釋放內(nèi)存
- 當內(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)存泄漏
- 資源未關閉造成的內(nèi)存泄漏
- 使用了靜態(tài)的Activity和View
- 注冊了系統(tǒng)的服務斥扛,但onDestory未注銷
- 不需要用的監(jiān)聽未移除會發(fā)生內(nèi)存泄露
四、APK瘦身
4.1 通用方案
- 利用ProGuard壓縮代碼去除無用資源丹锹;
- andresguard進一步壓縮與混淆資源稀颁;
- 第三方開源庫的瘦身,僅保留自己需要的部分楣黍;
- 極致的圖片壓縮與webp的使用匾灶;
- 合理配置去除不必要的配置,僅保留中文配置等...
- so的優(yōu)化與配置租漂,只保留一類so阶女;
- 動態(tài)下發(fā)一些資源:字庫颊糜、so、換膚包等秃踩。
檢測應用情況工具:https://nimbledroid.com/
博客:1.http://www.reibang.com/p/8f14679809b3# 2.http://t.cn/RGjNpam
Android性能全分析博客:https://mp.weixin.qq.com/s/QVOYF2nfoWMCbM5YsxQgRQ