android最全面的冷启动优化方案

android最全面的冷启动优化方案

启动流程

略…

耗时操作

  1. IO、数据库操作
  2. 网络请求
  3. 第三方加载

启动状态

冷启动

首次打开app或者app彻底销毁后再次打开app,这也是我们进行启动速度优化的主要方向

热启动

应用运行中按home键再打开应用

温启动

介于两者之前:比如说用户关闭应用又重新启动应用,这是应用进程还没被销毁。或者系统主动释放掉后台应用,然后用户就将它启动,这时虽然要再重新执行onCreate,但是saveInstanceState实例已经保存,可以提高启动速度

耗时监控

查看logcat日志

在日志中打出displayed过滤

android最全面的冷启动优化方案_第1张图片

adb命令

adb shell

am start -S -W 包名/.activity名

android最全面的冷启动优化方案_第2张图片

waitTime:包括前一个Activity pauseTime的时间和新应用启动时间

thisTime:一连串启动activity,最后指定的这个activity的耗时。比如:启动的是MainActivity的过程中还启动了SplashActivity。

totalTime:这个是最主要的,代表新应用启动的所有耗时

android最全面的冷启动优化方案_第3张图片

使用profiler(>=android8.0)

使用profiler执行程序,会在手机里启动ddms服务,会影响app的整体运行效率

android最全面的冷启动优化方案_第4张图片

  • sample java Methods

    对java方法采样,可能存在有方法未被采样的情况(比如:0.1秒采样一次,方法在0.05毫秒就执行完了)

  • Trace java method

    记录所有方法

Summary

根据时间线查看,便于发现调用是在何时发生

android最全面的冷启动优化方案_第5张图片

一般绿色的表示我们自己写的代码。从上往下看,横轴越长表示耗时越长

Top Down

查看方法调用栈,一步一步往下

android最全面的冷启动优化方案_第6张图片

Flame Chart

根据耗时百分比查看调用栈,便于发现耗时最长的调用链

Bottom Up

与Top Down相反,便于查看耗时方法如何被调用

StrictMode(严苛模式)
  • 一般只在debug使用
  • 用于捕获主线程中意外调用的IO操作和网络请求
  • 某些第三方可能也会被严苛模式拦截,比如:阿里Aouter
 //检查线程
                    StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
                            .detectCustomSlowCalls()//自定义耗时操作
                            .detectDiskReads()//磁盘读取操作
                            .detectDiskWrites()//磁盘写入操作
                            .detectNetwork()//网络相关操作
//                            .detectAll()
                            .penaltyLog()
//                            .penaltyDialog()//违规弹窗提示
                            .build());
                    //检测虚拟机
                    StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
                            .detectActivityLeaks()//检测activity泄漏
                            .detectLeakedClosableObjects()//检测对象泄漏
                            .detectLeakedSqlLiteObjects()//检测sql对象泄漏
//                            .detectAll()//检测全部
                            .penaltyLog()//打印日志
//                            .penaltyDeath()//违规崩溃(就是只要有被检测到就崩溃)
                    .build());
优化方向
减少布局复杂度
  • 约束布局 – 减少层级

  • viewSub – 懒加载

  • merge – 减少层级

  • 异步加载 布局 (局限性比较大)

    androidx 里有一个 AsyncLayoutInflater 的组件可以异步加载布局(需要另外导包)

    掌阅 X2C

异步加载

在Application的某些初始化方法,可以使用子线程加载

混淆代码
使用IdleHandler

在主线程空闲时执行业务

       Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {
     
            @Override
            public boolean queueIdle() {
     
                //此处添加处理任务
                return false;
            }
        });
使用Arouter插件
//在app 的build.gradle 加入
//arouter插件提高初始化速度
apply plugin: 'com.alibaba.arouter'

//在project的 build.gradle 加入
classpath "com.alibaba:arouter-register:1.0.2"
使用MultiDex

原理与多进程无关,只是防止应用anr

主要是去掉了dex转zip的步骤

m.alibaba.arouter’

//在project的 build.gradle 加入
classpath “com.alibaba:arouter-register:1.0.2”




##### 使用MultiDex

原理与多进程无关,只是防止应用anr

主要是去掉了dex转zip的步骤

你可能感兴趣的:(android,性能优化,冷启动,android,Arouter,StrictMode)