Android 开发之核心技术点——性能优化篇(带面试题)~

news2024/9/20 12:00:23

性能优化对于Android开发的重要性非常大。随着Android设备的不断升级,用户对应用的要求也越来越高,包括应用的运行速度、响应速度、流畅度等方面。如果应用的性能不能满足用户的需求,很可能会导致用户流失、差评以及应用被卸载等情况。

另外,随着移动互联网的普及和应用市场的竞争越来越激烈,开发人员需要尽可能地提高应用的性能,以提高用户的使用体验和满意度。同时,在性能方面的优化还可以减少应用的资源占用和耗电量,也可以为用户节省设备存储空间和流量消耗。

因此一些公司在招聘栏中就有明确的说明:

所以在面试过程中,关于性能优化的问题频率自然也不会少,下面列举了一些面试题及参考答案,大家可以进行参考,如果你在面试中被问到,你会怎么样的正面回答面试官的问题?

##1. 什么是 ANR?如何避免 ANR?

什么是 ANR?

在 Android 系统中,如果应用程序有一段时间响应不够灵敏,系统会向用户显示一个对话框,这个对话框称作应用程序无响应(ANR:ApplicationNotResponding)对话框。 用户可以选择让程序继续运行,但是,他们在使用你的应用程序时,并不希望每次都要处理这个对话框。因此 ,在程序里对响应性能的设计很重要,这样系统就不会显示 ANR 给用户。

ANR的触发

1、Activity、BroadCastReceiver、Service触发ANR的时间

Android 系统会监控程序的响应状况,不同的组件发生 ANR 的时间不一样:

  • Activity:5 秒。应用在 5 秒内未响应用户的输入事件(如按键或者触摸)
  • BroadCastReceiver :10 秒。 BroadcastReceiver 未在 10 秒内完成相关的处理
  • Service:20 秒(均为前台)。Service 在20 秒内无法处理完成

2、引起ANR的原因

  • 主线程被 IO 操作(从 4.0 之后网络 IO 不允许在主线程中)阻塞;
  • 主线程中存在耗时的计算;
  • 主线程中错误的操作,比如 Thread.wait 或者 Thread.sleep 等。

3、ANR信息查看
如果开发机器上出现问题,我们可以查看/data/anr/traces.txt,最新的 ANR 信息在最开始部分。

避免ANR的建议

1、使用 AsyncTask 处理耗时 IO 操作。
2、使用 Thread 或者 HandlerThread 时,要设置线程优先级。未调用 Process.setThreadPriority(Process.THREAD_PRIORITY_BACKGROUND)设置优先级,仍然会降低程序响应,因为默认 Thread 的优先级和主线程相同。
3、使用 Handler 处理工作线程结果,而不是使用 Thread.wait()或者 Thread.sleep() 来阻塞主线程。
4、Activity 的 onCreate 和 onResume 回调中尽量避免耗时的代码。
5、BroadcastReceiver 中 onReceive 代码也要尽量减少耗时,建议使用 IntentService 处理。

小结:

将所有耗时操作,比如访问网络,Socket 通信,查询大量 SQL 语句,复杂逻辑计算等都放在子线程中去,然后通过 handler.sendMessage、runonUIThread、 AsyncTask、RxJava 等方式更新 UI。无论如何都要确保用户界面的流畅度。如果耗时操作需要让用户等待,那么可以在界面上显示度条。

2. 如何检测内存泄漏?

内存泄漏通常是由于对象未被垃圾回收而导致的,造成了内存浪费和性能问题。我们可以通过一些工具来检测内存泄漏,例如 Android Studio 自带的 Memory Profiler,可以查看应用的内存分配和回收情况,找出内存浪费的区域;另外,我们还可以使用第三方库 LeakCanary 来检测内存泄漏,它会在应用中检测可能的内存泄漏,并输出详细的报告,方便我们快速定位问题。

3. 如何优化 ListView 或 RecyclerView 的滑动性能?

列表的滑动性能是用户体验的重要指标之一,我们可以采取以下措施来优化列表的滑动性能:

(1) 使用 ViewHolder 模式来复用 Item View,避免重复创建和销毁 View 造成性能问题;

(2) 使用异步图片加载库来异步加载图片,避免图片加载卡顿;

(3) 使用分页加载或滑动到底部自动加载的方式,避免一次性加载大量数据;

