Android性能分析【启动优化】

news2024/11/27 12:32:00

作者:申国骏

性能分析工具

首先我们来学习一下如何使用性能分析的工具。我们从一个具体的例子出发,就是如何分析应用启动的性能。

Android Profiler

配置

我们来先看看Android Profiler。为了能在应用一启动就能马上捕捉到分析数据,我们需要按照下面的步骤配置一下:

  • 选择 Run -> Edit Configurations

  • 在设置里面选择Profiling的tab,然后选中Start recording CPU activity on startup。注意这里选择的Sample Java Methods,表示可以定位到Java代码。其他选项的含义查看 cpu-profiler#configurations 。 如果想有更详细的信息的话,可以选中Enable advanced profiling。

  • 在配置完之后选择Run -> Profiler

在页面启动完成之后停止监测,可以得到启动过程的CPU、内存网络和电量消耗信息,如下图:

CPU监控

分析过程

点击进入CPU模块

可以选择线程,并看到线程的具体代码耗时。 如以下例子

绿色表示我们写的代码耗时,我们可以选择主线程进行观察。这里显示在Applicaiton onCreate过程中需要耗费620ms。其中比较耗时的方法是registerByCourseKey和initYouzanSDK。并且通过Call Chart视图不断的往下看可以看出导致这个方法耗时的具体原因

通过这样不断的往下分析,就能大致定位到启动CPU耗时的原因。下面我们举一个具体的优化例子。

优化例子

优化前:

如果上图所示,在启动过程中RxBroadcast的时候带来了较大的耗时

查看代码:

private fun initBroadcast() {
    val filter = IntentFilter()
    ……
    disposables.add(RxBroadcast.fromLocalBroadcast(context, filter)
        .subscribe({ intent ->
            ……
        },
        { throwable: Throwable ->
            ……
        }
   ))
}

确实在initBroadcast使用了RxBroadcast.fromLocalBroadcast()方法,我们尝试使用LocalBroadcastManager.registerReceiver代替。修改为如下代码:

private fun initBroadcast() {
    val filter = IntentFilter()
    ……
    LocalBroadcastManager.getInstance(context).registerReceiver(broadcastReceiver, filter)
}

优化后重新进行启动CPU分析:

可以看出初始化的时间比优化前减少了90ms。由此我们也可以得到结论,使用RxBroadcast虽然比较炫酷,但是这是一个比较耗时的行为,因此应该尽量减少RxBroadcast的使用。

注意事项

  • 需要注意的是这里的耗时有些是在CPU处于Sleep状态下的。 在Sleep状态表示CPU被其他线程占用,这个时候需要分析主线程Sleep状态下其他线程的情况。例如:

这里显示主线程在00:06左右的时间处于Sleeping状态,这个时候查看其他线程的CPU占用

发现在MemoryAg的线程在占用CPU资源,这种情况下不应该认为对应的主线程方法耗时,而是要考虑例如内存回收或者其他线程占用了CPU资源的情况。

  • 还需要注意不是每次点击"Profiler"都会正常把信息记录下来,偶尔会出现应用闪退的情况,这可能是Android Studio的Bug或者是日志太大了的问题。这种情况不要灰心,多试几次就会好。

Perfetto UI

使用过程

在Android 10的手机上,开发者模式新增加了一个“系统跟踪”的功能,我们首先将开发者模式下的“系统跟踪”打开:

我们也可以从“类别”选项中选择我们关注的信息类别:

设置完之后我们会发现下拉快捷选项多了个棒棒糖形状的图标

这个时候杀掉我们需要调试的应用,然后点击开启棒棒糖,接着打开应用,等待应用完全打开之后,再点击一次棒棒糖,结束录制。

然后我们保存录制后的文件,后缀为“.perfetto-trace” 然后我们在 perfetto ui 网站上选择Open trace file上传刚刚得到的文件

渲染之后我们可以得到类似于之前systrace的分析,通过Perfetto UI我们可以更加容易操控

