Android性能优化系列篇(二):启动优化

这篇具有很好参考价值的文章主要介绍了Android性能优化系列篇(二):启动优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

汇总了一下众多大佬的性能优化文章,知识点,主要包含:

UI优化/启动优化/崩溃优化/卡顿优化/安全性优化/弱网优化/APP深度优化等等等~

本篇是第二篇:启动优化! [非商业用途,如有侵权,请告知我,我会删除]

强调一下: 性能优化的开发文档跟之前的面试文档一样,想要的跟作者直接要。

二、启动优化

2.1 我们为什么要做启动优化?

用户希望应用能够快速打开。启动时间过长的应用不能满足这个期望,并且可能会令用户失望。轻则鄙视你,重则直接卸载你的应用。

用户不会在乎你的项目是不是过大,里面是不是有很多初始化的逻辑。他只在乎你-慢了

所以咱们这篇文章有两个目的:

  • 启动速度提升(用户眼中的大神就是你)

  • 优化代码逻辑和规范(别让自己成为继任者中的XX)

今天咱们就来了解一下应用启动内部机制和启动速度优化。

2.2 启动内部机制

应用有三种启动状态:

  • 冷启动;

  • 温启动;

  • 热启动。

2.2.1 冷启动

冷启动是指应用从头开始:冷启动发生在设备启动后第一次启动应用程序 (Zygote>fork>app) ,或系统关闭应用程序后。

在冷启动开始时,系统有三个任务。 这些任务是:

  • 加载和启动应用程序。

  • 启动后立即显示应用程序的空白启动页面。

  • 创建应用程序进程。

一旦系统创建了应用程序进程,应用程序进程就负责接下来的阶段:

  • 创建应用的实体。

  • 启动主线程。

  • 创建主页面。

  • 绘制页面上的View。

  • 布局页面。

  • 执行首次的绘制。

如下图:

Android性能优化系列篇(二):启动优化

  • Displayed Time:初始显示时间

  • reportFullyDrawn():完全显示的时间

注意:在创建 Application 和创建 Activity 期间可能会出现性能问题。

创建 Application

当应用程序启动时,空白启动页面保留在屏幕上,直到系统首次完成应用程序的绘制。

如果你重写了Application.onCreate(),系统将调用Application 上的onCreate()方法。之后,应用程序生成主线程,也称为UI线程,并将创建主Activity的任务交给它。

创建Activity

应用进程创建你的Activity后,Activity会执行以下操作:

  • 初始化值。

  • 调用构造函数。

  • 调用 Activity 当前生命周期状态的回调方法,如 Activity.onCreate()。

注意:onCreate() 方法对加载时间的影响最大,因为它执行开销最高的工作:加载UI的布局和渲染,以及初始化Activity运行所需的对象。

2.2.2 热启动

热启动时,系统将应用从后台拉回前台,应用程序的 Activity 在内存中没有被销毁,那么应用程序可以避免重复对象初始化,UI的布局和渲染。

如果 Activity 被销毁则需要重新创建。

和冷启动的区别: 不需要创建 Application

2.2.3 温启动

温启动介于冷启动和热启动中间吧。例如:

  • 用户按返回键退出应用,然后重新启动。进程可能还没有被杀死,但应用必须通过调用onCreate()重新创建 Activity。

  • 系统回收了应用的内存,然后用户重新运行应用。应用进程和Activity都需要重新启动。

咱们看看他们共同消耗多长时间。

2.3 查询的启动时间

2.3.1 初始显示时间(Time to initial display)

在 Android 4.4(API 级别 19)及更高版本中,logcat 包含一个输出行,其中包含一个名为 Displayed 的值。 此值表示启动流程和完成在屏幕上绘制相应活动之间经过的时间量。 经过的时间包含以下事件序列:

  • 启动进程。

  • 初始化对象。

  • 创建并初始化Activity。

  • 加载布局。

  • 第一次绘制你的应用程序。

注意这里查看日志需要如下操作:

Android性能优化系列篇(二):启动优化

报告的日志行类,如下图:

Android性能优化系列篇(二):启动优化

//冷启动
I/ActivityTaskManager: Displayed com.scc.demo/.actvitiy.MainActivity: +1s355ms
//温启动(进程被杀死)
I/ActivityTaskManager: Displayed com.scc.demo/.actvitiy.MainActivity: +1s46ms
//热启动
I/ActivityTaskManager: Displayed com.scc.demo/.actvitiy.MainActivity: +289ms
I/ActivityTaskManager: Displayed com.scc.demo/.actvitiy.MainActivity: +253ms

图例讲解:

第一个时间,冷启动时间:+1s355ms。

然后我们在后台杀死进程,再次启动应用;

第二个时间,温启动时间:+1s46ms。

这里咱们在后台杀死进程所以:应用进程和Activity需要重新启动。

第三个时间:热启动时间:+289ms 和 +253ms

按返回键,仅退出activity。所以耗时比较短。

当然整体看这个应用开启时间并不长,因为 Demo 的 Application 和 Activity 都没有进行太多的操作。

2.3.2 完全显示时间(Time to full display)

你可以使用 reportFullyDrawn() 方法来测量应用程序启动和所有资源和视图层次结构的完整显示之间经过的时间。在应用程序执行延迟加载的情况下,这可能很有价值。在延迟加载中,应用程序不会阻止窗口的初始绘制,而是异步加载资源并更新视图层次结构。

