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

性能优化 -- 启动优化

作者: 突然思考的杨小六 | 来源:发表于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资源紧张,导致启动阶段资源紧张初始化过慢;

    相关文章

      网友评论

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

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