启动性能优化

一、应用启动慢的原因

1.在主线程执行了太多耗时的操作,比如加载数据,或者初始化三方库等等,导致在Application的oncreate或者Activity的oncreate方法中耗时太久
2.布局嵌套太深,或者一些不会立即使用的布局也在一开始一起加载到内存中

二、启动耗时统计

1.使用adb命令方式统计启动时间

adb shell amstart -S -W com.example.MainActivity

-S 表示杀掉当前进程然后重启该应用
-W 表示开启应用启动耗时日志
对应的打印如下:

Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.example.appstartdemo/.MainActivity }
Warning: Activity not started, its current task has been brought to the front
Status: ok
Activity: com.example.appstartdemo/.MainActivity
ThisTime: 67
TotalTime: 67
WaitTime: 87
Complete

2.直接查看系统日志,在对应的DisPlayed关键字中,会统计应用启动到首个Activity绘制到屏幕上的时间,如下打印:

ActivityManager: Displayed com.example.appstartdemo/.MainActivity: +401ms

三、启动耗时分析

使用Android Studio自带的Profile,选择Trace Java Methods,然后开启Record,或者在Run 的时候选择Profile,就可以生成一段时间内的方法调用栈记录文件。我们通常可以用如下几种方式去打开这个Record文件:

1.火焰图(Frame Chart)方式

它会把相同的调用栈合并,然后根据执行的时间占比,生成一个个柱状图形,总体像火焰的样子。如下:
在这里插入图片描述
X轴:方法调用的时间占比,或者更精确地叫抽样数,即X轴越宽,则被抽中采样的次数越多,方法所消耗的时间就越长。
Y轴:表示调用栈,方法的调用链是由下而上的,每一个Y值都表示一个方法。
因此越在底部的方法,占用的时间就越多,因为这是方法的总入口。
柱子越高,说明调用链越深。
我们应该着重关注“平顶山”的情况,它表示柱子顶部X轴占比比较大,花费的时间比较长,这是消耗CPU的关键所在。

2.Top Down方式

显示一个调用链表中各个方法的具体执行耗时的时间值(微妙μs = 1000/1ms = 百万分之一秒),显示效果如下:
在这里插入图片描述
Total:表示该方法执行总体的耗时
Self:执行该方法本身的代码耗时,不包含子函数
Children:子函数的耗时
通过Top Down查看调用链,可以去分析耗时比较多的方法,然后去重点关注和优化。

四、启动性能优化方法

1.黑白屏的优化

由于冷启动一个新的应用,会存在一定的耗时,Google为了避免让程序看起来有延迟的情况出现,即用户点击图标后就会有即时的响应,会在App创建的过程中先显示一个空白页作为过渡。根据主题的不同,就会出现黑屏或者白屏时间比较长的情况,这是大部分用户无法容忍的,需要做优化。
优化的推荐方法是,首先自定义一个主题,继承当前的主题,然后设置它的windowbackground属性为一张跟业务相关的图片,也就是我们常见的欢迎界面,如下:

# 创建新的主题
<resources>

    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
    </style>

    <style name="MyTheme" parent="AppTheme">
        <item name="android:windowFullscreen">true</item>
        <item name="android:windowBackground">@drawable/launch_bg</item>
    </style>

</resources>

然后在manifest文件中设置该主题:

# 在清单文件中给Activity设置主题
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.appstartdemo">

    <application
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:theme="@style/MyTheme">
        </activity>
    </application>

</manifest>

设置了windowbackground属性后,那么图片会一直存在;在启动完Activity之后,需要把主题重新设置回默认主题,避免背景图还一直存在。

# Activity启动后,设置回默认的主题
public class MainActivity extends AppCompatActivity {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // 模拟耗时操作,显示更加的明显
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
        setTheme(R.style.AppTheme);
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

    }
}
2.主线程的耗时优化

2.1避免在Application的oncreate方法或者Activity的oncreate方法中,去做过多的耗时操作,比如数据加载、网络请求、第三方库的初始化等等
2.2使用idleHandler去做耗时的数据加载和网络请求、三方库的初始化
2.3使用懒加载,只有在用到的时候,才去加载数据