(4) 优化布局和控件的复杂度,减少嵌套,使用简单的控件,避免复杂布局导致的性能问题;

(5) 使用硬件加速和渲染缓存来提升列表的滑动性能,借助 Android 系统的优化机制实现更好的性能。

4. 如何优化应用启动时间?

应用的启动时间对用户使用体验有很大的影响,因此我们需要使用一些方法来优化应用的启动时间。一些优化策略包括:

(1) 去除无关的启动项,减少启动阶段的工作量,例如去除不必要的检查和操作;

(2) 延迟初始化,延迟占位等方式,避免应用启动阻塞,效果显著;

(3) 优化应用的资源加载,例如减小图片、资源等的大小,采用增量更新等策略;

(4) 使用 Profiler 工具等方式来分析启动过程的瓶颈,进一步优化应用的启动时间。

5. 如何优化应用的网络请求性能?

应用的网络请求性能对用户体验也有很大的影响,我们可以使用以下策略来优化应用的网络请求性能:

(1) 使用缓存机制,避免重复请求相同的数据,减少网络请求量;

(2) 使用合适的文件下载方式,例如分片下载等方式,加快下载速度,提升用户体验;

(3) 使用合适的请求库,例如 Retrofit、OkHttp 等,它们提供了更高效的请求方式和优化策略;

(4) 避免频繁的网络请求,例如避免锁屏下无用的请求等,同时也能减少资源的消耗和服务器的压力。

6. 如何避免常见的内存抖动现象?

内存抖动是由于频繁的内存分配和释放导致的,通常会造成性能问题和内存泄漏,我们可以采取以下措施来避免内存抖动:

(1) 使用合适的数据结构和算法,避免大量的对象频繁创建和销毁;

(2) 使用对象池来重用对象,避免频繁的内存分配和释放;

(3) 适当提高 Dalvik VM 的堆栈大小,减少 GC 的开销,提高性能;

(4) 避免大量的循环和递归,避免造成内存抖动或栈溢出等问题。

7. 如何优化应用的电量消耗?

应用的电量消耗是用户关注的一个问题,我们可以采取以下措施来优化应用的电量消耗:

(1) 使用合适的网络模式,例如使用始终连接模式、长轮询等方式,避免频繁的网络请求;

(2) 避免锁屏或者屏幕关闭时仍然进行无用的操作,例如避免持续的计算任务或者网络请求等;

(3) 使用省电模式,例如调整 CPU 频率、屏幕亮度、禁用传感器等方式,适当降低应用的资源消耗和电量消耗。

8. 如何优化布局的嵌套层数?

布局的嵌套层数过多会影响应用的性能,我们可以采取以下措施来优化布局的嵌套层数:

(1) 避免过度的布局嵌套;

(2) 减少视图层级,尽量使用简单的布局;

(3) 使用 ConstraintLayout 取代 LinearLayout 和 RelativeLayout;

(4) 减少 background 使用,尽量使用简单的 color 或 drawable;

(5) 删除不必要的视图。

9. 如何优化应用的数据库操作性能?

应用的数据库操作也会影响到应用的性能,我们可以采取以下措施来优化应用的数据库操作性能:

(1) 使用事务进行批量操作;

(2) 使用索引来提高查询速度;

(3) 避免查询过多数据,应该使用分页或者分块查询数据;

(4) 注意数据库表设计,避免建立大量的多对多关系;

(5) 不要在主线程进行数据库操作。

10. 如何优化应用的内存占用?

应用的内存占用也会影响到应用的性能,我们可以采取以下措施来优化应用的内存占用:

(1) 使用合适的数据结构和算法,避免大量的内存分配和释放;

(2) 注意内存释放,及时清理无用的对象和引用;

(3) 尽量避免在主线程中进行大量的计算或者 IO 操作;

(4) 使用合适的对象池和缓存机制。

11. 如何优化应用的图片加载性能?

应用中大量使用的图片也会对性能造成影响,我们可以采取以下措施来优化应用的图片加载性能:

(1) 使用网络图片加载库,例如 Glide、Picasso 等,它们可以自动处理图片的压缩和缓存等问题;

(2) 尽量使用小图片,避免加载过大的图片;

(3) 预加载,例如提前加载下一页的图片;

(4) 选择合适的图片格式,例如 PNG、JPEG 等。

12. 如何进行应用的混淆和压缩?

应用的混淆和压缩也是优化的重要手段之一,我们可以采取以下措施:

