APP 性能优化你掌握的怎么样?简单聊聊?

产品性能是每个技术团队比较关心的一件事,不管是产品上线前到上线后,都需要对产品进行性能监控和优化,如果产品在运行过程中出现了问题,是很影响用户的体验感受。

所以在一些大厂技术团队中,是非常看重个人性能优化的能力,就连在招聘任职需求上面都有明确写明:

而有些Android 开发看着简历中写着会:熟悉性能优化、精通性能优化等字眼,但实际他们也就只会简单的利用第三方工具去操作。如果优化要求涉及到底层一点,人就懵了,因为在Android开发领域做业务层面开发的人群比较多,对Framework 底层逻辑这块很少有人去深入了解。其实我也能理解,毕竟我也是过来人。

下面精选了一些Android 性能优化相关的面试题,在大厂面试中也会经常遇到,大家可以将其问题先全部看一遍,如果你是面试者你会怎么回答?

1. 你使用过的性能分析工具有哪些?它们分别有什么优缺点?

答:常见的Android性能分析工具有TraceView、Systrace、Profiling、Hierarchy Viewer和MAT。

  • TraceView可以显示应用程序中每个线程的方法和调用时间,给开发者查找性能瓶颈提供帮助。但需要手动添加标记点。
  • Systrace是Android Studio提供的一种系统级能力分析工具,可以在API层面上真正检测到系统的工作状态,从而帮助我们定位到程序的性能问题。
  • Profiling跟踪应用程序的资源使用情况,包括CPU使用率、函数调用和线程活动。但也需要手动添加标记点。
  • Hierarchy Viewer显示了Android UI组件的层次结构,可以检查布局是否有效地处理其层次结构。它也可以使用渲染和图像分析工具来检查视图的性能。
  • MAT(Memory Analyzer Tool)可以帮助确认应用程序的内存使用情况并检测内存泄漏。MAT功能强大,但不易使用。

2. 如何避免内存泄漏?请提供几个示例。

答:避免内存泄漏的常用方法有:

  • 停止不再使用的对象或变量的引用。
  • 避免过度使用单例模式。
  • 确保在需要时取消对象的所有回调。
  • 释放未使用的资源,例如数据库连接和文件句柄。
  • 使用弱引用和软引用来跟踪对象,如果没有其他引用,则允许垃圾收集器回收它们。

示例1:确保在Activity销毁时从内存中释放对象引用。例如:解除未关闭的数据库连接、卸载未释放的Bitmap等。
示例2:使用finish()方法关闭Activity时,取消注册所有的广播监听器和GoogleApiClient。
示例3:避免在静态方法或全局变量中保留Context对象的引用(可使用Application Context或onCreate()方法初始化)。

3. 你如何优化应用的启动时间?

答:优化应用启动时间的常用方法有:

  • 减少多余的自定义View布局,减轻布局层次树的负担,使用相对布局和线性布局以最小化嵌套层次。
  • 避免使用过多的自定义View,使用图片或渐变背景代替明显不同的View等。
  • 尽可能缩小APK大小,删除未使用的代码或资源。
  • 使用轻量级的用户数据存储,例如SharedPreferences,避免使用大型数据库。
  • 对于网络服务,尽可能地使用线程而不是进程。
  • 延迟启动的Activity或Service。
  • 对于启动较慢的Activity,尝试使用加载动画或占位符。

4. 你会使用哪些方法来优化应用的布局渲染性能?

答:要优化应用程序的布局性能,可以采取以下措施:

  • 避免在屏幕上布置过多的控件。将其合并为一个控件可以大大提高性能。
  • 减少不必要的ViewGroup和过多嵌套的层次关系。
  • 使用ViewStub将暂时不需要的布局延迟到需要时再加载。
  • 避免在布局文件中使用过多的include。否则,对于具有重复布局的应用程序,可能会导致屏幕渲染性能下降。
  • 在ListView和RecyclerView中,尽可能地重用行,尽可能使用滑动懒加载的方式加载界面。
  • 使用相对布局可以减轻嵌套层次,并保持布局的可扩展性。

5. 你如何定位应用的瓶颈所在,并进行相应的优化?

答:定位应用程序瓶颈所在并进行相应的优化,需要遵循以下步骤:

  • 使用性能分析工具,例如TraceView和Systrace,监视应用程序的行为,检测计算密集、网络调用等瓶颈所在。
  • 对瓶颈进行分析,并尝试解决问题,例如使用异步任务、使用缓存、从网络延迟读取、缩小图像或文本等。
  • 重复这个过程并进行优化,逐步缩小瓶颈,直到应用程序的性能达到可接受水平。

6. 谈谈你对多线程编程的理解,以及在Android中如何使用多线程来提升性能?

答:多线程编程是一种技术,可以充分利用现代计算机的多核处理器,并允许程序在后台执行任务,以便在前端处理用户界面。