3.布局优化

3.1使用include标签,去包含可以重复使用的布局,减少XML代码的冗余
3.2使用merge标签去作为被include的子布局文件的顶层布局,这样在被合并到主布局之后,就可以减少一层布局的嵌套
3.3使用ViewStub标签来引入一个子布局文件,最开始是不可见的,尺寸大小为0的控件。在启动Activity加载布局的时候,并不会把ViewStub的内容加载到View树里面,只有在对ViewStub执行setvisibility或者inflate的时候,才会去真正加载布局。这相当于是View的一种懒加载,对提高启动性能很有帮助。
对于那些最开始并不会用到的子View,或者那些一开始就设置gone的子View,适合使用ViewStub。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Jira 软件缺陷管理 (软件测试)

内容来源&#xff1a;总结黑马课程 1.软件缺陷信息 2.创建缺陷问题 2.1 缺陷模板 2.2 创建缺陷问题模板

3.25作业

定义自己的命名空间&#xff0c;其中有string类型的变量&#xff0c;再定义两个函数&#xff0c;一个函数完成字符串的输入&#xff0c;一个函数完成求字符串长度&#xff0c;再定义一个全局函数完成对该字符串的反转有以下定义&#xff0c;说明哪些量可以改变哪些不可以改变&a…

【C】盛最多水的容器(双指针)