分析过程

首先我们需要知道,通过“系统跟踪”得到的结果是类似于在Android Studio里面Profiler选择“Trace System Calls”的结果,我们可以看到系统中所有CPU在时间轴的所有运行任务。并且我们也可以看到系统所有的进程以及进程中所有的线程任务。

我们展开Perfetto UI的调试应用里面的主线程:

可以看到线程中每个步骤的耗时。我们可以通过不断的放大来查看每个时间段的系统调用。

优化例子

优化前:

可以看出在首页inflate的过程中,有个一个“bg_simple_dict_blueriver.jpg”的图标耗时了29ms加载。分析其所在的代码:

<ImageView
    android:id="@+id/iv_simple_dict_bg"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:src="@drawable/bg_simple_dict_blueriver"
    android:scaleType="centerCrop"
    android:visibility="gone"
/>

由于这个图片只会在网络不畅的时候作为placeholder存在,因此这里简单的做法可以将

android:src="@drawable/bg_simple_dict_blueriver"

更好的办法也可以将ImageView改为ViewStub引入,在有需要的时候再渲染出来,节省布局渲染时间。 优化后:

可以看出,在优化后inflate的时间由原来的118ms降低到了103ms,并且在inflate过程中也没有了bg_simple_dict_blueriver.jpg图片加载的过程。

启动优化

有了以上的Sample Java Methods以及Trace System Calls分析,我们可以得到从宏观代码层面以及微观CPU执行层面的启动任务耗时。

Proguard & R8

除了业务的懒加载处理之外,我们可以看到dex文件的加载时间占据了大部分的启动时间。dex的加载时间跟代码量级有关。由于长期的历史引入了大量了第三方库以及本身业务增长带来的代码量增加,我们dex加载的速度也越来越慢。为了解决dex加载慢的问题,我们可以通过两个方面:首先是处理对dex加载有较大影响的加固过程,这个可以跟杭研进行沟通处理。第二就是在代码中加入代码压缩和混淆。

代码压缩和混淆可以使得dex文件变小,从而减少dex文件加载的时间。但是从零开始加入代码压缩和混淆是一个非常艰巨的过程,因为代码压缩和混淆后会导致很容易发生ClassNotFoundException以及NoSuchMethodError,并且会对诸如push、序列化等依赖类名以及属性名的代码失效。加入代码压缩和混淆需要额外的细心和较大的工作量。

在加入代码压缩和混淆的过程中,我们总结了以下的方法步骤:

本地代码

  • 检查所有使用注解的代码,加入proguard 规则
  • 检查所有JNI相关代码,加入proguard 规则
  • 检查所有使用反射的代码,加入proguard 规则
  • 检查所有序列化以及会使用Json转换为Modle的代码,加入proguard 规则
  • 检查所有根据类名来使用的代码,例如Push等,加入proguard 规则
  • 要求以后代码重构需要对Proguard进行相应改变
  • 要求新增的代码需要添加Proguard规则

三方代码

  • 判断External Libraries中的三方库引用是否是release依赖或者debug依赖,如果是的话继续
  • 判断lib库是否为目前代码所需要的,如果引用了没有使用或者引用了目前代码上所有使用的地方都已经不再使用,则清理这个lib并清理相关没有用到的代码
  • 若果lib库为目前代码所需要的,到该lib库的官网查找相应的proguard规则,并粘贴到proguard-rules.pro文件中
  • 如果该lib官网库没有相应proguard规则,则观察lib库是否有用到native代码、annotation或者反射这种需要proguard处理的地方,有的话添加相应规则
  • 添加完proguard规则之后,找到目前项目中使用到这个库的地方,尝试一下是否会有崩溃出现
  • 如果有崩溃出现,根据崩溃提示增加相应proguard规则

为了帮助到大家更好的全面清晰的掌握好性能优化,准备了相关的学习路线以及核心笔记(还该底层逻辑):https://qr18.cn/FVlo89 大家可以进行参考学习:

