启动优化理论及实现方案

一、启动优化概述

1、背景介绍:

  • 应用的第一体验,唯一要求 快: 即能快速进入主页面 ;
  • 八秒定律(用户在8秒时间未打开应用,70%的用户会放弃等待);

2、启动分类:

  • 冷启动: 耗时最多,作为应用启动的衡量标准 ;
  • 热启动: 最快 后台->前台 ;
  • 温启动: 较快 重走Activity的生命周期 ;

3、冷启动流程:

  1. 点击桌面应用图标, 启动App;
  2. 加载空白Window;
  3. 创建进程;
  4. 创建Application;
  5. 启动主线程;
  6. 创建MainActivity;
  7. 加载布局;
  8. 绘制屏幕;
  9. 首帧绘制;

4、优化方向:

  1. 白屏处理;
  2. Application中任务的处理;
  3. Activity生命周期处理;

二、启动时间的测量方式

1、adb命令: adb shell am start -W packagename/首屏Activity

  • ThisTime: 最后一个Activity启动耗时;
  • TotalTime: 所有Activity启动耗时;
  • WaitTime: AMS启动Activity的总耗时;
  • 特点:
    • 线下使用方便, 不能带到线上;
    • 非严谨, 精确的时间;

2、手动埋点: 启动时埋点, 启动结束埋点, 二者差值

  • 误区: onWindowFocusChanged只是Activity首帧时间, 并不代表界面已经展示出来;
  • 正解: 真实数据展示出来,Feed第一条展示,首帧时间与真实数据展示出来还有一段距离;
  • 起点: Application->attachBaseContext();
  • 终点: 真实的第一条数据展示出来时打点;
  • 特点: 精确, 可带到线上,

3、启动耗时的优雅的获取方式

  • 手动埋点(常规实现): 代码入侵性强, 工作量大;
  • AOP实现: 针对同一类问题统一处理, 无侵入, 修改方便;

4、启动耗时的分析工具

  • traceView
  • systrace
  • profiler

三、优化实现

1、白屏处理:

  • Theme切换: 感觉上快, 利用空白的window(现有90%以上应用使用);
  • SplashScreen (Andorid 12 官方提供的启动实现方案, 可向后做兼容), 运行效果如下:

2、异步优化(Application及Activity中任务处理):

  • 启动任务Task化, 启动逻辑抽象为Task;
  • 根据所有任务依赖关系排序生成一个有向无环图(算法核心);
  • 多线程按照排序后的优先级依次执行;
  • 解决必须在主线程执行及有依赖关系的task;

3、延迟初始化方案

  • 常规初始化痛点:
    • 时机不便控制;
    • 导致Feed卡顿;
  • 更优方案:
    • 核心思想: 对延迟任务进行分批初始化
    • 利用IdleHandler特性, 空闲执行;

四、优化总方针: 异步, 延迟, 懒加载; 技术, 业务相结合

  1. 使用systrace检测 cpu time未跑满, 可充分利用;
  2. 完善监测: 监测Application及Activity中任务的耗时情况;
  3. 启动任务代码修改权限控制, 需要严格review;

五、微微工作优化方案

1、现状(启动耗时3.5s~4s)

  • 白屏未处理
  • 开屏页动画为播放的视频, 时间过长(产品设计不合理, 实现方式不合理)
  • 启动任务未做处理

2、优化方案

  • 使用SplashScreen处理白屏及动画问题, 需要产品与开发共同讨论下合适的实现方案; (该方案落地可将启动耗时降为1.5s以下, 收益较大)
  • 启动任务Task(设计耗时, 实现难度较大), 可作为持续优化任务实行, 该方案落地后可将耗时降为1s左右, 现有业务重的情况下可延后实行;
相关推荐
素师良码14 小时前
第5篇:显示驱动必备调试工具浅析
android
维克兜率天14 小时前
【维克】配对交易的季节性:哪些品种适合长拿?
android·开发语言·笔记·python·算法·kotlin·量化
墨天梦15 小时前
B06_XML控件布局与ViewBinding
android·kotlin
晚风叙码15 小时前
MySQL 表的操作:从建表到删表,一篇讲清楚
android·mysql·oracle
事圆则缓16 小时前
Android 性能优化常见工具与使用场景:从症状到证据的排查指南
android·性能优化
avi911116 小时前
Unity 非后台,非自动构建,但统计报表 BuildReport ,构建自动化系统C#
android·webserver·ios打包·admin·c#后台·unity打包系统·unity自动构建
新鲜势力呀17 小时前
PHP 定时任务系统实战:从 Cron 混乱执行到任务调度中心 + Redis队列 + 失败重试
android·java·redis
YF021117 小时前
Android 16系统 如何修改 eth0 IP ?
android
其实防守也摸鱼18 小时前
渗透测试学习计划(全栈综合 · 零基础进阶)
android·数据库·学习·安全·oracle·自动化·学习方法
释厄62318 小时前
BSD 简单真理循环论——简单真理 × 复杂循环=大一统
android·开发语言·kotlin