美文网首页Android技术知识Android开发Android开发经验谈
是什么拖慢了你的 App 启动?干掉它!

是什么拖慢了你的 App 启动?干掉它!

作者: Android开发架构 | 来源:发表于2019-01-15 17:35 被阅读23次

你的应用,启动够快吗?

App 启动时,我们通常会执行很多既定的任务,比如各种 SDK 的初始化、各种数据的初始化等。这必将拖慢 App 的启动速度。

启动速度,一直在我们的 App 优化清单上,而在 11 月举办的 Android 绿色联盟开发者大会上,推出了应用体验标准。对应用的兼容性、稳定性、性能、功能和安全,都做了详细的定义。

其中启动速度做了更细致的要求,冷启动 < 1s,热启动 < 0.5s。这当然是最理想的情况,具体还有外部因素的影响,例如手机配置。

启动时初始化的代码,势必会拖慢 App 的启动速度,但是不等待这些任务初始化完成呢,可能又会造成功能的缺失,而有时候不同任务还存在时序依赖的关系,要求我们先执行 A 任务,再执行 B 任务。

每次都特殊处理会增加复杂度,我们需要一套通用的解决方案。

这里给大家推荐一个 Alibaba 在 Github 上开源的一个 Alpha 的库。它是一个基于 PERT 图构建的 Android 异步启动框架。

Alibaba Alpha

PERT 图又称为“计划评审技术”,它采用网络图来描述一个项目的任务网络。不仅可以表达任务与任务之间的关系,不同的任务之间还可以有各种子任务。

Alpha 就是基于 PERT 图设计思想,它简单、高效、功能完整。利用 Alpha 在应用启动的时候,让这些任务并发处理,从而达到提高启动速度的目的。并且可以保证他们执行顺序的正确性。

Alpha 在使用时,只需要定义好自己的 Task,并描述它依赖的 Task,再将他们添加到 Project 中。框架会自动并发有序地执行这些 Task,最后将执行结果抛出来。

为了支持 Android 应用的多进程,Alpha 支持为不同进程配置不同的启动模式。

Alpha 的接入非常简单,它支持 Java 代码和配置文件两种方式来构建一个启动流程。

接入 Alpha

Gradle 依赖

compile 'com.alibaba.android:alpha:1.0.0.1@jar'

使用 Gradle 可能会导致失败,这里可以考虑通过源码引入的方式。

使用指南

1. 实现自己的 Task 类

在 Alpha 中,任务都是一个个 Task。定义一个 Task,并在 run() 方法中实现该 Task 需要做的事情。

public class SampleTask extends Task{    public SampleTask() {        super("SampleTask");    }    @Override    public void run() {        //do something, print a msg for example.        Log.d(TAG, "run SampleTask");    }}

Task 默认是通过异步的方式在子线程中执行,如果这个 Task 需要在主线程中执行,可以在构造函数中指定。

    /**     * 构造{@code Task}对象。     *     * @param name {@code Task}名字     * @param isInUiThread 是否在UI线程执行,true表示在UI线程执行,false表示在非UI线程执行,默认在非UI线程执行。     *                     <strong>注意:如果在UI线程执行,则不能再使用{@link AlphaManager#waitUntilFinish()},否则会造成死锁。</strong>     */    public Task(String name, boolean isInUiThread) {        mName = name;        mIsInUiThread = isInUiThread;    }

2. 将 Task 组合成一个完整的 Project

可以用 Task.ProjectBuilder 依据各 Task 之间的依赖关系,将这些 Task 构建成一个完整的 Project。

private Task createCommonTaskGroup() {    Task a = new TaskA();    Task b = new TaskB();    Task c = new TaskC();    Task d = new TaskD();    Task e = new TaskE();    Project.Builder builder = new Project.Builder();    builder.add(a);    builder.add(b).after(a);    builder.add(c).after(a);    builder.add(d).after(b, c);    builder.add(e).after(a);    Project group = builder.create();    return group;}

ProjectBuilder 生成的 Project 本身又可以作为一个 Task 嵌入到另一个 Project 中。

private Task createCommonTaskGroup() {    Task a = new TaskA();    Task b = new TaskB();    Task c = new TaskC();    Task d = new TaskD();    Task e = new TaskE();    Project.Builder builder = new Project.Builder();    builder.add(a);    builder.add(b).after(a);    builder.add(c).after(a);    builder.add(d).after(b, c);    builder.add(e).after(a);    Project group = builder.create();    return group;}private void createProject() {    Task group = createCommonTaskGroup();    Task f = new TaskF();    Project.Builder builder = new Project.Builder();    builder.add(group);    builder.add(f);    Project project = builder.create();}

3. 监听 Task 执行结束

可以通过 addOnTaskFinishListener() 监听 Task 的执行结束。

