开门见山告诉答案:
一个Android 应用真正启动慢的原因是在Application 里面做了耗时的操作。把这些耗时的操作找出来并且new Thread 放到异步线程里面,那么问题就解决了。
下面看我的优化过程,这是我在未优化之前的Application的onCreate() 方法里面做的事情:
@Override public void onCreate() { mUPushHelper = new UPushHelper(this); mUPushHelper.init(); if (AppHelper.isAppMainProcess(this)) { super.onCreate(); Log.v("tag_2","1"); SDKInitializer.initialize(app); Log.v("tag_2","2"); QbSdk.initX5Environment(app, null); Log.v("tag_2","3"); TuSdk.enableDebugLog(!IS_OFFICIAL); TuSdk.init(app, "1faa2d433fef2f60-03-glpcq1"); Log.v("tag_2","4"); MobclickAgent.setDebugMode(!IS_OFFICIAL); Log.v("tag_2","5"); } }
看上面,我把每个方法执行的间隔时间都给打印出来了。如下图所示:
每个方法的耗时一目了然。1和2之间耗时270毫秒,3和4之间耗时330毫秒。4和5之间耗时340毫秒。
于是我把这些方法放到一个线程里面去执行,如下所示:
@Override public void onCreate() { mUPushHelper = new UPushHelper(this); mUPushHelper.init(); if (AppHelper.isAppMainProcess(this)) { super.onCreate(); // //耗时操作,一定要放到异步线程里 new Thread() { @Override public void run() { Looper.prepare(); SDKInitializer.initialize(app); QbSdk.initX5Environment(app, null); TuSdk.enableDebugLog(!IS_OFFICIAL); TuSdk.init(app, "1faa2d433fef2f60-03-glpcq1"); Looper.loop(); } }.start(); MobclickAgent.setDebugMode(!IS_OFFICIAL); } }
注意看上面的Looper.prepare() 和 Looper.loop() ,有些方法的运行需要在一个有Looper的线程才不会报错,所以我就给这个线程一个Looper。
我做了这一步优化之后,日志显示启动时间减少了270毫秒+330毫秒= 600毫秒。
运行OK ,启动速度明显提示。
========================
如果你觉得作者的这篇文章帮助到了你,请打赏作者一口饭吃: