【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应用的性能优化方法,不仅限于本文介绍的这些,还有很多优化的方法。总的来说的话,其实就是让应用,不做多余的事情、使用恰当的资源、提前加载以及充分利用并行。

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

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

相关文章

RK3568笔记二十四:基于Flask的网页监控系统

若该文为原创文章,转载请注明原文出处。 此实验参考 《鲁班猫监控检测》,原代码有点BUG,已经下载不了。2. 鲁班猫监控检测 — [野火]嵌入式AI应用开发实战指南—基于LubanCat-RK系列板卡 文档 (embedfire.com) 一、简介 记录简单的摄像头监…

易语言IDE界面美化支持库

易语言IDE界面美化支持库 下载下来可以看到,是一个压缩包。 那么,怎么安装到易语言中呢? 解压之后,得到这两个文件。 直接将clr和lib丢到易语言安装目录中,这样子就安装完成了。 打开易语言,在支持库配置…

在营销的世界,你一定要记住:营满,则销

营销的世界中,有一个非常重要的一件事,这几个字一定要记住: 营满,则销;营未满,则不销。 你有没有把握,这是一个没办法可以复杂的东西,真得看营销人的直觉,营跟销是独立的两件事,营在营势,销是自然而然的。这里, 什么样的客户,看到什么样的产品。会有什么样的抗…

HCIP的学习(11)

OSPF的LSA详解 LSA头部信息 ​ [r2]display ospf lsdb router 1.1.1.1----查看OSPF某一条LSA的详细信息,类型以及LS ID参数。 链路状态老化时间 指一条LSA的老化时间,即存在了多长时间。当一条LSA被始发路由器产生时,该参数值被设定为0之后…

32 OpenCV Harris角点检测

文章目录 cornerHarris 算子示例 角点检测 cornerHarris 算子 void cv::cornerHarris ( InputArray src,OutputArray dst,int blockSize,int ksize,double K,int borderType BORDER_DEFAULT) src:待检测Harris角点的输入图像,图像必须是CV 8U或者CV 32F的单通道…

Maven 在项目的 pom.xml 文件中 指定 阿里云的景象仓库

配置 在 项目的 pom.xml 文件中添加如下配置即可 <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0" xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation&…

【Unity】位图字体制作工具:蒲公英

一般来讲&#xff0c;如果需要制作位图字体&#xff0c;一般是使用 BMFont 这种第三方工具&#xff1a;BMFont - AngelCode.comhttp://www.angelcode.com/products/bmfont/ 然而这个工具对于非程序员来说&#xff0c;操作起来较为繁琐困难。每次美术修改了字体之后&…

【区块链】比特币架构

比特币架构 2009年1月&#xff0c;在比特币系统论文发表两个月之后&#xff0c;比特币系统正式运行并开放了源码&#xff0c;标志着比特币网络的正式诞生。通过其构建的一个公开透明、去中心化、防篡改的账本系统&#xff0c;比特币开展了一场规模空前的加密数字货币体验。在区…

C++手写协程项目(协程实现线程结构体、线程调度器定义,线程挂起、切换、恢复函数,模块测试)

协程结构体定义 之前我们使用linux下协程函数实现了线程切换&#xff0c;使用的是ucontext_t结构体&#xff0c;和基于这个结构体的四个函数。现在我们要用这些工具来实现我们自己的一个线程结构体&#xff0c;并实现线程调度和线程切换、挂起。 首先我们来实现以下线程结构体…

Linux常用软件安装(JDK、MySQL、Tomcat、Redis)

目录 一、上传与下载工具Filezilla1. filezilla官网 二、JDK安装1. 在opt中创建JDK目录2.上传JDK压缩文件到新建目录中3.卸载系统自代jdk4.安装JDK5.JDK环境变量配置6. 验证是否安装成功 三、安装MySQL1.创建mysql文件夹2.下载mysql安装压缩包3.上传到文件夹里面4. 卸载系统自带…

ThreeJS:光线投射与3D场景交互