Android性能分析与优化实战进阶手册

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

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

相关文章

python接口自动化(十八)--重定向(Location)(详解)

简介 在实际工作中&#xff0c;有些接口请求完以后会重定向到别的url&#xff0c;而你却需要重定向前的url。URL主要是针对虚拟空间而言&#xff0c;因为不是自己独立管理的服务器&#xff0c;所以无法正常进行常规的操作。但是自己又不希望通过主域名的二级目录进行访问&#…

Linux下make和makefile的使用方法

1.make和makefile的区别 make是指令&#xff0c;makefile是文件&#xff0c;这是两者的却别。两者搭配使用&#xff0c;完成项目自动化创建。 2.make原理 make是如何工作的&#xff0c;也就是在默认情况下&#xff0c;我们只输入make命令&#xff0c;那么 1.make会在当前目录下…

Python基础:函数和函数式编程

文章目录 函数和函数式编程函数函数式编程 函数和函数式编程 函数 声明函数&#xff1a; def hello():print("hello function!")调用函数&#xff1a; # 使用()调用 hello()#output:hello function!# 没有()&#xff0c;则不进行调用&#xff0c;一切皆是对象&am…

Spring + Spring MVC + MyBatis+Bootstrap+Mysql酒店管理系统源码

IDEASpring Spring MVC MyBatisBootstrapMysql酒店管理系统源码 一、系统介绍1.环境配置 二、系统展示1. 管理员登录2.会员信息管理3.客房信息类型管理4.客房信息管理5.客房信息添加6.预定信息管理7.入住信息管理8.入住信息添加 三、部分代码UserMapper.javaUserController.j…

MySQl数据库第四课-------------努力------努力------努力

作者前言 欢迎小可爱们前来借鉴我的gtiee秦老大大 (qin-laoda) - Gitee.com —————————————————————————————————— 目录 sudo whoami who exit reboot、shutdown 软件安装 编辑器vim ————————————————————————…

9.2.2 【Linux】按键说明

第一部份&#xff1a;一般指令模式可用的按钮说明&#xff0c;光标移动、复制贴上、搜寻取代等 第二部份&#xff1a;一般指令模式切换到编辑模式的可用的按钮说明 第三部份&#xff1a;一般指令模式切换到命令行界面的可用按钮说明

公网远程连接Redis数据库「内网穿透」

文章目录 1. Linux(centos8)安装redis数据库2. 配置redis数据库3. 内网穿透3.1 安装cpolar内网穿透3.2 创建隧道映射本地端口 4. 配置固定TCP端口地址4.1 保留一个固定tcp地址4.2 配置固定TCP地址4.3 使用固定的tcp地址连接 转载自cpolar极点云文章&#xff1a;公网远程连接Red…

Python_列表比较大小

比较原理 从第一个元素顺序开始比较&#xff0c;如果相等&#xff0c;则继续&#xff0c;返回第一个不相等元素得比较结果。如果所有元素比较均相等&#xff0c;则长的列表大&#xff0c;一样长则两列表相等。 示例 a [5, 6, 3] b [5, 4, 3, 1] # 返回第1个不相等同位元素…

计算机图形硬件(二) 5 - 3 图形工作站和观察系统、输入设备

1 图形工作站和观察系统 目前&#xff0c;大多数图形监视器以光栅扫描显示的方式工作&#xff0c;一般使用 CRT或平板系统。图形系统的范围从小型通用计算机系统到多监视器及超大幅面观察屏幕。个人计算机的屏幕分辨率从640x480到1280x1024屏幕对角线从12英寸到21英寸。多数通…

基于STM32的300W无刷直流电机驱动方案

如何驱动无刷电机&#xff1f; 近些年&#xff0c;由于无刷直流电机大规模的研发和技术的逐渐成熟&#xff0c;已逐步成为工业用电机的发展主流。围绕降低生产成本和提高运行效率&#xff0c;各大厂商也提供不同型号的电机以满足不同驱动系统的需求。现阶段已经在纺织、冶金、…

