【Android】Android应用性能优化总结
AndroidApp应用性能优化总结
最近大半年的时间里,大部分投在了某国内新能源汽车的某款AndroidApp开发上。
由于该App是该款车上,常用+重点应用。所以车厂对应用性能的要求比较高。
主要包括:
- 应用冷启动达到***ms。
- 应用热(温)启动达到***ms
- 应用内画面切换响应达到**ms
- 应用内动效/动画/车模等交互时,画面不能有延迟感等等。
- 应用不能有内存泄露,内存稳定在**MB
诸如上面的内容,还有一些,就不详细列出来了。
因为之前没有直接做过AndroidApp开发,之前大部分时间在做Framework/System开发。所以对于应用的性能优化,相当于站在系统角度,重新研究了一遍。
经历大半年时间后,曾经作为系统侧不理解应用开发人员的某些东西,突然理解了。也更加觉得,如果在应用开发前能有一个好的整体架构设计,那很多事会半功倍。
这里总结一下,Android应用总结时用到的一些方法。
启动性能优化
冷启动和温启动
Android应用启动,主要指启动App到其显示出第一帧的时间。大类上可以分为冷启动、热启动两种(细分的话,还有一种叫温启动),两种方式主要区别在于 App的进程是否已被加载。
简单理解
冷启动: Android系统Fork进程,加载App资源,然后Activity被启动走Activity的生命周期(onCreate、onStart、onResume)等等。
热启动: AndroidApp的进程已经存在,App资源已经加载完成。在这个前提下,启动App的时间(App画面显示。)
利用Trace加以分析
trace常用来分析启动的优化,可以利用AndroidStudio自带的Profile工具。也可以使用类似如下命令
# 抓取10S Trace,并保存在 /data/misc/perfetto-traces/trace_file.perfetto-trace文件中。
adb shell perfetto -o /data/misc/perfetto-traces/trace_file.perfetto-trace -t 10s sched freq idle am wm gfx view binder_driver hal dalvik camera input res memory
Anroid应用执行期间(比如启动,比如画面切换)的动作、每步消耗时间,会被记录到Trace中。然后利用AndroidStudio自带的工具,或者perfetto网站分析Trace。
如下图,通过perfetto网站分析的Trace内容。

