目錄
- 一盯漂、啟動(dòng)優(yōu)化的意義
- 二集乔、啟動(dòng)時(shí)間檢測(cè)
- 三淳衙、啟動(dòng)優(yōu)化工具---traceview
- 四、優(yōu)化方案
- 1.異步初始化
- 2.延遲初始化
- 3.懶加載
- 五饺著、源碼地址
- 六、總結(jié)
一肠牲、啟動(dòng)優(yōu)化的意義
用戶(hù)新安裝一個(gè)app幼衰,第一印象很重要,那首先給用戶(hù)感受的就是啟動(dòng)時(shí)間缀雳,如果用戶(hù)等待時(shí)間過(guò)長(zhǎng)渡嚣,就體驗(yàn)很差,如果我們能在滿(mǎn)足功能的基礎(chǔ)上肥印,把啟動(dòng)時(shí)間提升一個(gè)等級(jí)识椰,無(wú)疑給我們的產(chǎn)品贏得更多的用戶(hù)量打下來(lái)基礎(chǔ)。
二深碱、啟動(dòng)時(shí)間檢測(cè)
//添加監(jiān)聽(tīng)
mView.getViewTreeObserver().addOnPreDrawListener(new ViewTreeObserver.OnPreDrawListener() {
@Override
public boolean onPreDraw() {//UI開(kāi)始展示的回調(diào)
//移除監(jiān)聽(tīng)
mView.getViewTreeObserver().removeOnPreDrawListener(this);
LogHelper.i("FeedShow");
LaunchTimer.endRecord();
return true;
}
});
三腹鹉、啟動(dòng)優(yōu)化工具---traceview
通過(guò)優(yōu)化工具可以幫助我們快速定位造成app卡頓的原因,優(yōu)化工具可以選擇traceview敷硅,使用方式可以參考:
https://blog.csdn.net/m0_64319298/article/details/121707331
另外也可以使用另外一個(gè)工具android studio自帶的cpu profile功咒,這兩個(gè)工具使用比較相似,但也有一些區(qū)別绞蹦,traceview運(yùn)行時(shí)開(kāi)銷(xiāo)嚴(yán)重力奋,整體都會(huì)變慢,可能會(huì)帶偏優(yōu)化方向幽七,但是可以埋點(diǎn)
cpu profile可以檢測(cè)運(yùn)行時(shí)性能景殷,對(duì)于檢測(cè)啟動(dòng)性能則不太適合,各有優(yōu)缺點(diǎn)分場(chǎng)景使用澡屡。
四猿挚、優(yōu)化方案
這里核心思想是講初始化任務(wù)分為三個(gè)優(yōu)先級(jí)逐步執(zhí)行,優(yōu)先級(jí)最高的是必須在進(jìn)入app之前就要初始化完成挪蹭,可以通過(guò)異步初始化去實(shí)現(xiàn)亭饵,具體實(shí)現(xiàn)方式如下:
(1)異步初始化
/**
* 異步的Task
*/
public class InitStethoTask extends Task {
@Override
public void run() {
Handler handler = new Handler(Looper.getMainLooper());
Stetho.initializeWithDefaults(mContext);
}
}
TaskDispatcher dispatcher = TaskDispatcher.createInstance*();
dispatcher.addTask(new InitStethoTask())
.start();
通過(guò)集成Task然后在run方法里面執(zhí)行任務(wù)就可以了。
(2)延遲初始化
如果任務(wù)優(yōu)先級(jí)沒(méi)那么高梁厉,可以通過(guò)延遲初始化去執(zhí)行辜羊,它的核心原理是通過(guò) IdleHandler 機(jī)制去實(shí)現(xiàn)空閑時(shí)間加載任務(wù)踏兜。具體實(shí)現(xiàn)方式如下:
public class DelayInitTaskA extends MainTask {
@Override
public void run() {
// 模擬一些操作
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
Log.i("DelayInitTaskA finished", "");
}
}
DelayInitDispatcher delayInitDispatcher = new DelayInitDispatcher();
delayInitDispatcher.addTask(new DelayInitTaskA())
.start();
(3)懶加載
對(duì)于暫時(shí)不回用到的庫(kù),可以先不初始化八秃,等到要用的時(shí)候再去初始化碱妆,實(shí)現(xiàn)懶加載的目的。
五昔驱、源碼地址
感興趣的小伙伴可以下載源碼研究一下任務(wù)調(diào)度器的設(shè)計(jì)思路疹尾,地址如下:
https://github.com/VincentStory/TaskDispatcher
六、總結(jié)
我們一般項(xiàng)目常規(guī)的初始化都是通過(guò)同步線程逐個(gè)執(zhí)行骤肛,或者個(gè)別耗時(shí)的開(kāi)啟一個(gè)子線程去執(zhí)行纳本,先不說(shuō)效率會(huì)比較拖沓,在application的代碼整潔度上面也不夠美觀腋颠,特別是任務(wù)比較多的時(shí)候繁成,一個(gè)類(lèi)會(huì)顯得比較臃腫,引入這個(gè)庫(kù)就可以解決這些問(wèn)題淑玫,讓任務(wù)變得清晰并且執(zhí)行效率高巾腕。