光线投射Raycaster 光线投射详细介绍可参考&#xff1a;https://en.wikipedia.org/wiki/Ray_casting&#xff0c; ThreeJS中&#xff0c;提供了Raycaster类&#xff0c;用于进行鼠标拾取&#xff0c;即&#xff1a;当三维场景中鼠标移动时&#xff0c;利用光线投射&#xff0c;…

SpringCloudAlibaba:4.1云原生网关higress的搭建

概述 简介 Higress是基于阿里内部的Envoy Gateway实践沉淀、以开源Istio Envoy为核心构建的下一代云原生网关&#xff0c; 实现了流量网关 微服务网关 安全网关三合一的高集成能力&#xff0c;深度集成Dubbo、Nacos、Sentinel等微服务技术栈 定位 在虚拟化时期的微服务架构…

【DevOps】Jenkins 集成Docker

目录 1. 安装 Docker 和 Jenkins 2. 在 Jenkins 中安装 Docker 插件 3. 配置 Docker 连接 4. 创建 Jenkins Pipeline 5. 示例 Pipeline 脚本 6. 运行 Jenkins Job 7. 扩展功能 8、docker配置测试连接的时候报错处理 将 Docker 与 Jenkins 集成可以实现持续集成和持续交…

目标检测正负样本区分和平衡

1、正负样本定义 rpn和rcnn的正负样本定义都是基于MaxIoUAssigner&#xff0c;只不过定义阈值不一样而已。 MaxIoUAssigner的操作包括4个步骤&#xff1a; 首先初始化时候假设每个anchor的mask都是-1&#xff0c;表示都是忽略anchor 将每个anchor和所有gt的iou的最大Iou小于…

如何为 Nestjs 编写单元测试和 E2E 测试

前言 最近在给一个 nestjs 项目写单元测试&#xff08;Unit Testing&#xff09;和 e2e 测试&#xff08;End-to-End Testing&#xff0c;端到端测试&#xff0c;简称 e2e 测试&#xff09;&#xff0c;这是我第一次给后端项目写测试&#xff0c;发现和之前给前端项目写测试还…

Rust里的Fn/FnMut/FnOnce和闭包匿名函数关系

闭包&#xff08;英语&#xff1a;Closure&#xff09;&#xff0c;又称词法闭包&#xff08;Lexical Closure&#xff09;或函数闭包&#xff08;function closures&#xff09;&#xff0c;是引用了自由变量的函数。这个被引用的自由变量将和这个函数一同存在&#xff0c;即使…

Linux线程安全,互斥量和条件变量

文章目录 一、 Linux线程互斥1. 进程线程间的互斥相关背景概念&#xff08;1&#xff09; 临界资源和临界区&#xff08;2&#xff09; 互斥和原子性 2. 互斥量mutex3. 互斥量的接口4. 互斥量实现原理探究 二、 可重入VS线程安全1. 概念2. 常见的线程不安全的情况3. 常见的线程…

【superset】基于MySQL的BI数据分析可视化实战案例(已更新)

1.熟悉、梳理、总结下superset可视化分析实战案例知识体系,一直想探索有效可用的可视化分析方案,大多收费或不好用,这里,借此机会总结、更新下。 2.复杂度高,遇到并解决的问题较多,尝试了很多次。 3.欢迎批评指正,跪谢一键三连! 基于MySQL的BI数据分析可视化实战案例文…

Crossplane 实战:构建统一的云原生控制平面

1 什么是 Crossplane Crossplane 是一个开源的 Kubernetes 扩展&#xff0c;其核心目标是将 Kubernetes 转化为一个通用的控制平面&#xff0c;使其能够管理和编排分布于 Kubernetes 集群内外的各种资源。通过扩展 Kubernetes 的功能&#xff0c;Crossplane 对 Kubernetes 集群…

rv1126的rknn1.7.5自有模型训练部署

几乎一年前, 弄过一次rv1126的平台的推理部署, 一年时间过去了, rknn从1.7.1, 进化到了1.7.5,原有的代码不太好用了, 因为最近有个客户要做1126平台的推理, 今天下午就花了几个小时, 从头再捋了一遍. 模型训练 这部分, 跟3588平台差不多, clone下yolov5的仓库, 并check out到…