【性能优化】Android冷启动优化

文章目录

    • 常见现象
    • APP的启动流程
    • 计算启动时间
      • Displayed Time
      • adb dump
    • 启动优化具体策略
    • 总结
    • 参考链接


常见现象

各种第三方工具初始化和大量业务逻辑初始化,影响启动时间,导致应用启动延迟、卡顿等现象

APP的启动流程

加载和启动应用程序;
App启动之后立即展示出一个空白的启动窗口;
创建App程序的进程;

创建App对象;
启动Main Thread;
创建启动页的Activity;
加载View;
布置屏幕;
进行初始绘制;

详细启动流程可以看这篇文章
APP启动流程

计算启动时间

看一张官图
在这里插入图片描述

上图是Google提供的冷启动流程图,可以看到冷启动的起始点时Application.onCreate()方法,结束点在ActivityRecord.reportLanuchTimeLocked()方法。

我们可以通过以下两种方式查看冷启动的耗时

Displayed Time

在Android 4.4(API级别19)及更高版本中,logcat包含一个名为Displayed的log信息,此值表示启动过程和完成在屏幕上绘制相应活动之间所经过的时间量。

	adb logcat | grep Displayed05-08 19:18:14.303   419   477 I ActivityTaskManager: Displayed ***/.ui.HomeActivity: +1s382ms

adb dump

	adb shell am start -S -W ***/.ui.HomeActivity -c android.intent.category.LAUNCHER -a android.intent.action.MAINStopping: ***Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=***/.ui.HomeActivity }Status: okLaunchState: COLDActivity: ***/.ui.HomeActivityTotalTime: 1391WaitTime: 1392Complete

ThisTime:是指调用过程中最后一个Activity启动时间到这个Activity的 startActivityAndWait调用结束;
TotalTime:是指调用过程中第一个Activity的启动时间到最后一个Activity的 startActivityAndWait结束。
WaitTime:是startActivityAndWait这个方法的调用耗时;

此方法通过终端ADB命令查看启动指定页面(应用首页)的耗时,即应用冷启动的时间。

启动优化具体策略

  1. 启动白屏或黑屏问题
    设置启动页
<style name="WelcomeTheme" parent="Theme.AppCompat.Light.NoActionBar.FullScreen"><item name="android:windowBackground">@drawable/shape_welcome</item><item name="android:windowDrawsSystemBarBackgrounds">false</item>
</style>
  1. Application启动优化
    attachBaseContext()的优化
    主要是MultiDex启动优化的,但是MultiDex启动优化存在一定风险,主dex经过一系列的优化操作减少了主dex的大小,因此也增大了NoClassDefFoundError的异常的可能,此时会导致我们的应用启动失败的风险。所以MultiDex启动优化一定要做好检查测试工作。

    onCreate()
    Application的onCreate()随着业务的复杂会存在大量的第三方库的初始化和组件初始化,导致该生命周期过于沉重,影响启动时间。对onCreate()的优化可以分为四类
    1、必须在onCreate()且是主进程中初始化
    2、可以延迟,但是需要在Application中初始化
    3、可以延迟到启动页的生命周期回调中初始化
    4、延迟到用的时候再初始化
    此处的优化着力会比较多,牵涉的代码业务逻辑比较复杂,核心是减轻冷启动初始化的工作,延迟初始化和按需初始化。

  2. 寻找有效的结束回调
    1、IdleHandler
    从冷启动流程图看,结束时间是在UI渲染完计算的,所以很明显,Activity生命周期中的onCreate()、onResume()、onStart()都不能作为冷启动的结束回调。常规操作中用Handler.postDelay()问题在于Delay的时间不固定,但我们知道消息处理机制中,MessageQueue有个ArrayList。可以在列表中添加Idle任务,Idle任务列表只有MessageQueue队列为空时才会执行,也就是所在线程任务已经执行完时,线程处于空闲状态时才会执行Idle列表中的任务。

