随着项目越来越大,项目中使用的一些组件和一些第三方的SDK越来越多,大多数的SDK和组件都需要在Application中进行注册和初始化,这一系列的注册和初始化将Application.onCreate方法执行时间变的很长,给用户的体验就是点了APP图标后白屏或者黑屏好久才能进入应用,造成了很不好的体验。
对于我们APP的启动来说分为热启动和冷启动,这里我们只针对冷启动进行优化,因为如果冷启动优化的好,热启动也同样会被优化。
耗时检测
做优化之前我们要对我们的各个方法进行耗时检测,确定下具体的耗时的任务是哪一些,才能做对应的优化。关于耗时检测有一些手段:
检测整个APP的启动速度
我们可以通过adb shell am start -W [packageName]/[packageName.XxxActivity]
这个命令来进行APP的某个页面启动速度进行检测,执行这个命令后会获取到启动所需要的时间,我们可以记录下这些时间然后在整体优化后进行对比,得出优化的效果。
TraceView
我们可以通过以下代码来设置
Debug.startMethodTracing()
...
Debug.startMethodTracing()
来进行检测,然后通过Android Studio Profiler来进行查看,在Android Studio中我们可以看到每个方法的耗时。
启动优化
主题优化
我们可以将WindowBackground设置成闪屏图片。
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/lunch</item> //闪屏页图片
<item name="android:windowFullscreen">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item><!--显示虚拟按键,并腾出空间-->
</style>
通过以上设置我们在启动的时候白屏问题得以解决,但是速度还是没能加快。
耗时优化
针对这一块我们通常采用的是延迟初始化或者在子线程中初始化。
-
延迟初始化
针对于一些必须要在主线程中初始化但是又不是特别紧急的任务我们可以延后初始化,针对于这个我们可以将它丢到IdealHandler里面,这样当我们空闲的时候就会去初始化这些任务。 -
子线程中初始化
一些不影响后续使用的任务我们可以放到子线程中进行初始化,如果任务多的话,我们可以启用多线程来进行处理,如果这些任务之间有依赖关系的话我们可以使用一些开源库解决这个任务依赖问题,例如阿里的alpha,可以方便的对多任务依赖进行处理。如果不想用这个库也可以使用并发包里面的CountDownLatch这个也是一个很好用的工具类。
Activity的启动
这一块主要就是布局的优化,尽量的简化布局,减少布局层级嵌套。另外对于一些不会立刻显示的布局我们可以使用ViewStub来进行加载。
另外就是不要在生命周期中执行耗时的一些方法和操作。