Android App冷启动速度白屏优化 实现从2000ms - 700ms的变化

现在做的全局搜索和浏览器应用目前需要做冷启动优化,因为是植入到系统的,所以没有闪屏页面,不能通过添加背景页的方式优化白屏,因此只能从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。

猜你喜欢

转载自blog.csdn.net/kururunga/article/details/114281463