美文网首页
你做过哪些性能优化?

你做过哪些性能优化?

作者: 我要离开浪浪山 | 来源:发表于2023-03-21 07:15 被阅读0次

一、性能优化的好处?

  1. 减少 OOM,可以提高程序的稳定性。

  2. 减少卡顿,提高应用流畅性。

  3. 减少内存占用,提高应用后台存活性。

  4. 减少程序异常,降低应用 Crash 率, 提高稳定性。

二、减少 OOM,可以提高程序的稳定性

1、减少 OOM

在应用开发阶段我比较喜欢用 LeakCanary这款性能检测工具,好处是它能实时的告诉我具体哪个类发现了内存泄漏(如果你对 LeakCanary 的原理了解的话,可以说一说它是怎么检测的)。

还有我们要明白为什么应用程序会发送 OOM ,又该怎么去避免它?

发生 OOM 的场景是当申请 1M 的内存空间时,如果你要往该内存空间存入 2M 的数据,那么此时就会发生 OOM。

在应用程序中我们不仅要避免直接导致 OOM 的场景还要避免间接导致 OOM 的场景。间接的话也就是要避免内存泄漏的场景。

内存泄漏的场景是这个对象不再使用时,应用完整的执行最后的生命周期,但是由于某些原因,对象虽然已经不再使用,仍然会在内存中存在而导致 GC 不会去回收它,这就意味着发生了内存泄漏。(这里可以介绍下 GC 回收机制,回收算法,知识点尽量往外扩展而不脱离本题)

2、最后在说一下在实际开发中避免内存泄漏的场景:

1、资源型对象未关闭: Cursor,File
2、注册对象未销毁: 广播,回调监听
3、类的静态变量持有大数据对象
4、非静态内部类的静态实例
5、Handler 临时性内存泄漏: 使用静态 + 弱引用,退出即销毁
6、容器中的对象没清理造成的内存泄漏
7、WebView: 使用单独进程

三、减少卡顿

怎么减少卡顿? 那么我们可以从 2 个原理方面来探讨卡顿的根本原因,第一个原理方面是绘制原理,另一个就是刷新原理。

1、绘制原理:

31eb294c630d0d8ad4f9396646e0137.png

2、刷新原理:

View 的 requestLayout 和 ViewRootImpl##setView 最终都会调用 ViewRootImpl 的 requestLayout 方法,然后通过 scheduleTraversals 方法向 Choreographer 提交一个绘制任务,然后再通过 DisplayEventReceiver 向底层请求 vsync 垂直同步信号,当 vsync 信号来的时候,会通过 JNI 回调回来,在通过 Handler 往消息队列 post 一个异步任务,最终是 ViewRootImpl 去执行绘制任务,最后调用 performTraversals 方法,完成绘制。

详细流程可以参考下面流程图:

e84bcb20632af9f28732d19ee6dcb25.png

3、卡顿的根本原因:

从刷新原理来看卡顿的根本原理是有两个地方会造成掉帧:

  • 一个是主线程有其它耗时操作,导致doFrame 没有机会在 vsync 信号发出之后 16 毫秒内调用;
  • 还有一个就是当前doFrame方法耗时,绘制太久,下一个 vsync 信号来的时候这一帧还没画完,造成掉帧。

4、怎么避免卡顿:

一定要避免在主线程中做耗时任务,总结一下 Android 中主线程的场景:

  • 减少刷新次数
  • 避免非必要的刷新
  • 尽量使用属性动画,它减少了自身的重绘。
  • 减少页面布局的层级;
  • 父布局套子布局也是尽量只设置其中一个背景

还有一个最重要的就是避免内存抖动,不要在短时间内频繁的内存分配和释放。

5、布局优化分析工具:

a680825e14cce1b9769dc58e2c1e32fe.png

6、优化方案:

a86073a6ccb31ac2d2d4aeabf8c0894b.png

四、减少内存占用