(1) 使用 Proguard 进行代码混淆;

(2) 使用 R8 进行代码混淆和压缩;

(3) 优化资源文件,例如去除无用的资源、压缩图片等;

(4) 使用签名方式对应用进行加固,提高应用的安全性。

以上都是互联网大厂必问的 Android 性能优化问题及其详解,这些问题通常会考察面试者的 Android 技术水平和问题解决能力,如果你对这块内容掌握的不很好,也不用慌!这里也为大家准备了《Android 性能优化的核心笔记》,里面记录的有启动优化、内存优化、存储优化、网络优化、UI渲染与卡顿优化、图片加载优化、性能监控……等,算是比较全面的知识点手册了,值得你去收藏参考学习。

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

启动优化

内存优化

UI优化

网络优化

Bitmap优化与图片压缩优化https://qr18.cn/FVlo89

多线程并发优化与数据传输效率优化

体积包优化

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

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

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

相关文章

boot-admin整合flowable官方editor-app进行BPMN2.0建模

boot-admin整合flowable官方editor-app源码进行BPMN2.0建模 正所谓百家争鸣、见仁见智、众说纷纭、各有千秋!在工作流bpmn2.0可视化建模工具实现的细分领域,网上扑面而来的是 bpmn.js 这个渲染工具包和web建模器,而笔者却认为使用flowable官…

2023零基础快速跟上人工智能第一梯队

写在前面:有关人工智能学什么,怎么学,什么路线等一系列问题。我决定整理一套可行的规划路线,希望帮助准备入门的朋友们少走些弯路。 下面我会推荐一个比较快速可行的学习模板,并附上我认为比较好的学习资料。 新手不建…

git使用规范文档

git使用规范文档 Git使用规范流程图 开发人员操作步骤: 第一步:clone代码 在你的本地代码库进行从远程仓库clone代码操作(100%表示clone完成) 进入项目文件,右键Git Bash Here 切换到你所进行开发的分支上 拉取该分…

JavaSE学习进阶day05_02 常见的数据结构和List接口

第三章 数据结构(掌握) 3.1 数据结构介绍 数据结构 : 数据用什么样的方式组合在一起。 科班出身的同学我想你对数据结构一点也不陌生,不知道你记不记得,当时学习数据结构的逻辑结构中的集合时,只是简单了解它&#…

hackathon 复盘:niche 海外软件工具正确的方法 6 个步骤

上周末,去参加了北京思否 hackathon,两天时间内从脑暴 & 挖掘软件 IDEA -> Demo 研发路演,这次经历让我难忘。这里我的看法是每个开发者圈友,都应该去参加一次 hackathon ~ 做 niche 软件正确的方法 这边先说结论&#xf…

vmware下Ubuntu系统中安装vscode

文章目录 前言:在线下载:离线下载包:配置C/C环境 前言: 这篇博客是为后面交叉编译程序放到树莓派上运行做的准备。同时也是自己在装过程中的一个记录。 在线与离线安装的唯一不同就是获取安装包是在线下载还是别的地方拷贝过来以…

【数据结构】- 链表之单链表(中)

文章目录 前言一、单链表(中)1.1 头删1.2尾删1.2.1第一种方法:1.2.2第二种方法:1.2.3多因素考虑 二、完整版代码2.1 SList.h2.2 SList.c2.3 Test.c 总结 前言 千万不要放弃 最好的东西 总是压轴出场 本章是关于数据结构中的链表之单链表(中) 提示&#…

数据结构与算法基础(王卓)(26)线性表的查找(2):顺序查找(二分查找、分块查找)

