美文网首页Android专题
性能优化系列(一)冷启动优化。

性能优化系列(一)冷启动优化。

作者: 千夜零一 | 来源:发表于2021-05-25 15:50 被阅读0次

    对于app的启动优化,常见的需要达到两种优化效果

    第一种:需要进行视觉优化。

    简而言之,就是用户视觉感官上觉得app启动速度变快了,一般方案是增加闪屏页LanuchActivity。指定其主题样式,增加图片并且背景透明化。

    第二种:需要进行代码优化。(重要)

    一般指冷启动优化。即:该应用程序在此之前没有被创建,发生在应用程序首次启动或者自上次被终止后的再次启动。简单的说就是app进程还没有,需要创建app的进程启动app。很多初始化耗时操作需要在application中做,在 Application 中完成繁重的初始化操作和复杂的逻辑就会影响到应用的启动性能,因此代码优化也就是优化这些初始化第三方库(组件)的时机。

    application优化需要遵循以下原则:
      1. 必要的组件一定要在主线程中立即初始化(入口 Activity 可能立即会用到)
      1. 组件一定要在主线程中初始化,但是可以延迟初始化。
      1. 组件可以在子线程中初始化。

    例如:

    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对象仍然存在内存中没有被回收。

    比如app被切到后台,再次启动app的过程。

    2、闪屏页实现:可参考我的这篇文章>>app闪屏页如何实现?告别白屏!看这一篇就够了!

    相关文章

      网友评论

        本文标题:性能优化系列(一)冷启动优化。

        本文链接:https://www.haomeiwen.com/subject/khogxltx.html