Android app启动速度优化,首先谈谈为什么会走到优化这一步,如果一开始创建app项目的时候就把这个启动速度考虑进去,那么肯定就不需要重新再来优化一遍了。这是因为在移动互联网时代,大家都追求快,什么功能都是先做出来再说,其他的可以先不考虑,先占据先机,或者验证是否值得做。那为什么要这么做呢?我个人的观点有以下几点
·如果app不能快速开发出来,先放出去验证一下可行性,可能连是否值得做都不知道,如果花很长时间做了一个对用户无价值的功能,那么还不如不做
·如果app不能快速做出来,可能被竞争对手捕获先机,那么可能错失最佳商业时机
·如果一开始就规定不能影响启动速度的这个目标,那么做功能的时候就会有束缚,快不起来
· app初期大家都忙着开发新功能,迭代新版本,没有时间停下来做优化
·同类型app变多,竞争对手变多,大家才开始关注启动性能,才开始做启动速度优化(有主动出击也有被动优化)
一、引起性能问题的原因
二、为什么要做启动速度优化
App启动卡慢会影响一个App的卸载率和使用率。启动速度快会给人一种轻快的感觉,减少用户等待时间。如果一个App从点击桌面图标到看到主界面花了10秒,请问你能接受么?忍耐不好的估计直接就卸载了,或者没等打开就直接Home键按出去,然后杀进程了。这样一来App卸载率提升了,使用率下降了。所以对于有大量用户的App来说,这些性能细节是很重要的,毕竟用户就是钱啊。
三、影响启动速度的原因
高耗时任务
复杂的View层级
类过于复杂
Java对象的创建也是需要一定时间的,如果一个类中结构特别复杂,new一个对象将消耗较高的资源,特别是一些单例的初始化,需要特别注意其中的结构
主题及Activity配置
四、启动速度优化方案
4.1减少应用启动时的耗时
· 1、在Application的构造器方法、attachBaseContext()、onCreate()方法中不要进行耗时操作的初始化,一些数据预取放在异步线程中,可以采取Callable实现。
· 2、对于sp的初始化,因为sp的特性在初始化时候会对数据全部读出来存在内存中,所以这个初始化放在主线程中不合适,反而会延迟应用的启动速度,对于这个还是需要放在异步线程中处理。
· 3、对于MainActivity,由于在获取到第一帧前,需要对contentView进行测量布局绘制操作,尽量减少布局的层次,考虑StubView的延迟加载策略,当然在onCreate、onStart、onResume方法中避免做耗时操作。
<style name="AppTheme.Launcher">
<item name="android:windowBackground">@drawable/bule</item>
</style>
//...
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.Launcher">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
2、然后在MainActivity中加载布局前把AppTheme重新设置给MainActivity:
@Override
protected void onCreate(Bundle savedInstanceState) {
setTheme(R.style.AppTheme);
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
4.2Glide及其他图片框架
Glide是一个很好用的图片加载框架,除了常用的图片加载、缓存功能以外,Glide支持对网络层进行定制,比如换成OkHttp来支持HTTP 2.0。不过,如果在追求启动速度的情况下,在Splash页或主界面加载某一张图片时,往往是第一次使用Glide,由于Glide没有初始化,会导致这次图片加载的时间比较长(不管本地还是网络),特别是在其他操作也在同时抢占CPU资源的时候,慢的特别明显!而后面再使用Glide加载图片时,还是比较快的
Glide初始化耗时分析:Glide的初始化会加载所有配置的Module,然后初始化RequestManager(包括网络层、工作线程等,比较耗时),最后还要应用一些解码的选项(Options)
override fun onCreate() { super.onCreate() // 使用Anko提供的异步工作协程,或者自行创建一个并发线程池
doAsync {
GlideApp.get(this) // 获取一个Glide对象,Glide内部会进行初始化操作
}
}
4.3TraceView的使用 - 数据采集与数据分析
TraceView是什么,
TraceView 是 Android
TraceView 从代码层面分析性能问题,针对每个方法来分析,比如当我们发现我们的应用出现卡顿的时候,我们可以来分析出现卡顿时在方法的调用上有没有很耗时的操作,通过TraceView,可以得到两种数据。
·单次执行最耗时的方法
·执行次数最多的方法
·第一种方式:
1.首先选择跟踪范围,在想要根据的
Debug.startMethodTracing(“hello”);
Debug.stopMethodTracing();
traceview文件会自动放在SDCARD
SDCARD卡会出现异常,所以使用这种方式需要确保应用的AndroidMainfest.xml中的SD卡的读写权限是打开的,其中hello是traceview文件
1.然后用adb导出traceview文件。
adb pull sdcard/hello.trace C:\Users\lwf\Desktop
1.然后启动
Android Device Monitor-->File-->openFile,
·第二种方式:
1.同样是要先打开
Android Device Monitor
2.先选择应用进程,然后点击
Start Method Profiling
Stop Method Profiling
DDMS 的 trace 分析界面。
五、总结
·利用主题快速显示界面;
·异步初始化组件;
·梳理业务逻辑,延迟初始化组件、操作;
·去掉无用代码、重复逻辑等。
TraceView