二、折半查找(二分或对分查找) 前置条件和前面一样 最开始根据PPT示(实)例写出的程序框架: 一开始: low:第一位 high:最后一位 mid:正中间 查找数小于mid: 把high移动到mid前面一位(…

从0搭建Vue3组件库(四): 如何开发一个组件

本篇文章将介绍如何在组件库中开发一个组件,其中包括 如何本地实时调试组件如何让组件库支持全局引入如何在 setup 语法糖下给组件命名如何开发一个组件 目录结构 在packages目录下新建components和utils两个包,其中components就是我们组件存放的位置,而utils包则是存放一些…

观看js编程范式笔记(函数式编程)

js为什么鼓励函数式编程? JavaScript(简称 JS)是一种面向对象和函数式编程语言,但它在语言层面上更加鼓励函数式编程。以下是几个原因: 函数是一等公民:在 JavaScript 中,函数被视为一等公民&a…

HANA SDA连接外部数据库到BW的步骤

咱都知道,我们不能直接从BW连接到外部数据库。第一步得从HANA database通过SDA去建一个到外部DB的连接。 数据库连接好了,那么接下来别忘了,还得建一个源系统。 也就是说第一步,我们要用HANA SDA通过Linux ODBC driver去连接外部…

Vue3表格(Table)

Vue2表格&#xff08;Table&#xff09; 可自定义设置以下属性&#xff1a; 表格列的配置项&#xff08;columns&#xff09;&#xff0c;类型&#xff1a;Array<{title?: string, width?: number, dataIndex?: string, slot?: string}>&#xff0c;默认 [] 表格数…

史上最全面的苹果公司PMO的运作模式详解

01 苹果公司PMO的发展历程 1. 初期阶段&#xff1a; 在苹果公司刚创立的早期&#xff0c;没有明确的PMO组织。项目经理直接向CEO Steve Jobs汇报&#xff0c;项目管理在公司内部较为分散。 2. 1997年-2001年&#xff1a; 在这段时间内&#xff0c;苹果公司开始成立项目管理…

PasteSpider之关于字符串模板占位字符等的说明

PasteSpider中&#xff0c;构建&#xff0c;部署等都是通过命令执行的&#xff0c;为了更加的灵活&#xff0c;引入了不同的变量&#xff0c;以便适合不同的需求使用。 命令占位符 注&#xff01;&#xff01;&#xff01;&#xff0c;占位符的格式为{{对象.属性}},他们之间没有…

【LeetCode: 1691. 堆叠长方体的最大高度 | 暴力递归=>记忆化搜索=>动态规划】

&#x1f680; 算法题 &#x1f680; &#x1f332; 算法刷题专栏 | 面试必备算法 | 面试高频算法 &#x1f340; &#x1f332; 越难的东西,越要努力坚持&#xff0c;因为它具有很高的价值&#xff0c;算法就是这样✨ &#x1f332; 作者简介&#xff1a;硕风和炜&#xff0c;…

vue2+vue3——42+

vue2vue3——42 vue2 v-cloak指令【14:14】调网速 &#xff1a; no throttling 不让慢 &#xff1b; offline 断网JS 阻塞红色 外部JS &#xff1b; 绿色 网页核心 &#xff1b; 粉色 JS 脚本红色 外部JS 我要走不了&#xff0c; 谁都别想走 &#xff1a; 绿色 不可以渲染到页面…

【安全与风险】互联网协议漏洞

互联网协议漏洞 互联网基础设施TCP协议栈因特网协议&#xff08;IP&#xff09;IP路由IP协议功能(概述)问题:没有src IP认证用户数据报协议&#xff08;UDP&#xff09;传输控制协议 (TCP)TCP报头TCP(三向)握手基本安全问题数据包嗅听TCP连接欺骗随机初始TCP SNs 路由的漏洞Arp…

【OJ比赛日历】快周末了,不来一场比赛吗? #04.15-04.21 #17场

CompHub 实时聚合多平台的数据类(Kaggle、天池…)和OJ类(Leetcode、牛客…&#xff09;比赛。本账号同时会推送最新的比赛消息&#xff0c;欢迎关注&#xff01; 更多比赛信息见 CompHub主页 或 点击文末阅读原文 以下信息仅供参考&#xff0c;以比赛官网为准 目录 2023-04-15&…

openpnp - 顶部相机辅助光的选择

文章目录 openpnp - 顶部相机辅助光的选择概述折腾的过程简易灯板市售的环形灯(不带漫射板)市售的环形灯(不带漫射板) LED单色光调光控制器.市售的环形灯(带漫射板)市售的环形灯(带漫射板) 自己拆解(降低LED灯路数)END openpnp - 顶部相机辅助光的选择 概述 终于将顶部相机…

Debain初始化配置(一)

目录 1.前言 2.简介 3.Debian11 软件包安装与配置 介绍 3.1.Debian 软件包工具 4.Debian11 软件包安装 4.1、更新索引 4.2.软件包升级 4.3.软件包安装 4.4.软件包删除 4.5.软件包清理 5.Debian11 软件包配置 6.Debian11 系统环境初始化 6.1.系统升级 6.2.安装 S…