1、AutoBoxing(自动装箱): 能用小的坚决不用大的。
2、内存复用
3、使用最优的数据类型
4、 枚举类型: 使用注解枚举限制替换 Enum
5、图片内存优化(这里可以从 Glide 等开源框架去说下它们是怎么设计的)
6、选择合适的位图格式
7、bitmap 内存复用,压缩
8、图片的多级缓存
9、基本数据类型如果不用修改的建议全部写成 static final,因为 它不需要进行初始化工作,直接打包到 dex 就可以直接使用,并不会在 类 中进行申请内存
10、字符串拼接别用 +=,使用 StringBuffer 或 StringBuilder
11、不要在 onMeause, onLayout, onDraw 中去刷新 UI
12、尽量使用 C++ 代码转换 YUV 格式,别用 Java 代码转换 RGB 等格式,真的很占用内存

五、其他优化

1、你们 APK 有多大?有做过 APK 体积相关的优化吗?

79e65d44fc0171764c801ecd8b867e6.png

2、有做过日志优化吗?

dbce88cd561d4b0d86cd71f895a97c2.png

3、你们项目的耗电量怎么样? 有做过优化吗?

在没有优化之前持续工作 30 分钟的耗电量是 8%, 优化后是 4%。

d09f6b0d0903a94449176c83e94a4549.png

4、你在项目中有做过自定义 View 吗?有对它做过什么优化?

有做过。比如重复绘制,还有大图长图有过优化。

82f87ec9852265cdf6ca256ea4815431.png

5、ANR

2a24030eff2a6559d23eac9b3d91fe12.png

6、后台存活

8b16e7a82a9b5cf0a6d6b40ef4fab730.png

7、说说你在项目中网络优化?

f3baf678de03cdca7cf060bd554e7628.png

8、你在项目中有用过哪些存储方式? 对它们的性能有过优化吗?

主要用过 sp,File,SQLite 存储方式。其中对 sp 和 sqlite 做了优化。

171dceb78c7bdb58a4785e21305f05a6.png

参考:https://blog.csdn.net/apple_4872330/article/details/125670555

相关文章

  • 大厂面试问题广?先来看看这些Android高级面试题你都掌握了没

    一、性能优化 1、做过哪些性能优化?是怎么评测和具体优化的?2、为什么WebView加载会慢呢?3、如何优化自定义...

  • 前端面试必问及加分点---性能优化篇

    如何进行网站性能优化 你有用过哪些前端性能优化的方法? 谈谈性能优化问题 代码层面的优化 前端性能优化最佳实践

  • 关于Android性能优化,该从哪些方面入手?

    关于Android性能优化,该从哪些方面入手? 一、Android性能优化的方面 针对Android的性能优化,...

  • 前端性能优化

    对于前端的性能优化,主要有分为加载优化和性能优化。在Google官方文档中,给出了性能优化有哪些好处。前端优化的最...

  • JavaScript 性能优化

    介绍 性能优化是不可避免的哪些内容可以看做性能优化无处不在的前端性能优化 JavaScript内存管理 为什么要使...

  • Nginx性能优化

    1.性能优化概述 基于Nginx性能优化,我们将分为如下⼏个⽅⾯来做介绍1.⾸先我们需要了解性能优化要考虑哪些⽅⾯...

  • iOS

    一、做过的东西有哪些亮点? 二、OC 1、启动优化、列表卡顿、性能监控(工具和手动实现的方案) 2、对象内存存在哪...

  • 2018最新 Android 面试题总结(三)

    Q:项目中如何做性能优化的? 举例说明项目注意了哪些方面的性能优化,如布局优化、绘制优化、内存泄漏优化、 响应速度...

  • Android性能优化专题(持续更新)

    面试官:今日头条启动很快,你觉得可能是做了哪些优化? Android 性能优化之内存检测、卡顿优化、耗电优化、AP...

  • App优化 - ANR优化

    前言 App优化 - 需要优化哪些? App优化 - 性能分析工具 App的3种启动方式 App优化 - App启...

网友评论

      本文标题:你做过哪些性能优化?

      本文链接:https://www.haomeiwen.com/subject/djzurdtx.html