【macOS 系列】下载brew或其他依赖包提示连接超时的问题解决

在下载brew或其他依赖包提示连接超时 错误信息&#xff1a; curl: (7) Failed to connect to [raw.githubusercontent.com](http://raw.githubusercontent.com/) port 443 after 34 ms: Connection refused最简单的方式&#xff0c;就是修改DNS&#xff1a;为114.114.114.114…

网络互联设备(集线器、交换机、路由器)

文章目录 一、中继器和集线器二、网桥和交换机1&#xff09;交换机的三种转发方式2&#xff09;交换机的分类3&#xff09;交换机互连方式 三、路由及路由器1&#xff09;路由器的作用2&#xff09;路由器的逻辑结构3&#xff09;路由器的硬件组成4&#xff09;路由器启动过程 …

【遍历】LeetCode二叉树的遍历、深度系列

文章目录 LeetCode题号104. 二叉树的最大深度111. 二叉树的最小深度144. 94. 二叉树的前序、中序遍历&#xff08;DFS遍历&#xff09;589. 589. N 叉树的前、后序遍历543. 二叉树的直径102. 二叉树的层序遍历 LeetCode题号 简单 104. 二叉树的最大深度&#xff08;DFS遍历法分…

C# RotationDetector 图片旋转角度检测

效果 项目 VS2022.net4.8 OpenCvSharp4Sdcb.RotationDetector 代码 using OpenCvSharp; using Sdcb.RotationDetector; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using …

项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域)

优质项目专栏&#xff1a;提升自身的硬实力&#xff1a;汇总有意义的项目设计集合&#xff0c;助力新人快速实战掌握技能&#xff0c;助力用户更好利用 CSDN 平台&#xff0c;自主完成项目设计升级&#xff0c;提升自身的硬实力。 专栏订阅&#xff1a;项目大全提升自身的硬实力…

2023MWC精彩回顾 | 未来数字世界中的社交,游戏与娱乐

6月28日至6月30日&#xff0c;由GSMA主办的2023 MWC 上海世界移动通信大会&#xff08;简称“MWC 上海”&#xff09;启幕。「Paraverse平行云」参与组织并主持了本次大会中【未来数字世界中的社交&#xff0c;游戏与娱乐】的主题会议。 「Paraverse平行云」携手上海交通大学、…

中国物流,驶入大航海时代

出海的一体化&#xff0c;不仅仅是物流的一体化&#xff0c;更是产业链、供应链的一体化。在诸多问题下&#xff0c;想要帮助企业更好地出海&#xff0c;就不能只专注于自身的长板&#xff0c;而是需要先补齐短板。 作者|斗斗 编辑|皮爷 出品|产业家 出海时代真的要来了。…

CSAPP fall2015 深入理解计算机系统 lab1 datalab详解

Data Lab data lab 数据实验 这个数据实验请在linux机器上面运行&#xff0c;实测mac m1本跑不起来。windows没试过。 centos上需要安装好gcc运行环境。 如果跑不起来记得安装下面这个东西&#xff1a; yum -y install glibc-devel.i686 运行make btest的时候可能会有warni…

药物设计学笔记:导论篇

笔记来自《药物设计学》 文章目录 1.药物设计概述 1.药物设计概述 药品&#xff08;medicine&#xff09; 药物&#xff08;durg&#xff09; 辅料&#xff0c;药物是研究对象 留意 medicine 和 drug 的区别 药物来源包括天然来源和人工来源&#xff0c;前者如吗啡&#xff0…

Oracle数据库软件安装与卸载

Oracle数据库软件安装与卸载 实验目的及要求 学习Oracle12c数据库服务器软件和客户端软件的安 装与卸载,掌握客户端服务名的设置,建立客户端与服务器的网络连接,熟悉windows操作系统中Oracle相关服务的操作。理解数据库管理的基本架构。 &#xff08;1&#xff09;熟悉Oracle…