StartUp 轻量级_启动框架

对于Andorid的启动优化,最知名的应该属Google 在2020年推出的JetPack中的StartUp,拜读源码后,发现Google大佬们,主要是做了两个方向的优化:

  1. 初始化前置

  2. 通过一个ContentProvider统一管理


    StartUp框架.png

翻阅了一些资料,包括但不限于阿里早年的Alpha、AndroidStartUp等,发现Google的StartUp可以有几个优化的地方,基于“实践出真理”,就着手画一画、写一写。如果有考虑不周全或是设计错误的地方,望指出,共同进步。

一、首先解决任务执行顺序的问题

1645067648000.jpg

如上图,部分任务存在依赖关系(先不考虑线程的问题,第二步再来处理线程的问题)。

  1. A和H可以同时执行

  2. B和E需要等A执行完后,才能执行...以此类推,最后执行G。

解决方案:拓扑排序

二、再来解决线程问题

Task执行有两种可能

  • 在主线程执行

  • 在子线程执行

1、需要在主线程执行的Task,放入一个只存放必须要主线程执行的队列
2、子线程Task放入一个线程池
WX20220217-114019.png
测试
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;
    }
}

测试结果

WX20220218-144139@2x.png

后续

  • 架构待优化的地方

    • 排序的算法优化

    • 数据结构的选择

参考:

https://github.com/alibaba/alpha

https://github.com/idisfkj/android-startup

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容