这里我在Activity.onCreate()中加了个工作线程。并在里面调用reportFullyDrawn() 方法。代码如下:

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    Log.e(this.getClass().getName(), "onCreate");
    setContentView(R.layout.activity_main);
    ...
    new Thread(new Runnable() {
        @Override
        public void run() {
            try {
                Thread.sleep(3000);
                reportFullyDrawn();
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
    }).start();
}

报告的日志行类,如下图:

Android性能优化系列篇(二):启动优化文章来源地址https://www.toymoban.com/news/detail-410078.html

I/ActivityTaskManager: Fully drawn com.scc.demo/.actvitiy.MainActivity: +3s970ms
I/ActivityTaskManager: Fully drawn com.scc.demo/.actvitiy.MainActivity: +3s836ms
I/ActivityTaskManager: Fully draw

到了这里,关于Android性能优化系列篇(二):启动优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 性能优化系列:崩溃原因及捕获

    在日常开发中崩溃是我们遇到的很常见的情况,可能是 NullPointerException、IllegalArgumentException 等等,当应用程序抛出这些我们未捕获的异常时,紧跟着的是应用的崩溃,进程被杀死并退出。 或许你到现在都一直认为是因为抛出了异常,所以才会导致的进程被杀死并退出,认为

    2024年02月11日
    浏览(33)
  • Android性能优化系列-腾讯matrix-IO监控-IOCanaryPlugin源码分析

    作者:秋去无痕 matrix 对io的监控包括四个方面 监控在主线程执行 IO 操作的问题 监控缓冲区过小的问题 监控重复读同一文件 监控内存泄漏问题 IOCanaryPlugin,内部由IOCanaryCore完成真正的操作。 根据配置进行hook的安装 取消hook 底层hook安装包函几个步骤,加载so,设置hook内容,

    2024年02月09日
    浏览(68)
  • 【Android从零单排系列四十四】《聊一下Android数据权限permission》

    目录 前言 一.Android 数据权限基本介绍 二 Android 权限分类 三 Android 权限清单 四 Android 动态申请权限DEMO 小伙伴们,在前面的几篇文章中,我们谈到了Android开发中的几种数据存储方式及数据持久化,本文我们介绍下Android开发中的另一部分内容,权限管理。 在Android中,权限管

    2024年02月12日
    浏览(57)
  • RK3568平台开发系列讲解(调试篇)Linux 性能调试工具汇总

    🚀返回专栏总目录 沉淀、分享、成长,让自己和他人都能有所收获!😄 📢本篇将汇总介绍 Linux 调试优化的工具。 我们来看 Linux 的性能工具。首先还是要推荐下面这张图,也就是 Brendan Gregg 整理的性能工具谱图。我在专栏中多次提到过,你肯定也已经参考过。 这张图从

    2023年04月15日
    浏览(51)
  • Android复杂UI的性能优化实践 - PTQBookPageView 性能优化记录

    作者:彭泰强 要做性能优化,首先得知道性能怎么度量、怎么表示。因为性能是一个很抽象的词,我们必须把它量化、可视化。那么,因为是UI组件优化,我首先选用了 GPU呈现模式分析 这一工具。 在手机上的开发者模式里可以开启 GPU呈现(渲染)模式分析 这一工具,有的

    2024年02月14日
    浏览(33)
  • 相信我,SDRAM真的不难----汇总篇 ?前言

            本文是 《相信我,SDRAM真的不难》 系列文章的汇总篇。         该系列介绍了SDRAM的基本组成,对SDRAM的操作提供了一套完整的方法,并用此方法实现了几个练手的小项目。         SDRAM具有空间存储量大、读写速度快、价格相对便宜等优点。然而由于SDRAM内部利

    2023年04月11日
    浏览(26)
  • Android性能优化—ViewPagers + Fragment缓存优化

    大家看标题,可能会有点儿懵,什么是ViewPagers,因为在很久之前,我们使用的都是ViewPager,但是现在更多的是在用ViewPager2,因此用ViewPagers(ViewPager、ViewPager2)来代替两者,主要介绍两者的区别。 ViewPagers嵌套Fragment架构,在我们常用的App中随处可见,抖音的首页、各大电商

    2024年02月01日
    浏览(49)
  • Android系统-性能-优化概述

    目录 引言: APP优化: 网络优化: 内存优化: 卡顿优化: 先大概对Android性能优化做一个简单分类和梳理。由于性能影响因素多,比如本文分类的APP,内存,网络,卡顿都是互相影响的。卡顿应该是用户最直观可见的性能问题了。 APP优化侧重于启动,UI绘制以及资源优化这三

    2024年02月10日
    浏览(30)
  • Android中级——性能优化

    画面流畅需要帧数为60帧每秒 Android通过VSYNC信号触发对UI的绘制,其间隔时间是1000ms/60=16ms(即1000ms内显示60帧画面的单位时间) 故需在16ms之内完成绘制才可以保证画面的流畅 否则会造成丢帧,如一次绘制耗时20ms,当16ms时系统发出VSYNC信号还未绘制完,下一个帧就会被丢弃,

    2023年04月20日
    浏览(31)
  • Android启动速度优化

    本节主要内容:了解APP启动流程、启动状态、查看启动时间、CPU Profile定位启动耗时代码、StrictMode严苛模式检测不合理写法、解决启动黑白屏问题。 一、APP启动流程 ①用户点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求; ②system_server进程接收到

    2024年02月15日
    浏览(27)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包