    /**     * <p>增加{@code Task}执行结束的监听,当该{@code Task}执行结束时,会回调     * {@link Task.OnTaskFinishListener#onTaskFinish(String)}。</p>     * <strong>注意:</strong>回调函数在{@code Task}所在线程中回调,注意线程安全。     *     * @param listener 监听{@code Task}执行结束的{@code listener}     */    public void addOnTaskFinishListener(OnTaskFinishListener listener) {        if (!mTaskFinishListeners.contains(listener)) {            mTaskFinishListeners.add(listener);        }    }

4. 为构建完成的 Project 配置对应的进程

通过 addProject(),将 Project 配置到对应的进程中。

AlphaManager.getInstance(mContext)            .addProject(project);

5. 执行启动流程

最后只需要调用一句 start() 方法,就可以执行这个完整的流程了。

AlphaManager.getInstance(mContext)            .start();

Alpha 还提供了配置文件的方式来配置 Task 的关系,但是我不准备再详细介绍了,反正我不会这么用,有兴趣还是去查询 README 文件吧。

小结

利用 Alpha 我们可以有效的管理启动时初始化的一些任务,从而达到优化启动速度的目的。

Alpha 是 Alibaba 开源的,现在我还不确定用在了那些阿里系的商业项目上,不过从源码的角度来看,没有大坑,而且各自文档也很齐全,如果有这方面的需求,可以尝试使用。

当然也可以学习一下性能优化的相关知识

免费获取Kotlin资料和更多安卓开发架构的资料(包括Fultter、高级UI、性能优化、架构师课程、 NDK、混合式开发(ReactNative+Weex)和一线互联网公司关于android面试的题目汇总可以加:936332305 / 链接:点击链接加入【安卓开发架构】:https://jq.qq.com/?_wv=1027&k=515xp64

相关文章

  • 是什么拖慢了你的 App 启动?干掉它!

    你的应用,启动够快吗? App 启动时,我们通常会执行很多既定的任务,比如各种 SDK 的初始化、各种数据的初始化...

  • iOS 启动优化(二)二进制重排

    App启动分析 App启动分为 冷启动 和 热启动 冷启动:点击 App 启动前,它的进程不在系统里,需要系统新创...

  • App 启动速度怎么做优化与监控?

    App的启动分类 一般情况下,App 的启动分为冷启动和热启动。 冷启动是指, App 点击启动前,它的进程不在系...

  • 启动快又省电?向你的APP启动广告说再见吧!

    相信大家在日常生活中打开某个app时都会遇到下面这种情况。 这些启动页广告会拖慢APP的启动速度、增加耗电量,如果...

  • 干掉它

    紧急通知:各地有毒小龙虾警告❗ 又到吃小龙虾季节。友情提示:如果你购买到大量鲜活龙虾,或煮或炒后,发现龙虾全身通红...

  • iOS app启动速度优化总结

    App 启动时 一般app分为冷启动和热启动 冷启动: app点击启动前,它的进程不在系统里,需要系统新创建一个进...

  • 干掉懒怂拖

    李笑来肯定在我家装了监视器,不然《把时间当作朋友》为什么开篇说的就是我的日常。如果说时间是一位朋友,那我一定疏远了...

  • 干掉懒怂拖

    剽悍行动营,各位优秀的老铁,大家现在好! 我是来自六连5排的可晗。今天我来说一说我参加行动营的感受。本来前天演讲报...

  • 《快速阅读》QAS读书笔记

    Q、《快速阅读》的精华内容。 A1、首先,你会了解到,到底是什么拖慢了你的阅读速度。 所谓的快速阅读,并不仅仅只是...

  • 关于App启动速度优化

    冷启动、热启动 冷启动:App启动前,它的进程不在系统里,系统新创建一个进程分配给它启动;热启动:App冷启动后,...

网友评论

    本文标题:是什么拖慢了你的 App 启动?干掉它!

    本文链接:https://www.haomeiwen.com/subject/uogydqtx.html