对于app的启动优化,常见的需要达到两种优化效果
第一种:需要进行视觉优化。
简而言之,就是用户视觉感官上觉得app启动速度变快了,一般方案是增加闪屏页LanuchActivity。指定其主题样式,增加图片并且背景透明化。
第二种:需要进行代码优化。(重要)
一般指冷启动优化。即:该应用程序在此之前没有被创建,发生在应用程序首次启动或者自上次被终止后的再次启动。简单的说就是app进程还没有,需要创建app的进程启动app。很多初始化耗时操作需要在application中做,在 Application 中完成繁重的初始化操作和复杂的逻辑就会影响到应用的启动性能,因此代码优化也就是优化这些初始化第三方库(组件)的时机。
application优化需要遵循以下原则:
- 必要的组件一定要在主线程中立即初始化(入口 Activity 可能立即会用到)
- 组件一定要在主线程中初始化,但是可以延迟初始化。
- 组件可以在子线程中初始化。
例如:
1、将Bugly,x5内核初始化,SP的读写,友盟等组件放到子线程中初始化。(子线程初始化不能影响到组件的使用)
new Thread(new Runnable() {
@Override
public void run() {
//设置线程的优先级,不与主线程抢资源
Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND);
//子线程初始化第三方组件
Thread.sleep(5000);//建议延迟初始化,可以发现是否影响其它功能,或者是崩溃!
}
}).start();
2、将需要在主线程中初始化但是可以不用立即完成的动作延迟加载(原本是想在入口 Activity 中进行此项操作,不过组件的初始化放在 Application 中统一管理为妙.)
handler.postDelayed(new Runnable() {
@Override
public void run() {
//延迟初始化组件
}
}, 3000);
app启动耗用总时长分析
需求背景 : 应用App通常会设置一个固定的闪屏页展示时间,例如2000ms,所以我们可以根据用户手机的运行速度,对展示时间做出调整,但是总时间仍然为 2000ms。
闪屏页展示总时间 = 组件初始化时间 + 剩余展示时间。
也就是2000ms的总时间,组件初始化了800ms,那么就再展示1200ms即可。
如何获取app的启动时间?
利用adb命令获取APP的启动时间:
adb shell am start -W 包名/界面名
例如:adb shell am start -W com.kc.splash/.SplashActivity 【错误】
adb shell am start -W com.kc.mvvmcomponent/com.kc.splash.SplashActivity 【正确】
组件化中需要:app包名/组件包名.activity
耗时对比
未进行启动优化的app冷启动耗时:
未优化对application进行代码优化
/**
* 启动优化
*/
Thread {
//设置子线程的优先级,不与主线程抢资源(必须设置优先级,不然会争抢主线程资源,无法优化启动时间)
android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND)
//子线程初始化第三方组件******
//1、路由初始化
ARouter.init(this)
//2、自定义炫酷Logger拦截网络请求
val formatStrategy: FormatStrategy = PrettyFormatStrategy.newBuilder()
.showThreadInfo(true) // (Optional) Whether to show thread info or not. Default true
.methodCount(5) // (Optional) How many method line to show. Default 2
.methodOffset(7) // (Optional) Hides internal method calls up to offset. Default 5
.tag("My custom tag") // (Optional) Global tag for every log. Default PRETTY_LOGGER
.build()
Logger.addLogAdapter(AndroidLogAdapter(formatStrategy)) // 初始化Logger
// Thread.sleep(500) //建议延迟初始化,可以发现是否影响其它功能,或者是崩溃!
}.start()
特别注意: //设置子线程的优先级,不与主线程抢资源(必须设置优先级,不然会争抢主线程资源,无法优化启动时间) android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_BACKGROUND)
原因:使用Thread或者HandlerThread时,调用Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)设置优先级,否则仍然会降低程序响应,因为默认Thread的优先级和主线程相同。
优化后,明显发现冷启动耗时变短了~
优化后启动优化成功!!!
扩展内容:
1、冷启动、温启动、热启动都是什么啊?
冷启动
冷启动指的是该应用程序在此之前没有被创建,发生在应用程序首次启动或者自上次被终止后的再次启动。简单的说就是app进程还没有,需要创建app的进程启动app。
比如开机后,点击屏幕的app图标启动应用。
温启动
温启动。温启动指的是App进程存在,但Activity可能因为内存不足被回收,这时候启动App不需要重新创建进程,只需要执行APP进程中的一些任务,比如创建Activity。
比如返回主页后,又继续使用其他的APP,时间久了或者打开的应用多了,之前应用的Activity有可能被回收了,但是进程还在。
热启动
热启动。热启动就是App进程存在,并且Activity对象仍然存在内存中没有被回收。
网友评论