對(duì)于Andorid的啟動(dòng)優(yōu)化,最知名的應(yīng)該屬Google 在2020年推出的JetPack中的StartUp记罚,拜讀源碼后阐虚,發(fā)現(xiàn)Google大佬們,主要是做了兩個(gè)方向的優(yōu)化:
初始化前置
-
通過一個(gè)ContentProvider統(tǒng)一管理
StartUp框架.png
翻閱了一些資料规求,包括但不限于阿里早年的Alpha、AndroidStartUp等卵惦,發(fā)現(xiàn)Google的StartUp可以有幾個(gè)優(yōu)化的地方阻肿,基于“實(shí)踐出真理”,就著手畫一畫沮尿、寫一寫丛塌。如果有考慮不周全或是設(shè)計(jì)錯(cuò)誤的地方,望指出畜疾,共同進(jìn)步赴邻。
一、首先解決任務(wù)執(zhí)行順序的問題
1645067648000.jpg
如上圖啡捶,部分任務(wù)存在依賴關(guān)系(先不考慮線程的問題姥敛,第二步再來(lái)處理線程的問題)。
A和H可以同時(shí)執(zhí)行
B和E需要等A執(zhí)行完后瞎暑,才能執(zhí)行...以此類推彤敛,最后執(zhí)行G。
解決方案:拓?fù)渑判?/strong>
二了赌、再來(lái)解決線程問題
Task執(zhí)行有兩種可能
在主線程執(zhí)行
在子線程執(zhí)行
1臊泌、需要在主線程執(zhí)行的Task,放入一個(gè)只存放必須要主線程執(zhí)行的隊(duì)列
2揍拆、子線程Task放入一個(gè)線程池
WX20220217-114019.png
測(cè)試
public class ATask extends Task {
@Override
public void run() {
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("初始化 AAAAA渠概,Thread = " + Thread.currentThread());
}
@Override
protected List<Class<? extends Task>> dependencies() {
return null;
}
@Override
public boolean isMustInMainThread() {
return true;
}
}
public class BTask extends Task {
@Override
public void run() {
try {
Thread.sleep(200);
} catch (InterruptedException e) {
e.printStackTrace();
}
System.out.println("初始化 BBBBB,Thread = " + Thread.currentThread());
}
@Override
protected List<Class<? extends Task>> dependencies() {
List list = new ArrayList();
list.add(ATask.class);
return list;
}
@Override
public boolean isMustInMainThread() {
return false;
}
}
測(cè)試結(jié)果
WX20220218-144139@2x.png
后續(xù)
-
架構(gòu)待優(yōu)化的地方
排序的算法優(yōu)化
數(shù)據(jù)結(jié)構(gòu)的選擇
參考: