Android App冷启动耗时优化

Android应用启动过程

        Android应用启动过程,主要包含app::onCreate及执行前的Application阶段及Activity::onCreate执行之后的Activity阶段,以及两个阶段之间的间隙handleMessage阶段和最终页面渲染上屏完成前数据加载阶段四个区间组成。

       

         具体来看,当App图标被点击后,zygote 进程 fork出当前应用进程,然后执行 ActivityThread 的 main方法,读取安装包中的二进制文件,并最终触发执行bindApplication方法

        接下来是对二进制中的符号进行解析及加载应用中需要的java类。这是我们在应用中能触达到的最早的阶段:attachBaseContext阶段,该阶段也是我们最早的执行预加载等用户自定义代码的时机。通常在这一阶段,我们可以对dex的加载过程进行干预,如进行MultiDex优化。

        然后是加载依赖的第三方组件。上述所有工作完成后,回调app:onCreate方法。该方法是我们执行应用程序中各个模块的初始化及第三方组件的初始化的主要场所。

        在app:onCreate执行完成后,主线程会收到大量来自子线程的消息,当主线程执行完这些任务后,才会开始调用Activity的onCreate方法,开启应用首屏页面的解析、布局、绘制过程。页面然后根据加载到的数据进行更新,最终提交给SurfaceFlinger合成上屏。

可行优化措施

        (1)在attachBaseContext 阶段进行MultiDex优化

        (2)通过类重排,减少内存页因PageFault而带来的耗时

        (3)dex2oat时将verify后的结果保存为vdex,后续直接加载vdex,省略verify步骤

        (4) 对app:onCreate中的初始化操作进行检查,删除非必要的初始化任务,同时将耗时任务改为子线程或异步

        (5)在handleMessage阶段,对子线程任务进行重排,减少任务间间隙

        (6)设置启动图片,避免启动过程中显示白屏

        (7)Activity:onCreate阶段,避免IO等阻塞主线程的操作,复杂任务改为子线程,或者进行预加载

        (8)DecoreView预加载

        (9)优化页面布局代码或提前将xml转为代码配合inflate,减少xml解析及视图初始化耗时

        (10)设计并实现异步任务调度、异步IO、异步UI、网络请求等通用框架,简化性能优化过程

        

          

相关推荐

  1. Android启动优化

    2024-03-13 01:00:11       38 阅读
  2. iOS应用启动优化,可以做哪些事情

    2024-03-13 01:00:11       22 阅读
  3. ,热,温启动

    2024-03-13 01:00:11       59 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-03-13 01:00:11       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-03-13 01:00:11       100 阅读
  3. 在Django里面运行非项目文件

    2024-03-13 01:00:11       82 阅读
  4. Python语言-面向对象

    2024-03-13 01:00:11       91 阅读

热门阅读

  1. Android主界面多Tab实现方式

    2024-03-13 01:00:11       44 阅读
  2. android so载入过程

    2024-03-13 01:00:11       39 阅读
  3. Vue3:ref和reactive实现响应式数据

    2024-03-13 01:00:11       45 阅读
  4. LeetCode--代码详解 146.LRU缓存

    2024-03-13 01:00:11       49 阅读
  5. Lwip之TCP服务端示例记录(1对1)

    2024-03-13 01:00:11       37 阅读
  6. swagger-ui页面设置接口请求头head参数

    2024-03-13 01:00:11       44 阅读
  7. .NET Core 日志记录功能详解

    2024-03-13 01:00:11       42 阅读
  8. LeetCode每日一题[C++]-2129.将标题首字母大写

    2024-03-13 01:00:11       48 阅读
  9. 【LeetCode】 删除链表的倒数第 N 个结点

    2024-03-13 01:00:11       41 阅读
  10. css---定位

    2024-03-13 01:00:11       44 阅读
  11. 高防IP有哪些防御方法?

    2024-03-13 01:00:11       44 阅读
  12. C++ struct 结构体类型

    2024-03-13 01:00:11       38 阅读