SmartStart

Introduction: Android 智能启动框架
More: Author   ReportBugs   
Tags:

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

首次启动图:(没有无法根据上一次启动计算优先级)

Aaron Swartz

第二次启动图:(根据上一次启动过计算优先级)

Aaron Swartz

我们发现,当有优先级规则时,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);
    }
}
Apps
About Me
GitHub: Trinea
Facebook: Dev Tools