public class MainActivity extends Activity {private static final Handler sHandler = new Handler(Looper.getMainLooper());@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);Looper.myQueue().addIdleHandler(new MessageQueue.IdleHandler() {@Override    public boolean queueIdle() {   // 页面启动所需耗时初始化            doSomething();return false;}});}
}

2、onWindowFocusChanged()
在冷启动结束即UI渲染完在去处理初始化操作,也是达到延迟初始化的目的。

@Overridepublic void onWindowFocusChanged(boolean hasFocus) {    super.onWindowFocusChanged(hasFocus);    if (onCreateFlag && hasFocus) {onCreateFlag = false;sHandler.post(new Runnable() {@Overridepublic void run() {doSomething();}})}}

3、通过View.post(Runnable runnable)方法实现
View内部维护了一个HandlerActionQueue,我们可以在DecorView attachToWindow前,通过View.post()将任务Runnables存放到HandlerActionQueue中。当DecorView attachToWindow时会先遍历先前存放在HandlerActionQueue的任务数组,通过handler挨个执行。

  // 方案只有在onResume()或之前调用有效protected void postAfterFullDrawn(final Runnable runnable) {    if (runnable == null) {        return;    }    getWindow().getDecorView().post(new Runnable() {        @Override        public void run() {            sHandler.post(runnable);}    });}

总结

冷启动优化主要是两大方面一是启动页的设置;而是初始化的管理包含延迟初始化和按需初始化,根本还是减少不必要的初始化逻辑,尽量轻量化。

参考链接

  1. 【性能优化】Android冷启动优化
  2. Android应用优化之冷启动优化

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/34729.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

学习笔记STMF4 TIMER定时器(使用开发板立创天空星STMF4)

目录 #定时器的介绍 #怎么去理解定时器的预分频系数 #使用定时器实现完成触发中断 #定时器触发中断基本函数配置 #在使用TIMER 触发中断的时候为什么不需要配置EXTI中断这个选项 #使用定时器完成输出PWM #PWM基本知识介绍 #函数配置生成PWM 这个系列所有笔记用来记录&#x…

【OnlyOffice】 桌面应用编辑器,版本8.1发布,PDF编辑器、幻灯片版式、改进从右至左显示、新的本地化选项等功能,快来体验吧

继 ONLYOFFICE 文档 8.1 发布后&#xff0c;适用于 Linux、Windows 和 macOS 的 ONLYOFFICE 桌面应用程序最新版本也已推出。它具有在线套件的最主要功能&#xff0c;例如功能齐全的 PDF 编辑器、演示文稿中的幻灯片版式、改进的 RTL 支持、新的本地化选项等。 目录 ONLYOFFICE…

手机看cad图的软件有哪些?软件推荐

手机看cad图的软件有哪些&#xff1f;随着科技的不断发展&#xff0c;CAD图纸在手机上的查看和编辑需求日益增加。为了满足这一需求&#xff0c;市面上涌现出了众多手机CAD看图软件。本文将为大家推荐四款优秀的手机CAD看图软件&#xff0c;并分别介绍它们的功能特点、受众定位…

JavaScript的学习之DOM简介

目录 一、DOM是什么 二、节点是什么&#xff08;Node&#xff09; 三、代码示例 一、DOM是什么 DOM全称Document Object Model文档对象模型 文档&#xff1a;表示整个HTML网页文档 对象&#xff1a;表示网页中的每一个部分转换为一个对象 模型&#xff1a;表示对象之间的关系…

LabVIEW开发电气设备检测与管理系统

设计并实现了一个基于LabVIEW的电气设备检测与管理系统&#xff0c;采用了先进的硬件设备&#xff08;NI PXI-6289数据采集卡、Fluke 434电能质量分析仪和Schneider PM5560电力监控仪&#xff09;&#xff0c;通过实时采集、处理与存储电气设备数据&#xff0c;提高了电气设备的…

Go语言JSON-RPC 实战: `net/rpc/jsonrpc` 包的高效使用指南

Go语言JSON-RPC 实战&#xff1a; net/rpc/jsonrpc 包的高效使用指南 简介jsonrpc 包的基础客户端&#xff08;Client&#xff09;创建客户端调用方法 服务器&#xff08;Server&#xff09;配置服务器数据类型和错误处理 搭建基础的 JSON-RPC 服务服务端的实现客户端的实现 进…

60.Python-web框架-Django手动删除了一个数据库表,migrate问题

目录 1.问题产生 2.解决方法&#xff1a; 1.问题产生 今天手欠&#xff0c;删了一个数据库表&#xff0c;然后迁移不进来了。 当你在Django项目中手动删除了数据库模型&#xff08;models&#xff09;的表后&#xff0c;想要Django通过makemigrations命令重新创建或识别这些更…

[数据集][目标检测]斑马线人行横道检测数据集VOC+YOLO格式793张1类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;793 标注数量(xml文件个数)&#xff1a;793 标注数量(txt文件个数)&#xff1a;793 标注类别…

“拿来主义”学习元素裁剪(附源码)

“拿来主义”学习元素裁剪 欢迎关注&#xff1a; 小拾岁月&#xff0c;获取源码。 参考链接&#xff1a;https://mp.weixin.qq.com/s/TsOOhUAff6OeqPW7A9JuaQ 预期效果图 需求分析 首先从需求上来看&#xff0c;需要一个主元素用于展示用户头像。例外&#xff0c;在页面无操…

游戏AI的创造思路-技术基础-深度学习(3)

继续填坑&#xff0c;本篇介绍深度学习中的长短期记忆网络~~~~ 目录 3.3. 长短期记忆网络&#xff08;LSTM&#xff09; 3.3.1. 什么是长短期记忆网络 3.3.2. 形成过程与运行原理 3.3.2.1. 细胞状态与门结构 3.3.2.2. 遗忘门 3.3.2.3. 输入门 3.3.2.4. 细胞状态更新 3.…

Unity通过Package Manager导入Newtonsoft.Json或叫Json.NET

Unity打开Package Manager窗口: 输入: com.unity.nuget.newtonsoft-json

重磅消息:ONLYOFFICE8.1版本桌面编辑器发布:功能完善的 PDF 编辑器、幻灯片版式、改进从右至左显示、新的本地化选项等

目录 ONLYOFFICE介绍 PDF 编辑器 功能全面的 PDF 编辑器 文本编辑 页面处理 &#xff08;添加、旋转、删除&#xff09; 插入和调整各种对象&#xff0c;例如表格、形状、文本框、图像、TextArt、超链接、方程等。 此外 PDF 表单 文本文档编辑器更新内容 页面颜色 页面…

【实用软件】HyperSnap软件下载及详细安装教程

​不得不说HyperSnap是一款拥有20多年历史的老牌屏幕截图软件&#xff0c;屏幕截图专家&#xff0c;电脑屏幕截图、GAME画面捕捉、视频抓取工具&#xff0c;多种截图方式满足任何区域截图&#xff0c;特色功能有&#xff1a;文本捕捉、图片编辑、滚动页面、延迟捕获。从大部分从…

【C++/STL】:优先级队列(priority_queue)的使用及底层剖析仿函数

目录 &#x1f4a1;前言一&#xff0c;优先级队列的使用二&#xff0c;仿函数1&#xff0c;什么是仿函数2&#xff0c;仿函数的简单示例 三&#xff0c;优先级队列的底层剖析 &#x1f4a1;前言 优先队列(priority_queue)是一种容器适配器&#xff0c;默认使用vector作为其底层…

MindManager2024思维导图电脑版下载,你的思维管理神器!

&#x1f9e0; 思维导图界的革命性更新&#xff01; 亲爱的小红书的朋友们&#xff0c;今天我要和你们分享一个我近期发现的神器——MindManager2024思维导图软件&#xff01;这不仅仅是一个软件&#xff0c;它简直是我工作学习中的得力助手。想象一下&#xff0c;你的大脑中那…

MindManager2024思维导图软件重磅发布更新!

大家好啊&#xff01;&#x1f44b; 今天我超级激动要分享给大家一款改变我工作和学习方式的工具——MindManager2024思维导图软件&#xff01;这可不仅仅是个工具哦&#xff0c;它更像是我的私人思维助手&#xff0c;帮我整理思绪&#xff0c;规划时间&#xff0c;还能激发创新…

当你在浏览器输入一个地址

你在浏览器中输出了一个地址&#xff0c;回车后&#xff0c;一直到显示页面&#xff0c;中间经历了哪些过程 &#xff1f; 1. 用户输入 URL 并按下回车 用户在浏览器的地址栏中输入一个 URL&#xff08;例如 http://example.com&#xff09;并按下回车键。 2. DNS 解析 浏览…

猫狗识别—静态图像识别

猫狗识别—静态图像识别 1. 导入必要的库:2. 设置数据目录和模型路径:3. 定义图像转换4. 使用GPU5. 加载没有预训练权重的ResNet模型6. 创建Tkinter窗口:7.定义选择图片的函数:8.定义预测图片的函数:9.退出程序的函数:10.创建按钮:11.运行Tkinter事件循环:12. 完整代码&#xf…

Chrome谷歌浏览器如何设置,才能正常使用?

Chrome浏览器&#xff0c;也被称为谷歌浏览器&#xff0c;由于简洁的界面设计&#xff0c;极快的响应速度&#xff0c;强大的插件商店&#xff0c;在全球浏览器市场份额中一直都处于遥遥领先的地位。但是因为2010年谷歌宣布退出中国&#xff0c;国内不能再使用谷歌的服务&#…

【仿真建模-解析几何】求有向线段上距指定点最近的坐标

Author&#xff1a;赵志乾 Date&#xff1a;2024-06-25 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 问题描述&#xff1a; 有向线段起点A为&#xff08;x1&#xff0c;y1&#xff09;&#xff0c;终点B为&#xff08;x2&#xff0c;y2&a…