在Android中,我们可以使用AsyncTask、Handler和线程池(ThreadPoolExecutor和ScheduledThreadPoolExecutor)等工具来处理多线程编程。

使用多线程编程,可以提高应用程序的响应度并减少UI线程阻塞,以适当地使用线程优化应用程序的性能。但是在使用多线程编程时,需要注意避免死锁和线程安全问题。

7. 谈谈你对内存管理机制的理解,以及在Android中如何管理内存?

答:Android的内存管理机制采用了Java虚拟机的垃圾回收机制。应用程序可以分配大量的内存,并将其释放到系统中,系统会及时清理未使用的内存。

在Android中,应用程序可以使用各种存储技术来存储数据,例如SharedPreferences、SQLiteDatabase、Content Providers等。同时,可以使用Android内存分析工具来检查内存泄漏,并使用Java虚拟机的弱引用和软引用来限制内存分配。

8. 你在编写代码时有哪些注意事项,可以提高应用的性能?

答:在编写代码时,我们可以采取以下措施来提高应用程序的性能

  • 不要对代码做过多的优化,应该首先让代码跑起来,再进行优化。
  • 缩小APK大小,删除未使用的代码和资源。
  • 使用缓存和轻量级的数据存储技术,例如SharedPreferences。
  • 使用异步任务或线程来执行耗时任务以避免UI线程阻塞。
  • 避免使用过多的自定义View、ViewGroup或布局嵌套。
  • 得到一些具有挑战性的性能测试。

9. 如何判断应用的性能是否达到预期,并提供有效的优化方案?

答:为了评估应用的性能,可以依据以下几个关键指标

  • 响应速度:对于用户端应用程序,网页和其他提供用户体验的产品,响应速度一直是最重要的性能指标。
  • 资源占用:包括CPU、内存、电池和网络带宽等。应用程序需要最小化其对这些资源的使用,以便它们在其他应用程序中可用,同时避免用户的抱怨。
  • 稳定性:应用程序需要稳定运行,不会崩溃或产生异常。

若发现应用程序的性能不符合预期,可以尝试一些优化策略

  • 减少不必要的计算或I/O操作。
  • 将大量的数据保存在本地。
  • 缩小下载的资源文件或数据,优化API调用,以便在网速慢或通信质量不佳的情况下提高应用程序的性能。

10. 你是否了解预编译技术(AOT)和JIT(即时编译)技术,在什么情况下使用它们可以提高应用的性能?

答:预编译技术(AOT)和即时编译技术(JIT)都是编译方式以提高应用程序的性能。

在AOT中,应用程序在运行之前会被完全编译为机器码。所有代码都被编译一次,这可能需要一些额外的时间开销,但可以极大地提高应用程序的性能。

在JIT中,应用程序在运行时会被部分编译为机器码。JIT逐步编译应用程序中的方法,可以加快对性能的改进,但可能会导致应用程序更容易崩溃或出现内存问题。

一般情况下,AOT的编译时间会比JIT更长,但性能更优。对于需要更高性能的应用程序,可以考虑使用AOT编译。对于需要更灵活的应用程序,可以使用JIT编译。

最后

其实可以通过上面题可以看出,性能优化涉及到的知识面还是比较广的,所以想全面学好性能优化其中的所有知识点,并非一朝一夕的事,我们需要对 Framework底层原理了解,还有一些性能优化监控框架的使用,这样才有利于性能优化工作的进行。

虽然有人会说:面试造火箭,工作拧螺丝,实际运用到工作中的没有多少。

这样说也没错,但如果你工作中正好遇到了你不会的,而上面又催的紧,要你某某时间项目要上交,这时去学肯定是来不及的。还有人会说去网上找个相关的解决方案同学就可以了,那你有没有想过后续还会出什么问题呢?所以只有自己会才是最好的。

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

性能优化核心笔记:https://qr18.cn/FVlo89

  • 启动优化
  • 内存优化
  • UI优化
  • 网络优化
  • Bitmap优化与图片压缩优化
  • 多线程并发优化与数据传输效率优化
  • 体积包优化
    在这里插入图片描述

《Android 性能监控框架》:https://qr18.cn/FVlo89

《Android Framework学习手册》:https://qr18.cn/AQpN4J

  1. 开机Init 进程
  2. 开机启动 Zygote 进程
  3. 开机启动 SystemServer 进程
  4. Binder 驱动
  5. AMS 的启动过程
  6. PMS 的启动过程
  7. Launcher 的启动过程
  8. Android 四大组件
  9. Android 系统服务 - Input 事件的分发过程
  10. Android 底层渲染 - 屏幕刷新机制源码分析
  11. Android 源码分析实战

猜你喜欢

转载自blog.csdn.net/maniuT/article/details/130610107
今日推荐