Android开发Android开发Android开发经验谈

Android启动优化最佳方案:去启动页和异步初始化

2019-04-25  本文已影响39人  smartzheng

随着APP的日渐增大,集成的三方库也越来越多,导致APP的启动极其缓慢。最近在慕课get了一些不错的优化方案,将原来的冷启动从3s左右提升到了1s左右。
启动的时间监测可以直接用adb命令实现:

adb shell am start -W PackageName/ActivityName

下面是我未优化之前的项目debug版本启动时间(华为p10plus),这里介绍一下几个概念
ThisTime:最后一个Activity启动耗时
TotalTime:所有Activity启动耗时
WaitTimeTime:AMS启动Activity启动耗时
可以看到耗时接近4s,release版本会快些,但是总体在3s左右。

adb监测启动耗时.png

优化一:去掉启动页
IPC是个比较耗时的操作,往往我们会设置一个闪屏页,去掉之后可以一定幅度减少启动时间。
我的做法是直接删除SplashActivity,将MainActivity设为启动页。然后在manifests中将其theme设为启动时的theme:

MainActivity.png
SplashTheme中windowBackground为启动图片,这样设置还有一个好处是可以解决掉APP启动白屏的问题。 SplashTheme.png

最后,在MainActivity的onCreate方法中,手动setTheme更改为Application的默认Theme:

setTheme.png

优化二:异步初始化
优化之前,我的Application的onCreate是这样的:

onCreate.png

每一项初始化任务都是同步执行的。优化的思想就是将各个初始化任务放到一个线程池中去执行。优化之后代码如下:

启动器init.png

将各个初始化任务放到线程池执行需要解决很多问题:
部分初始化工作只能在主线程执行
部分初始化任务需要先执行
部分初始化任务需要依赖其他任务执行完之后才可以执行
部分任务必须执行完才能进入Activity页面
最后参考慕课一位老师的课程,并将代码放到jitpack,可以直接使用。使用方法如下:
1.添加仓库

allprojects {
    repositories {
        ...
        maven { url 'https://jitpack.io' }
    }
}
  1. 添加依赖

     dependencies {
         implementation 'com.github.smartzheng:asyncstarter:1.0.1'
     }
    

3.自定义Task

class InitTask : Task() {
    override fun needWait(): Boolean {//是否需要在阻塞在await(),在Application的onCreate方法之前执行完
    return true
    }

    override fun dependsOn(): MutableList<Class<out Task>> {//等待另一个Task执行完再执行此任务初始化
        return mutableListOf(InitTask1::class.java)
    }
    override fun runOnMainThread(): Boolean {//是否需要运行在主线程
        return true
    }
    override fun needRunAsSoon(): Boolean {//提高优先级,也可以指定优先级大小priority
        return true
    }
    override fun run() {
        //初始化
    }
}

4.在Application中

class MyApplication : Application() {
    override fun onCreate() {
        super.onCreate()
        AsyncStarter.init(this)
        val starter = AsyncStarter.createInstance()

        starter.addTask(InitTask1())
            .addTask(InitTask2())
            .addTask(InitTask3())
            //addTask()...
        starter.start()
        starter.await()
        //AsyncStarter.createInstance()
        //            .run {
        //                addTask(InitTask1())
        //                    .addTask(InitTask2())
        //                    .addTask(InitTask3())
        //                    //addTask()...
        //                    .start()
        //                await()
        //            }
    }
}

详细的配置解释和实例可以查看GitHub源码,其中有详细注释:https://github.com/smartzheng/asyncstarter

上一篇下一篇

猜你喜欢

热点阅读