• Android App启动优化之启动框架


    android启动优化是个比较重要的部分,也是一大难题,一个优秀的app首先给人第一感觉就是启动速度,启动速度非常影响用户的体验,那么我们今天展开说说启动优化相关的问题。

    我们先来简单分析一下启动过程、启动优化方向,最后再运用我们的启动框架来优化这个过程。

    一、启动流程

    Click Event -> IPC -> Process.start -> ActivityThread -> bindApplication -> LifeCycle -> ViewRootImpl

    首先,用户会执行点击操作,点击事件会触发一个IPC通信,之后会触发一个Process.start方法,用于进程的创建,接着便会执行ActivityThread的main方法,开启looper并且创建主线程handler,接着会bindApplicaiton,之后会执行activity的生命周期,最后执行ViewRoot的渲染,这时才会显示一个页面。

    二、启动分析及优化方向

    冷启动之前:

    • 启动app
    • 加载空白window
    • 创建进程

    需要注意的是这些都是系统行为,一般我们控制不了。

    随后任务:

    • 创建application
    • 启动主进程
    • 创建MainActivity
    • 加载布局
    • 执行onCreate

    通常首帧绘制结束,我们就认为是启动已经结束了。

    所以我们的优化方向就是applicaiton阶段跟activity生命周期阶段的耗时。

    adb查看启动耗时:

    adb shell am start -W [packageName]/[AppstartActivity全路径]

    执行后会得到三个时间:ThisTime、TotalTime和WaitTime,totalTime包括 创建进程 + Application初始化 + Activity初始化到界面显示 的过程。

    三、优化方案
    1. 主题切换,

      使用Activity的windowBackground主题属性预先设置一个启动图片(layer-list实现),在启动后,在Activity的onCreate()方法中的super.onCreate()前再setTheme(R.style.AppTheme)。避免了白屏跟点击图标无响应。

    2. 三方库懒加载,按需加载。

    3. 延时加载,利用子线程来加载任务来减少主线程的耗时。

    4. 使用IdeaHandler

    5. 类加载优化,在application中异步加载耗时长的类加载,替换classloader获取到类加载时间。Class.forName只加载类本身及静态变量引用类,new类会额外加载成员变量的引用类。

    6. webview启动优化,可以预先将其内核初始化,加载到webview缓存池中。

    7. 页面数据预加载。

    8. 页面绘制层级优化。

    四、启动框架实现

    接下来就是我们的重头戏,实现启动框架了。

    启动框架主要要考虑:

    1. 任务的依赖关系处理。比如A依赖B,B依赖C,类似这种情况,我们要如何处理任务执行先后顺序,哪些任务能延时,哪些任务必须等待,我们就需要用有向无环图进行拓扑排序。(这个点大家可以自行了解一下,很重要,一般采用的是广度优先搜索算法)
    2. 线程池,我们必然要统一线程池,我们要判断任务是ios密集型任务还是cpu密集型任务类型。
    3. 任务的优先级,线程的优先级。
    4. 任务等待,CountDownLanuch。

    下面的开源地址,下载即用GitHub - liweidong93/anchor: 安卓启动框架(java实现)

  • 相关阅读:
    前端利用原生canvas生成图片
    PyIntObject 对象
    2000-2022年“宽带Z国“试点城市名单匹配数据
    CycleGAN模型之Pytorch实战
    [MyBatis] SQL动态标签,SelecKey标签
    【单片机毕业设计】【mcuclub-jj-054】基于单片机的豆浆机的设计
    你听说过LabVIEW吗?
    .NET 6 支持Cookie与JWT混合认证、授权的方法
    【数据结构】线段树
    2.7 基本放大电路的派生电路
  • 原文地址:https://blog.csdn.net/no_loafer/article/details/133634766