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

news2025/1/20 14:46:26

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

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

而有些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 源码分析实战

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

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

相关文章

面向开发人员的 ChatGPT 提示词教程中文版

面向开发人员的 ChatGPT 提示词教程中文版 1. 指南1-1. 提示的指南1-2. 配置1-3. 提示语原则原则 1: 写出清晰而具体的指示技巧 1: 使用分隔符来清楚地表明输入的不同部分技巧 2: 要求提供结构化的输出技巧 3: 要求模型检查条件是否得到满足技巧 4: "少许样本"提示 原…

为你推荐一款最好用的免费截图工具-Snipaste,截图高清、智能模糊还支持滚动长截图!!!

写文章经常需要插入截图, 但是常常很难有顺手的截图工具, 常见的难题是: 很难滚动长屏截图, 截图中马赛克处理很麻烦, 输出的截图图像质量差。 经过大量的工具使用对比, 这里推荐一个最好用的截图工具。 Sn…

Fotran学习:chapter8函数

1.子程序(subrountine)的使用 把常常用于使用、具有特定功能的程序代码独立出来,封装程子程序,以后调用使用call即可。 program chapter4_exercise !主程序implicit nonecall sub1()call sub2()pauseend program chapter4_exercisesubroutine sub1() !子…

产品经理制,互联网公司发扬光大的

产品经理制,在互联网公司发扬光大 张小龙被称作:七星产品经理 其实,中小企业老板基本是首席产品经理 趣讲大白话:像带孩子一样做产品 【趣讲信息科技160期】 **************************** 产品经理制核心问题解决的是&#xff1a…

STM32F4_随机数发生器(RNG)

目录 1. 随机数发生器RNG是什么 2. RNG随机发生器框图 3. 运行RNG 4. RNG寄存器 4.1 RNG控制寄存器:RNG_CR 4.2 RNG状态寄存器:RNG_SR 4.3 RNG数据寄存器:RNG_DR 5. 库函数配置随机数发生器 6. 实验程序 6.1 main.c 6.2 RNG.c 6.…

植物奶站上风口

不知不觉间,植物奶无处不在。逛街,便利店里有燕麦奶、椰奶、豆奶,星巴克、肯德基有燕麦拿铁;打开小红书,有人做各种植物奶产品的测评结果,有人分享优质植物奶的自制方法…… 这场“风”并非空穴而来。 一…

软件工程开发文档写作教程(07)—招投标文件写作规范

本文原创作者:谷哥的小弟作者博客地址:http://blog.csdn.net/lfdfhl本文参考资料:电子工业出版社《软件文档写作教程》 马平,黄冬梅编著 招投标文件概述 国内的软件项目招投标文件的写作规则并不存在行业标准。许多大型企业的信息…

面向开发人员的 ChatGPT 提示词教程 - ChatGPT Prompt Engineering for Developers

面向开发人员的 ChatGPT 提示词教程 - ChatGPT Prompt Engineering for Developers 1. 指南(原文: Guidelines)1-1. 提示的指南(原文: Guidelines for Prompting)1-2. 配置1-3. 提示语原则(原文: Prompting Principles)原则 1: 写出清晰而具体的指示(原文: Write clear and spe…

【近期解决的小问题】

文章目录 写在前面1. Win10中USB转串口设备安装完成驱动显示感叹号(USB不能用)背景尝试过的方法其他解决方法 2. 安装Win7虚拟机“缺少所需的CD/DVD驱动器设备驱动程序”背景尝试过的方法 3. WMware安装Kali Linux后黑屏左上角光标闪烁背景尝试过的方法 …

Java设计模式 12-模版模式

模板模式 一、豆浆制作问题 编写制作豆浆的程序,说明如下: 1)制作豆浆的流程 选材—>添加配料—>浸泡—>放到豆浆机打碎 2)通过添加不同的配料,可以制作出不同口味的豆浆 3)选材、浸泡和放到豆浆机打碎这几个步骤对于制作每种口味的豆浆都是一…

关于使用SSM框架搭建的项目的运行方法

目录 运行环境配置 1、安装 IDEA 开发工具 中文版设置 JDK直接下载 2、安装 MYSQL 数据库 2.1 下载安装 2.2 配置环境变量 2.4 安装 MySQL 2.4 进入 MySQL 2.5 常见问题 3、安装Tomcat 4、IDEA配置MYSQL 4.1、常见错误 5、IDEA配置TOMCAT 5.1、常见报错 一 运行环…

2023年最新无脑安装 Go lang 环境配置并编写、运行、打包第一个 Golang 程序详细步骤,附带图文教程

文章目录 下载安装Golang配置 Golang 环境GO111MODULEGOPROXY开启 Go mod 模式及设置包下载国内镜像配置 Vscode Golang 环境 Bug 集锦The "gopls" command is not available.Run "go get -v golang.org/x/tools/gopls" to install. GO语言也称为Golang&am…

烽火HG680-J/V-Hi3798MV100-当贝纯净桌面-卡刷固件包

烽火HG680-J/V-Hi3798MV100-当贝纯净桌面-卡刷固件包 特点: 1、适用于对应型号的电视盒子刷机; 2、开放原厂固件屏蔽的市场安装和u盘安装apk; 3、修改dns,三网通用; 4、大量精简内置的没用的软件&…

【ArcGIS教程】批量裁剪

ArcGIS教程:批量裁剪 1 裁剪1.1 准备:创建shp文件/选定区域、自由选区1.1 单一裁剪1.2 批量裁剪(Batch) 2 批量裁剪参考 1 裁剪 1.1 准备:创建shp文件/选定区域、自由选区 步骤1: 创建shp文件 打开ArcCat…

2023年了,来体验下前端的测试方案

在当前的前端当中,有好多同学自己写的代码bugger横飞,怎么解决这个问题呢🤔🤔🤔?个人觉得主要有以下两个趋势 给前端的代码加上类型检查(ts)给前端代码编写单元测试和e2e测试 当然&a…

【C++】继承和多态、共有私有和保护、重写

区分继承与多态、辨别public、protected、private 继承与多态的概念继承与多态的区别与联系区别:联系:示例结果: 继承和访问的权限说明示例:结果 结论 继承与多态的概念 面向对象三大原则:封装、继承、多态。继承是一种…

【C++进阶1--继承】面向对象三大特性之一(附菱形继承讲解

继承是面向对象中很重要的特性,今天就来讲讲C中的继承。 文中不足错漏之处望请斧正! 什么是继承? 是一种类的复用,可以让B类继承,从而使B类获得A类的所有成员。 A类叫做父类或基类,B类叫做子类或派生类。…

C++ 构造函数-2

构造函数-2 构造函数体赋值 在对象创建的时候,编译器会调用构造函数,给对象当中的成员赋一个合适的初始值。 class Date { public: Date(int year, int month, int day) { _year year; _month month; _day day; } private: int _year; int _month; i…

Android framework工程师一定要知道的高级技巧

作为一名android framework工程师,你是否对Android framework的一些高阶使用技巧感到陌生?想了解更多的细节?如果是这样,那么就请你读下去。本篇文章我将为大家相信介绍Android framework的高阶技巧,帮助你成为一名高级…

【Nginx】【SSL】Nginx上配置ssl证书

配置需要有自己的域名和云主机;域名已经解析到主机;安装好Nginx 一、申请免费版的SSL证书 1、阿里云可以申请免费版的SSL证书 阿里云搜索 ssl 找到 数字证书管理服务/SSL 证书>免费证书;申请一个免费的 2、下载SSL证书到本地&#xf…