盛最多水的容器 原题目链接:点击跳转 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和(i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说…

【3D reconstruction 学习笔记 第二部】

三维重建 3D reconstruction 4. 三维重建与极几何三角化&#xff08;线性解法&#xff09;三角化&#xff08;非线性解法&#xff09;多视图几何极几何极几何约束基础矩阵估计 5. 双目立体视觉重建6. 多视图重建7. SFM 系统设计8. SLAM系统设计 4. 三维重建与极几何 三角化&…

微信SEO秘籍:6年经验,祝你轻松引流获客

我 17 年前就已经开始研究微信 SEO&#xff0c;并逐步完善成系统的教程&#xff0c;可以说是国内最早的微信 SEO 课程。至今&#xff0c;我已连续教授了 6 年&#xff01; 我自己也一直亲自操作&#xff0c;不断优化和升级我的课程&#xff0c;我的许多学员通过学习我的微信 S…

嵌入式3-25

1、输入一个数&#xff0c;实现倒叙 123-->321 2、输入一个&#xff0c;判断是否是素数 3、输入一个文件名&#xff0c;判断是否在家目录下存在&#xff0c;如果是一个目录&#xff0c;则直接输出是目录下的.sh文件的个数。如果存在则判断是否是一个普通文件&#xff0c;如果…

nba官网详情wasm逆向 第二部分

声明: 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01;wx a15018601872 本文章…

Orangedx:引领新一轮 BTCFi 浪潮

“OrangeDx 作为新一轮 BTCFi 浪潮引领者被市场寄予厚望 &#xff0c;前不久在 FinceptorApp 的平台的公开销售 20 万美元的额度仅在几秒售罄&#xff0c;而其即将以 Startup 方式登陆 Gate 平台也同样备受市场期待。” 自 Ordinals 面向市场为比特币生态带来全新的资产发行方案…

QT常见Layout布局器使用

布局简介 为什么要布局&#xff1f;通过布局拖动不影响鼠标拖动窗口的效果等优点.QT设计器布局比较固定&#xff0c;不方便后期修改和维护&#xff1b;在Qt里面布局分为四个大类 &#xff1a; 盒子布局&#xff1a;QBoxLayout 网格布局&#xff1a;QGridLayout 表单布局&am…

16:00面试,16:06就出来了,问的问题有点变态。。。

从小厂出来&#xff0c;没想到在另一家公司又寄了。 到这家公司开始上班&#xff0c;加班是每天必不可少的&#xff0c;看在钱给的比较多的份上&#xff0c;就不太计较了。没想到8月一纸通知&#xff0c;所有人不准加班&#xff0c;加班费不仅没有了&#xff0c;薪资还要降40%…

电饭煲/电磁炉/空调/机顶盒显示驱动芯片特点与相关型号推荐

电饭煲、电磁炉、空调和机顶盒等家用电器通常都包括数码管或LED显示&#xff0c;用于显示时间、温度、设置等信息。这些芯片通常具有多位数码管或LED的支持、亮度控制、多种字符和符号的显示、低功耗设计等功能。 电饭煲、电磁炉、空调和机顶盒等家用电器的显示驱动芯片通常是…

后端常问面经之计算机网络

一台机器理论上能创建多少条TCP连接&#xff1f; Linux每维护一条TCP连接都要花费内存资源的&#xff0c;每一条静止状态&#xff08;不发送数据和不接收数据&#xff09;的 TCP 连接大约需要吃 3.44K 的内存&#xff0c;那么 8 GB 物理内存的服务器&#xff0c;最大能支持的 …

Win11 安装docker 及 WSL2 并更新安装位置及迁移

1 下载并安装运行 Docker Desktop 1.1 下载 Docker Desktop 点击链接下载 Docker Desktop&#xff1a;https://desktop.docker.com/win/main/amd64/Docker%20Desktop%20Installer.exe 下载后得到&#xff1a; 1.2 通过命令行安装 Docker Desktop 在 Docker Desktop Install…

【HDFS】DatanodeAdminBackoffMonitor退役节点极慢的问题定位

一、现象: 下节点特别慢。10台节点,每台大约需要退役60w个块。但是3个小时才退役了3000多个块。 NN侧如下日志,可以看到30秒只退役了512-494 = 20个块,这要是退役600w个块,得猴年马月? 2024-03-19 14:44:42,952 INFO org.apache.hadoop.hdfs.server.blockmanagement.D…

计算机系统基础 4 寻址方式

对于一条指令&#xff0c;我们重点关注它两点&#xff1a;执行什么样的操作&#xff0c;操作数在哪里。 操作数存放的位置即为存放地址&#xff0c;一般是CPU内寄存器、主存、或者I/O设备端口。当操作数在主存时&#xff0c;我们重点关注段址/段选择符、段内偏移。 寻找操作数存…

RuoYi-Vue若依框架-代码生成器的使用

代码生成器 导入表 在系统工具内找到代码生成&#xff0c;点击导入&#xff0c;会显示数据库内未被导入的数据库表单&#xff0c;选择自己需要生成代码的表&#xff0c;友情提醒&#xff0c;第一次使用最好先导入一张表进行试水~ 预览 操作成功后可以点击预览查看效果&…

LeetCode每日一题[c++]-322.零钱兑换

题目描述 给你一个整数数组 coins &#xff0c;表示不同面额的硬币&#xff1b;以及一个整数 amount &#xff0c;表示总金额。 计算并返回可以凑成总金额所需的 最少的硬币个数 。如果没有任何一种硬币组合能组成总金额&#xff0c;返回 -1 。 你可以认为每种硬币的数量是无…

Linux系统磁盘管理

这里写目录标题 Linux系统磁盘管理磁盘容量检查磁盘分区fdisk分区gdisk分区 磁盘格式化磁盘挂载临时挂载磁盘永久挂载磁盘卸载挂载磁盘 交换分区SWAP创建swapfile格式化swap分区检测当前swap分区情况开启新建的SWAP分区关闭新建的swap分区 生产磁盘故障案例 Linux系统磁盘管理 …

【LeetCode热题100】108. 将有序数组转换为二叉搜索树

一.题目要求 给你一个整数数组 nums &#xff0c;其中元素已经按 升序 排列&#xff0c;请你将其转换为一棵 平衡二叉搜索树。 二.题目难度 简单 三.输入样例 示例 1&#xff1a; 输入&#xff1a;nums [-10,-3,0,5,9] 输出&#xff1a;[0,-3,9,-10,null,5] 解释&#x…

Python - epub2txt

文章目录 关于 epub2txt安装 命令行使用查看 options常见用法示例1 Python 代码调用manualabsl.app:absl.logging:epub2txt.__main__:absl.flags: 关于 epub2txt Convert epub file to txt github : https://github.com/ffreemt/epub2txt 安装 pip install epub2txt命令行使…