现在做的全局搜索和浏览器应用目前需要做冷启动优化,因为是植入到系统的,所以没有闪屏页面,不能通过添加背景页的方式优化白屏,因此只能从Activity和Application入手硬核优化。
这是没优化的启动速度
C:\Users\liwenpeng1>adb shell am start -W com.journeyui.globalsearch/com.journeyui.globalsearch.GlobalSearchMainActivity
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.journeyui.globalsearch/.GlobalSearchMainActivity }
Status: ok
LaunchState: COLD
Activity: com.journeyui.globalsearch/.GlobalSearchMainActivity
TotalTime: 2010
WaitTime: 2029
Complete
优化后:
C:\Users\liwenpeng1>adb shell am start -W com.journeyui.globalsearch/com.journeyui.globalsearch.GlobalSearchMainActivity
Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.journeyui.globalsearch/.GlobalSearchMainActivity }
Status: ok
LaunchState: COLD
Activity: com.journeyui.globalsearch/.GlobalSearchMainActivity
TotalTime: 686
WaitTime: 692
Complete
下面是我的修改点:
一.Application优化
对X5 webview优化,之前这块代码
QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {
@Override
public void onViewInitFinished(boolean arg0) {
// TODO Auto-generated method stub
//x5內核初始化完成的回调,为true表示x5内核加载成功,否则表示x5内核加载失败,会自动切换到系统内核。
CoolLogger.d(TAG,"onViewInitFinished arg0:"+arg0);
}
@Override
public void onCoreInitFinished() {
// TODO Auto-generated method stub
}
};
//x5内核初始化接口
QbSdk.initX5Environment(getApplicationContext(), cb);
是直接放到Application的onCreate中的,导致速度很慢,现在改成如下:
1.在AndroidManifest.xml加入这个service
<service
android:name="com.tencent.smtt.export.external.DexClassLoaderProviderService"
android:label="dexopt"
android:process=":dexopt" >
</service>
2.Application的onCreate中加入
HashMap map = new HashMap();
map.put(TbsCoreSettings.TBS_SETTINGS_USE_SPEEDY_CLASSLOADER, true);
map.put(TbsCoreSettings.TBS_SETTINGS_USE_DEXLOADER_SERVICE, true);
QbSdk.initTbsSettings(map);
3.在特定需要加载webview的界面异步绑定tbs x5 webview
比如我在activity的oncreate方法中
initWebviewDispose = Observable.create(new ObservableOnSubscribe<Object>() {
@Override
public void subscribe(@NonNull ObservableEmitter<Object> emitter) throws Exception {
emitter.onNext(1);
emitter.onComplete();
}
}).subscribeOn(Schedulers.io()).delay(1, TimeUnit.SECONDS).observeOn(AndroidSchedulers.mainThread()).subscribe(new Consumer<Object>() {
@Override
public void accept(Object o) throws Exception {
initX5Webview();
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
CoolLogger.e(TAG,"x5 webview init error",throwable);
}
});
private void initX5Webview() {
QbSdk.PreInitCallback cb = new QbSdk.PreInitCallback() {
@Override
public void onViewInitFinished(boolean arg0) {
// TODO Auto-generated method stub
//x5內核初始化完成的回调,为true表示x5内核加载成功,否则表示x5内核加载失败,会自动切换到系统内核。
CoolLogger.d(TAG,"onViewInitFinished arg0:"+arg0);
}
@Override
public void onCoreInitFinished() {
// TODO Auto-generated method stub
}
};
//x5内核初始化接口
QbSdk.initX5Environment(getApplicationContext(), cb);
}
可减少冷启动时间。
2.Greendao优化,同样不在Applcication进行初始化,使用到的时候初始化。
3.所有耗时操作全部放异步线程。
4.布局层级渲染优化,看layout inspector。
5.多余框架删除,尽量自己写,或者第三方的框架下载下来提取关键类自己修改导入,然后把那个依赖的框架删除。
6.多余代码删除,根据inspect code。