SmartStart
Android 智能启动框架
框架特性:
1、支持依赖关系
2、多样化任务:可选择延时任务、IO 任务
1)支持延时加载:ApplicationTask 会在 Application.onCreate()结束前执行完,DelayTask 可以配置延后执行。
2)支持区分 io 任务和 cpu 任务
3、智能多线程异步:根据 CPU 核数控制线程池大小
线程池过大,会增加多线程的切换时间;线程池过小,则不能充分利用 CPU,SmartStart 的实现机制:
1)Application 任务执行时,会根据建立一个 cpu 线程池(限制 cpu 核数个线程)和一个的 io 线程池(无限制)
2)Delay 任务执行时,会建立一个共用线程池(限制 cpu 核数 -2 个线程)
4、自学习优先级能力:根据上一次启动的任务链耗时,计算本次启动每个任务的优先级
1)原理介绍:App 的启动任务拆解后,任务之间的依赖关系构成一个依赖图,最长的耗时路径可能决定着 App 的启动耗时。当线程池执行完一个任务后,如果有 n 个无依赖的任务需要被执行,一旦我们没有选择那个最高优先级的任务去执行,就一定会拉长最长耗时路径的执行总时间,那么 App 的启动时长就会增加,所以我们的关键问题是,如何对任务设置优先级。SmartStart 的核心思想是通过构建上一次启动的依赖图,将以本任务为起点的最长耗时路径作为此任务下次启动的优先级。具体算法请阅读代码。
2)模拟启动:首先构建一个启动依赖图,并隐藏一条最长依赖链:01 - 04 - 21 - 23 - Article_Application_1 -51 - 71 - 91 - a2 - b5 - d1 - i2 - j1
首次启动图:(没有无法根据上一次启动计算优先级)
第二次启动图:(根据上一次启动过计算优先级)
我们发现,当有优先级规则时,01 的启动将根据优先级提前,充分利用了 cpu,将启动时长从 3.8s 优化到 2.6s
框架接入:
1、增加依赖:
compile 'com.elvis.android:smart_start:1.0.1'
1、实现一个启动接口:
public static IModuleStart lockScreenModuleStart = new IModuleStart() {
@Override
public void buildTasks(ArrayList<AbsTask> tasks) {
tasks.add(new ApplicationCPUTask(StartConstant.LockScreen_ApplicationTask_1)
.setExecutor(new AbsTask.Executor() {
@Override
public void execute() {
Test.doJob(200);
}
})
);
tasks.add(new DelayCPUTask(StartConstant.LockScreen_DelayTask_1)
.setExecutor(new AbsTask.Executor() {
@Override
public void execute() {
Test.doJob(200);
}
})
);
tasks.add(new DelayCPUTask(StartConstant.LockScreen_DelayTask_2)
.addDepend(StartConstant.LockScreen_DelayTask_1)
.addDepend(StartConstant.Article_ApplicationTask_2)
.addDepend(StartConstant.Article_DelayTask_2)
.setExecutor(new AbsTask.Executor() {
@Override
public void execute() {
Test.doJob(100);
Test.doSleep(500);
Test.doJob(100);
}
})
);
}
};
2、在 Application 的相关位置调用 SmartStart 接口:
public class MyApplication extends Application {
private static Handler mainHandler = new Handler(Looper.getMainLooper());
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
// 初始化启动器
SmartStart.setContext(base);
// 设置默认优先级
SmartStart.getDefaultPriorities("{}");
// 构建启动器
SmartStart.addModuleStart(LockScreenManager.lockScreenModuleStart);
SmartStart.addModuleStart(ArticleManager.articleModuleStart);
...
// 开始执行 ApplicationTasks
SmartStart.startApplicationTasks();
}
@Override
public void onCreate() {
super.onCreate();
// 等待 ApplicationTasks 执行结束
SmartStart.waitUntilApplicationTasksFinish();
// 5s 后开始执行 DelayTasks
mainHandler.postDelayed(new Runnable() {
@Override
public void run() {
SmartStart.startDelayTasks();
}
},5000);
}
}