博客
关于我
几乎包含了市面上所有启动优化方案
阅读量:91 次
发布时间:2019-02-25

本文共 1559 字,大约阅读时间需要 5 分钟。

启动速度优化:从冷启动到热启动的全维度分析

启动时间是Android应用的第一印象,直接关系到用户对应用的体验和留存。一个慢速启动的应用,可能会因用户失去耐心而被卸载,这对应用的长期表现至关重要。本文将从多个维度深入探讨如何优化Android应用的启动速度。

一、启动流程的理解

Android应用启动过程分为冷启动和热启动两种类型:

  • 冷启动

    从点击应用图标到UI界面完全显示且用户可操作的全部过程。其启动流程涉及多个阶段,包括IPC、Process.start、ActivityThread、bindApplication、LifeCycle和ViewRootImpl等。耗时最多,通常用于首次安装或覆盖安装的情况。

  • 热启动

    应用从已有的进程启动,避免重新创建和初始化Application,只会重新创建并初始化Activity。耗时较少,适用于已有进程的情况。

  • 二、启动耗时的检测工具

    为了准确测量启动耗时,可以借助以下工具:

  • Logcat

    在Android Studio中查看“Displayed”关键字对应的冷启动耗时日志。

  • adb shell

    使用命令adb shell am start -W [packageName]/[AppstartActivity全路径]获取启动时间,包括ThisTime(最后一个Activity启动耗时)、TotalTime(所有Activity启动耗时)和WaitTime(AMS启动Activity的总耗时)。

  • 代码打点工具

    使用自定义工具类记录整个启动过程的耗时情况,建议对用户ID的尾号进行抽样上报,确保数据的准确性。

  • AOP埋点

    利用AspectJ实现面向切面编程,对关键方法进行耗时监控,支持线上数据采集和分析。

  • 三、启动速度分析工具

    1. TraceView

    TraceView是一种强大的性能分析工具,能够绘制函数调用堆栈和执行时间。其优势在于图形化的展示方式,但运行时开销较大,结果不完全真实。

    2. Systrace

    Systrace结合Android内核数据,生成详细的HTML报告。其优势在于能够分析系统关键路径和应用方法的耗时,适合绘制性能问题。

    四、启动监控的实现

    为了全面监控启动过程,可以采取以下措施:

  • 实验室监控

    使用视频录制工具记录应用启动过程,关注80%以上的绘制和图像识别任务。

  • 线上监控

    • 确保启动结束时机准确,通常以界面显示和用户真正操作为标志。
    • 去除闪屏、广告和新手引导等不必要的延迟。
    • 排除Broadcast和Server拉起等影响启动时间的因素。
  • 五、优化方案

    针对常见问题,提出以下优化方案:

  • 启动阶段的异步化

    优化Application和Activity的初始化过程,减少主线程的负担。

  • 延迟初始化

    将初始化任务尽可能推迟到空闲时段执行,避免在启动时占用过多资源。

  • 第三方库懒加载

    对于资源占用较大的第三方库,采用懒加载策略,提升启动速度。

  • WebView优化

    预先创建WebView并缓存池管理,减少首次创建的性能开销。

  • 页面数据预加载

    在空闲时预加载其他页面数据,提升用户访问速度。

  • 六、黑科技的创新

    为了追求极致优化,可以尝试以下黑科技方案:

  • 启动阶段抑制GC

    在启动时禁用GC,允许堆一直增长,以换取时间优化(仅适用于特定设备)。

  • CPU锁频

    调整CPU频率,平衡性能和功耗。

  • 数据重排

    通过重排Dex文件中的类和资源,减少磁盘IO次数。

  • 类加载优化

    预加载和优化类加载流程,显著缩短类实例化时间。

  • 七、总结

    启动速度优化是一个复杂的系统工程,需要从多个维度进行分析和调整。核心优化方针包括异步化、延迟化和懒加载技术的应用。建议采用科学的监控体系,结合CI/CD流程进行版本迭代和性能评估,确保优化效果的长期稳定性。

    转载地址:http://jch.baihongyu.com/

    你可能感兴趣的文章
    phoenix_执行sql报错_Error: ERROR 504 (42703): Undefined column. columnName=(state=4270_大数据工作笔记0181
    查看>>
    phoenix启动失败_The history file `/root/.sqlline/history` may be an older history---记录024_大数据工作笔记0184
    查看>>
    Phoenix基础命令_视图映射和表映射_数字存储问题---大数据之Hbase工作笔记0036
    查看>>
    phoenix无法连接hbase shell创建表失败_报错_PleaseHoldException: Master is initializing---记录020_大数据工作笔记0180
    查看>>
    Phoenix简介_安装部署_以及连接使用---大数据之Hbase工作笔记0035
    查看>>
    phoenix连接hbase报错Can not resolve hadoop120, please check your network_记录026---大数据工作笔记0187
    查看>>
    Photoshop工作笔记001---Photoshop常用快捷键总结
    查看>>
    Reids配置文件redis.conf中文详解
    查看>>
    Photoshop脚本入门
    查看>>
    PHP
    查看>>
    Regular Expression Notes
    查看>>
    PHP $FILES error码对应错误信息
    查看>>
    PHP $_FILES函数详解
    查看>>
    PHP $_SERVER['HTTP_REFERER'] 获取前一页面的 URL 地址
    查看>>
    php & 和 & (主要是url 问题)
    查看>>
    php -- 魔术方法 之 判断属性是否存在或为空:__isset()
    查看>>
    php -- 魔术方法 之 获取属性:__get()
    查看>>
    php -树-二叉树的实现
    查看>>
    PHP -算法-二路归并
    查看>>
    php 2条不一样 的json数据 怎么放在一个json里面_如果你是PHP开发者,请务必了解一下Composer...
    查看>>