分析Trace中主要耗时点,针对主要耗时点一般可以考虑如下优化方向:
- 资源(比如图片)加载时间是否过长?资源是否可以压缩。
- 布局类型是否合理,布局内容中是否可以写死某些内容避免动态计算
- 布局中的资源是否可以用时加载(用于优化启动速度)
- 布局嵌套是否过多?
- 是否可以利用多核特性(比如把操作分散到其他线程中,并行处理)
- 是否存在重复操作?
- 父类中是否存在多余的操作?
- 是否利用了缓存机制,让某些对象(比如View)不会反复重新创建?
- Log日志输出是否合理,是否过于频繁?
如果系统提供的Trace不足,可以在应用代码中加入自定义Trace.
Trace.beginSection("TAG")Trace.endSection();
通过仔细分析Trace,可以对应用性能做很大的提升。
利用Log分析
这里的Log指,应用自身的 Log,以及Android系统的Log。
应用自身的 Log主要包括:
- Activity生命周期的Log
- 与外部交互的Log,比如外部接口是否耗时的分析。
- 加载某些比较大资源的log。
Android系统Log主要包括:
- 性能Log,events分区的log 。通过logcat -b events 输出。性能Log中,会记录Activity每一个阶段的耗时。
- WMS、AMS、IMS的log,抓取windowmanageservice,和ActivitymanagerService的log,InputManagerservice的log,用来帮助分析应用系统。
其他优化手段
在通过Trace和Log分析应用后,对于某些无法直接优化其响应速度的内容,可以考虑
- 提前加载或初始化:放入Application中提前加载,对于热(温)启动方式有效。
- 异步加载:对于异步加载的情况下,有些时候需要使用 占位图。
- 占位图:比如加载某个动效时,动效无法立刻显示。那么使用将动效第一帧做成一个静态图,提前显示。当动效加载完成并显示后,再隐藏占位图。
- 加入动画效果:比如加入淡入、淡出的效果,单纯从视觉上优化。
内存优化
内存优化主要包括
- 应用运行时,内存是否超过标准(过大)
- 应用运行时,内存是否存在泄露情况
内存优化时,可以考虑几个方面
- 缩减App包的大小。因为App本身资源少了,内存自然少。
- 考虑代码中,是否存在不用的对象,是否可以用简单对象(比如不用Hashmap之类)。当然考虑的时候,也要考虑运行速度。
- 利用内存分析工具,分析内存是否泄露。
比如shark-cli,利用该工具可以分析App是否存在内存泄露。
shark-cli -p 包名
上面的命令输出如下结果
.....
====================================
HEAP ANALYSIS RESULT
====================================
3 APPLICATION LEAKSReferences underlined with "~~~" are likely causes.
Learn more at https://squ.re/leaks.177 bytes retained by leaking objects
Displaying only 1 leak trace out of 3 with the same signature
....
稳定性优化
稳定性,主要是指App的健壮性。不会异常崩溃,不会闪白或者闪黑。
稳定性,主要靠对应用进行测试,比如测试人员,比如自动化工具等等。
工具的话,monkey是比较常见的工具,可以通过monkey模拟用户的随机操作。关于该用法,网络上有很多说明。
Android应用的性能优化方法,不仅限于本文介绍的这些,还有很多优化的方法。总的来说的话,其实就是让应用,不做多余的事情、使用恰当的资源、提前加载以及充分利用并行。
相关文章:
【Android】Android应用性能优化总结
AndroidApp应用性能优化总结 最近大半年的时间里,大部分投在了某国内新能源汽车的某款AndroidApp开发上。 由于该App是该款车上,常用重点应用。所以车厂对应用性能的要求比较高。 主要包括: 应用冷启动达到***ms。应用热(温)启动达到***ms应…...
FBA头程海运发货流程是怎样的?
FBA头程发货作为整个FBA流程的关键一环,更是直接影响到商品从起点到终点的流通效率和成本。其中,海运作为一种经济、稳定的运输方式,在FBA头程发货中扮演着举足轻重的角色。那么,FBA头程海运发货流程究竟是怎样的呢? 1、装箱与发…...
二、VLAN原理和配置
vlan不是协议,是一个技术,虚拟局域网技术,基于802.1q协议。 vlan(虚拟局域网),将一个物理的局域网在逻辑上划分成多个广播域的技术。 目录 1.冲突域和广播域 概念 范围 2.以太网帧格式 3.以太网帧封装…...
stackqueue类——适配器模式 双端队列deque(C++)
接下来我们将实现 stack、queue 类的常用函数,其实对于 stack 和 queue 的常用函数实现可以说得上是非常简单,若想详细了解可以看这篇:栈和队列&循环队列(C/C)_栈和循环队列-CSDN博客;在本篇中我们将使…...
SpringCloud知识点梳理
1. Spring Cloud 综述 1.1 Spring Cloud 是什么 [百度百科]Spring Cloud是⼀系列框架的有序集合。它利⽤Spring Boot的开发便利性巧妙地简化了分布式系统基础设施的开发,如服务发现注册、配置中⼼、消息总线、负载均衡、断路器、数据监控等,都可以⽤ Spring Boot的开发⻛格…...
【NOI】C++程序结构入门之分支结构二
文章目录 前言一、逻辑运算符1.导入2.逻辑与(&&)3.逻辑或(||)4.逻辑非(!) 二、例题讲解问题:1656. 是两位的偶数吗问题:1658. 游乐设施问题:1659. 是否含有数字5…...
web自动化系列-使用普通模式编写测试用例以及存在问题(十六)
前面已经把selenium的主要操作介绍完毕 ,接下来我们通过编写几条测试用例感受下selenium的用法 。 1.用例需求 还是以登录为例 ,需要实现的测试用例为 : case1:输入正确的用户名和密码进行登录case2 : 输入正确的用户名和错误的…...
VSCode 配置 Qt 开发环境
文章目录 1. 环境说明2. 配置系统环境变量 1. 环境说明 操作系统:Windows 11VSCode版本:1.88.1CMake版本:3.27.7Qt6版本:6.7.0(MinGW 11.2.0 64-bit) 2. 配置系统环境变量 自行根据自己的Qt安装路径配置 配置 MinGW 和 CMake C…...
【Jenkins】持续集成与交付 (七):Gitlab添加组、创建用户、创建项目和源码上传到Gitlab仓库
🟣【Jenkins】持续集成与交付 (七):Gitlab添加组、创建用户、创建项目和源码上传到Gitlab仓库 1、创建组2、创建用户3、将用户添加到组中4、在用户组中创建项目5、源码上传到Gitlab仓库5.1 初始化版本控制5.2 将文件添加到暂存区5.3 提交代码到本地仓库5.4 推送代码到 Git…...
L1-017 到底有多二
一个整数“犯二的程度”定义为该数字中包含2的个数与其位数的比值。如果这个数是负数,则程度增加0.5倍;如果还是个偶数,则再增加1倍。例如数字-13142223336是个11位数,其中有3个2,并且是负数,也是偶数&…...
常用语音识别开源四大工具:Kaldi,PaddleSpeech,WeNet,EspNet
无论是基于成本效益还是社区支持,我都坚决认为开源才是推动一切应用的动力源泉。下面推荐语音识别开源工具:Kaldi,Paddle,WeNet,EspNet。 1、最成熟的Kaldi 一个广受欢迎的开源语音识别工具,由Daniel Pove…...
python笔记 | 哥德巴赫猜想
哥德巴赫猜想:每个不小于6的偶数都可以表示成两个素数之和。 素数:只能被1和自身整除的正整数。就是大于1且除了1和它本身之外没有其他因数的数。例如,2、3、5、7、11等都是素数,而4、6、8、9等则不是素数。 下面这段Python代码…...
IO基础-IO多路复用基础
Java的Selector封装了底层epoll和poll的API,可以通过指定如下参数来调用执行的内核调用, 在Linux平台,如果指定 -Djava.nio.channels.spi.SelectorProvidersun.nio.ch.PollSelectorProvider 则底层调用poll, -Djava.nio.channels.spi.Selec…...
Python机器学习项目开发实战:如何进行人脸识别
注意:本文的下载教程,与以下文章的思路有相同点,也有不同点,最终目标只是让读者从多维度去熟练掌握本知识点。 下载教程: Python机器学习项目开发实战_人脸识别_编程案例解析实例详解课程教程.pdf 人脸识别是一个复杂但…...
管理能力学习笔记五:识别团队角色,因才施用
识别团队角色,因才施用,需要做到以下三点 扬长避短 管理者要学会问自己员工能把什么做好,而不是想方设法改造他们的短处 。 – 彼得德鲁克 人岗匹配 将合适的人放在合适的位置 人才多样化 团队需要各式各样的人才,才能高效配合…...
Real3DPortrait照片对口型,数字人,音频/视频驱动数字人
先看效果 上传一张图片和一段音频,照片如下: 合成后效果如下: 照片对口型-音频驱动 支持音频驱动和视频驱动,视频可以使照片有参照视频中的口型和和动作。 项目地址 https://github.com/yerfor/Real3DPortrait 我的环境 win…...
Stable Diffusion之Ubuntu下部署
1、安装conda环境 conda create -n webui python3.10.6 2、激活环境 每次使用都要激活 conda activate webui 注意开始位置的变换 关闭环境 conda deactivate webui 3、离线下载SD 代码 https://github.com/AUTOMATIC1111/stable-diffusion-webui https://github.com/Stabilit…...
LeetCode-15-三数之和问题
题目说明 给定一个包含 n 个整数的数组 nums,判断 nums 中是否存在三个元素 a,b,c ,使得 a b c 0 ?找出所有满足条件且不重复的三元组。 注意:答案中不可以包含重复的三元组。 给定数组 nums [-1, 0,…...
springboot2集成东方通tongweb嵌入式版
由于最近项目需要国产化信创改造,引入东方通tongweb 联系东方通厂家 ,将依赖导入到maven仓库,并获取嵌入式版license文件修改pom.xml,引入依赖,注意springboot版本,这里以springboot2举例 首先移除springb…...
【二分查找】Leetcode 33. 搜索旋转排序数组【中等】
搜索旋转排序数组 整数数组 nums 按升序排列,数组中的值 互不相同 。 在传递给函数之前,nums 在预先未知的某个下标 k(0 < k < nums.length)上进行了 旋转,使数组变为 [nums[k], nums[k1], …, nums[n-1], num…...
RestClient
什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端,它允许HTTP与Elasticsearch 集群通信,而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级ÿ…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...
云计算——弹性云计算器(ECS)
弹性云服务器:ECS 概述 云计算重构了ICT系统,云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台,包含如下主要概念。 ECS(Elastic Cloud Server):即弹性云服务器,是云计算…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
多模态商品数据接口:融合图像、语音与文字的下一代商品详情体验
一、多模态商品数据接口的技术架构 (一)多模态数据融合引擎 跨模态语义对齐 通过Transformer架构实现图像、语音、文字的语义关联。例如,当用户上传一张“蓝色连衣裙”的图片时,接口可自动提取图像中的颜色(RGB值&…...
鸿蒙中用HarmonyOS SDK应用服务 HarmonyOS5开发一个医院查看报告小程序
一、开发环境准备 工具安装: 下载安装DevEco Studio 4.0(支持HarmonyOS 5)配置HarmonyOS SDK 5.0确保Node.js版本≥14 项目初始化: ohpm init harmony/hospital-report-app 二、核心功能模块实现 1. 报告列表…...
什么是Ansible Jinja2
理解 Ansible Jinja2 模板 Ansible 是一款功能强大的开源自动化工具,可让您无缝地管理和配置系统。Ansible 的一大亮点是它使用 Jinja2 模板,允许您根据变量数据动态生成文件、配置设置和脚本。本文将向您介绍 Ansible 中的 Jinja2 模板,并通…...
Rust 开发环境搭建
环境搭建 1、开发工具RustRover 或者vs code 2、Cygwin64 安装 https://cygwin.com/install.html 在工具终端执行: rustup toolchain install stable-x86_64-pc-windows-gnu rustup default stable-x86_64-pc-windows-gnu 2、Hello World fn main() { println…...
【SpringBoot自动化部署】
SpringBoot自动化部署方法 使用Jenkins进行持续集成与部署 Jenkins是最常用的自动化部署工具之一,能够实现代码拉取、构建、测试和部署的全流程自动化。 配置Jenkins任务时,需要添加Git仓库地址和凭证,设置构建触发器(如GitHub…...
消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...
