当前位置: 首页 > news >正文

android——关于app性能优化篇

前言

应用性能优化是指通过各种技术手段和优化策略,提高应用程序的性能,使其能够更高效地运行和响应用户操作。

下面介绍一些常见的应用性能优化方法

一、布局优化

1、减少嵌套

  • 嵌套层数尽量少,使用ConstaintLayout能使层级大大降低
  • 尽量使用RelativeLayout和LinearLayout

2、使用抽象布局标签include、merge、ViewStub

  • 布局复用,使用标签重用layout
  • 减少层级,使用标签merge替换父级布局
  • 提高显示速度,使用ViewStub延迟显示

***注意:***使用wrap_content,会增加measure计算成本;

二、内存优化

及时释放不再使用的对象,避免内存泄漏;合理使用内存缓存,例如使用 LruCache 进行图片缓存;避免频繁的对象创建和销毁。

可以从两方面入手:内存溢出和内存泄漏
1.内存溢出的解决方案:

  1. 修改JVM启动参数,直接增加内存 (-Xms –Xms 参数一定不要忘记加)
  2. 检查错误日志查看 OutOfMemory 错误前是否有其他异常或错误
  3. 对代码进行分步运行分析,找出可能发生溢出的位置

重点排查一下几点:
一、检查是否一次获取大量数据的查询,一般来说,一次获取十万条以上的记录到内存,就可能产生内存溢出.所以大家在开发的时候,需要考虑如果上线后需要获取大量数据,增加预防次问题,对此建议查询尽量使用分析查询

二、检查代码是否有死循环或递归调用

三、检查是否有大量循环重复产生新对象实体

四、检查List Map等集合对象是否使用完后,未清除的问题,List Map等集合对象始终会有对对象的引用,这样的对象便不会被GC回收

2.内存泄漏解决方案:
android常见内存泄漏主要有以下几类:

  1. Handler 引起的内存泄漏
  2. 单例模式引起的内存泄漏
  3. 非静态内部类创建静态实例引起的内存泄漏
  4. 非静态匿名内部类引起的内存泄漏
  5. 注册/反注册未成对使用引起的内存泄漏
  6. 资源对象没有关闭引起的内存泄漏
  7. 集合对象没有及时清理引起的内存泄漏

三、App瘦身优化

可优化的地方有:
1、lint使用
采用lint工具,删除了大量无用的资源。有一定作用。Android studio集成了lint工具,检测“unused resoure“及unused declaration等。这里我们使用lint检测了无用的资源文件。

2、其他团队so库的体积减少,作用明显著,尤其类似于百度地图,直播软件

3、代码冗余部分:效果非常有限,你再减少也少不了几kb

4、使用图片压缩工具,有一定作用
Google推荐图片压缩工具:https://developers.google.com/speed/docs/insights/OptimizeImages,
市面上有许多工具可用来对JPEG和PNG文件执行进一步的无损压缩,且不会对图片质量造成任何影响。对于JPEG文件,我们建议您使用jpegtran或jpegoptim(仅适用于Linux;使用–strip-all选项运行)。对于PNG文件,我们建议使用OptiPNG或PNGOUT。

5、H5页面,作用明显,而且H5适配非常简单啊

6、支持插件so,插件支持网络加载so及更新原则,作用明显

7、代码混淆,jar包资源混淆、
8、TinyPng压缩图片

四、绘制优化

避免过度绘制,减少不必要的绘制操作;使用硬件加速来加快绘制速度;避免频繁地请求布局和绘制。

五、网络优化

合理使用网络请求,避免不必要的请求;使用异步任务或线程池来处理网络请求;对图片进行压缩和缩放,减小网络传输的数据量

六、数据库优化

合理使用数据库操作,避免频繁的数据库读写操作;使用合适的数据库查询语句,优化数据库查询速度。

七、代码优化

  1. 减少方法的调用次数和计算量;避免在主线程中进行耗时操作,使用异步任务或线程池来处理耗时操作;合理使用缓存,减少对资源的重复加载。
  2. 减少冗余代码、简化算法、优化循环和递归等。可以使用工具进行代码分析,找出潜在的性能问题并进行优化。

八、APK 文件优化

使用 ProGuard 来混淆和压缩 APK 文件;使用 App Bundle 来优化应用的体积。

九、动画优化

避免频繁的动画操作,减少动画帧率的消耗;使用属性动画来进行流畅的动画操作。

十、响应性能优化

减少界面卡顿现象,避免在主线程中进行耗时操作;合理使用线程池、消息队列等机制,提高界面的响应速度。

http://www.lryc.cn/news/348014.html

相关文章:

  • 单链表经典算法LeetCode--203.移除链表元素(两种方法解)
  • MySQL—子查询
  • ffmpeg 读取流报错: Non-monotonous DTS in output stream
  • yo!这里是socket网络编程相关介绍
  • polars学习-03 数据类型转换
  • IDC 权威认可!Aloudata 入选金融领域中数据管理分析服务最佳实践案例
  • RSA与AES算法比较及应用场景推荐
  • 揭秘 HTTP 代理:增强在线活动的安全性和匿名性
  • 【经验】mysql冷热数据分离
  • 【机器学习-06】Scikit-Learn机器学习工具包进阶指南:机器学习分类模型实战与数据可视化分析
  • 蓝桥杯国赛每日一题:日志统计(双指针)
  • 佛山MES公司(盈致mes系统服务商)助力企业实现智能制造
  • 算法设计课第五周(贪心法实现活动选择问题)
  • Ubuntu20.04右键打不开终端
  • XML元素
  • 融入新科技的SLM27211系列 120V, 3A/4.5A高低边高频门极驱动器兼容UCC27284,MAX15013A
  • 代码随想录算法训练营Day 38| 动态规划part01 | 理论基础、509. 斐波那契数、70. 爬楼梯、746. 使用最小花费爬楼梯
  • CSS拟物按钮
  • websevere服务器从零搭建到上线(三)|IO多路复用小总结和服务器的基础框架
  • 解决宝塔Nginx和phpMyAdmin配置端口冲突问题
  • 光伏EPC管理软件都有哪些功能和作用?
  • BGP学习一:关于对等体建立和状态组改变
  • ETL工具kettle(PDI)入门教程,Transform,Mysql->Mysql,Csv->Excel
  • 常见地图坐标系间的转换算法JavaScript实现
  • 基于python的大麦网自动抢票工具的设计与实现
  • 2024年5月树莓集团快讯
  • 网站localhost和127.0.0.1可以访问,本地ip不可访问解决方案
  • Docker Dockerfile如何编写?
  • Python数独游戏
  • 24 | MySQL是怎么保证主备一致的?