美文网首页
性能优化 -- 启动优化

性能优化 -- 启动优化

作者: 突然思考的杨小六 | 来源:发表于2021-01-06 17:29 被阅读0次

启动优化

app启动分为:冷启动;热启动,温启动三种
冷启动: 耗时最多流程:
冷启动经过的流程
点击app --> ipc -->Process.start(进程创建)
--> ActivityThread(应用入口,main函数创建looper,hander等创建)
--> bindApplication(通过反射调用应用的application及生命周期)
-->lifeCycle( activity的生命周期)
--> ViewRootImpl(真正的界面绘制入口)

热启动: 最快,从后台切入到前台
温启动:只触发actvity的生命周期 不会创建进程

优化的方向:

Application和Activity生命周期这些才可以控制,所以优化的方向便有了

启动时间查看

1. adb 命令: 线下使用方便,但是不用再线上场景使用
adb shell am start -W packagename/首屏activity

使用:

Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.czy.yq_wanandroid/.business.SplashActivity }
Status: ok
LaunchState: COLD
Activity: com.czy.yq_wanandroid/.business.SplashActivity
TotalTime: 1293  //所有activity启动耗时
WaitTime: 1294// AMS启动activity的总耗时
Complete


2. 手动打点

记录开始时间:application的attachBaseContext方法开始计时
记录结束的时间: onWindowFocusChanged时界面刚开始渲染的时候会调用可以用来作为结束时间,但是 我们记录的意义是看从启动到界面展示时的总耗时,所以我们也可以选择界面展示后的时间来作为结束时间

启动优化

1). 启动页主题添加背景

2). 合理的使用异步初始化、延迟初始化、懒加载机制

application初始化时候可以自定义自己的启动器,自定义task初始化:可配置异步非异步,等待执行,依赖执行。
对于不需要在application初始化的功能可进行延迟初始化,在界面加载出来后通过idelhanler(消息队列无消息时才进行处理)进行初始化。

3). 提前加载SharePreferences,
https://qingmei2.blog.csdn.net/article/details/109134825
在multidex之前CPU是空闲的,加载系统类是可行的,所以可充分利用这段时间加载SharedPreferences;

  • 初始化
    1.建议在Application中初始化,重写attachBaseContext方法,SharedPreference的context传入
    Application对象即可,最好使用单例,不必每次都获取Sp对象,减少开销。
    2.如果项目中使用了MultiDex,存在分包,请在分包前即MultiDex.install()之前或者在multidex执行的这段时间初始化,因为这时cpu是利用不满的,我们没有办法充分利用CPU的原因,是因为如果我们在Multidex之前执行一些操作,我们很有可能因为这样一些操作的类或者是相关的类不在我们的主dex当中,在四点几的类中会直接崩溃,但是由于sharePreference不会产生这种崩溃,它是系统的类。
  • 使用中
    1.请不要使用SharedPreference存储大文件及存储大量的key和value,这样的话会造成界面卡顿或者ANR
    比较占内存,记住它是简单存储,如果有类似的需求请考虑数据库、磁盘文件存储等等。
    2.推荐使用apply进行存储,这也是官方推荐,当读入内存后,因为它是异步写入磁盘的,所以效率上会比commit好,如果你需要存储状态或者即存即用的话还是尽量使用commit。
    3.请不要频繁使用apply与commit,如果存在这样的问题,请合并一次性apply与commit,可以参考封装一个map的结合,一次性提交,因为SharedPreference可能会存在IO瓶颈和锁性能差的问题。
    4.尽量不要存放Json及html,数据少可以,无需担心,大量的话请放弃。
    5.不要所有的数据都存在一个文件,不同类型的文件或者数据可以分开多个文件存储,避免使用一个大文件,这样可提高读取速度。
    6.跨进程操作不要使用MULTI_PROCESS标志,而是使用contentprovide等进程间通信的方式。
    7.如果你的项目对于存储性能要求非常高的情况,可以考虑放弃系统的SharedPreference存储,推荐你使用腾讯的高性能组件MMKV,目前超过7k+的star。

4). 合理使用IdleHandler进行延迟初始化。

5). 启动阶段不要启动子进程
初始化子进程会消耗CPU资源,在启动阶段会导致主进程CPU资源紧张,导致启动阶段资源紧张初始化过慢;

相关文章

  • 「性能优化2.2」获取布局的加载时间

    「性能优化1.0」启动分类及启动时间的测量「性能优化1.1」计算方法的执行时间「性能优化1.2」异步优化「性能优化...

  • 「性能优化2.4」 AsyncLayoutInflater实现异

    「性能优化1.0」启动分类及启动时间的测量「性能优化1.1」计算方法的执行时间「性能优化1.2」异步优化「性能优化...

  • 「性能优化2.3」Choreographer检测丢帧

    「性能优化1.0」启动分类及启动时间的测量「性能优化1.1」计算方法的执行时间「性能优化1.2」异步优化「性能优化...

  • 「性能优化2.1」LayoutInflater Hook控件加载

    「性能优化1.0」启动分类及启动时间的测量「性能优化1.1」计算方法的执行时间「性能优化1.2」异步优化「性能优化...

  • 「性能优化1.3」延迟加载方案

    「性能优化1.0」启动分类及启动时间的测量「性能优化1.1」计算方法的执行时间「性能优化1.2」异步优化「性能优化...

  • 「性能优化2.0」布局加载原理

    「性能优化1.0」启动分类及启动时间的测量「性能优化1.1」计算方法的执行时间「性能优化1.2」异步优化「性能优化...

  • iOS性能优化 - 整理

    本文主要包含: 性能优化 - 卡顿性能优化 - 耗电优化性能优化 - APP启动优化安装包瘦身 一  性能优化 -...

  • 冷启动优化

    冷启动优化主要优化两个方面 Application 性能优化 App启动页性能优化业务优化不在本章优化范围内。本章...

  • iOS 性能优化三

    主要讲解APP冷启动的优化 iOS 性能优化一iOS 性能优化二iOS 性能优化三 1. APP 启动的分类 冷...

  • Android性能优化--内存优化

    转载自:Android性能优化--内存优化 上一篇文章关于Android性能优化--启动优化探讨了启动优化相关的知...

网友评论

      本文标题:性能优化 -- 启动优化

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