说起性能优化,很多人都感觉头痛不已,近些年来也是无数人在面试中因为性能优化而折戟沉沙。其实抽丝剥茧开来,Android的性能优化,主要从以下几个方面开展:
稳定(内存溢出、崩溃)
-
流畅(卡顿)
-
耗损(耗电、流量)
-
安装包(APK瘦身)
(一)稳定——内存优化
(1)Memory Monitor 工具:Android Studio自带的一个内存监视工具,它可以很好地帮助我们进行内存实时分析。通过点击Android Studio右下角的Memory Monitor标签,打开工具可以看见较浅蓝色代表free的内存,而深色的部分代表使用的内存从内存变换的走势图变换,可以判断关于内存的使用状态。
(2)LeakCanary:Square公司基于MAT开发的一款监控Android内存泄漏的开源框架:利用了Java的WeakReference和ReferenceQueue,通过将Activity包装到WeakReference中,被WeakReference包装过的Activity对象如果被回收,该WeakReference引用会被放到ReferenceQueue中,通过监测ReferenceQueue里面的内容就能检查到Activity是否能够被回收(在ReferenceQueue中说明可以被回收,不存在泄漏;否则,可能存在泄漏。
(3)Android Lint :Android Lint Tool 是Android Sutido集成的一个Android代码提示工具,它可以给你布局、代码提供非常强大的帮助。硬编码会提示级别警告。
(二)流畅——卡顿优化
卡顿的场景通常发生在用户交互体验中。影响卡顿的两大因素,分别是界面绘制和数据处理。
界面绘制:主要原因是绘制的层级深、页面复杂、刷新不合理,由于这些原因导致卡顿的场景更多出现在 UI 和启动后的初始界面以及跳转到页面的绘制上。
数据处理:导致这种卡顿场景的原因是数据处理量太大,一般分为三种情况,一是数据在处理 UI 线程,二是数据处理占用 CPU 高,导致主线程拿不到时间片,三是内存增加导致 GC 频繁,从而引起卡顿。
(三)节省——耗电优化
(1)计算优化。算法、for循环优化、Switch…case替代if…else、避开浮点运算。浮点运算比常规运算更复杂,因此计算机进行浮点运算速度要比进行常规运算慢得多。
(2)避免 Wake Lock 使用不当。Wake Lock是一种锁的机制,主要是相对系统的休眠而言的,,只要有人拿着这个锁,系统就无法进入休眠意思就是我的程序给CPU加了这个锁那系统就不会休眠了,这样做的目的是为了全力配合我们程序的运行。
(3)使用 Job Scheduler 管理后台任务。在Android 5.0 API 21 中,google提供了一个叫做JobScheduler API的组件,来处理当某个时间点或者当满足某个特定的条件时执行一个任务的场景,例如当用户在夜间休息时或设备接通电源适配器连接WiFi启动下载更新的任务。这样可以在减少资源消耗的同时提升应用的效率。
(四)安装包——APK瘦身
(1)安装包的组成结构assets文件夹。存放一些配置文件、资源文件,assets不会自动生成对应的 ID,而是通过 AssetManager 类的接口获取。
(2)减少安装包大小代码混淆。使用IDE 自带的 proGuard 代码混淆器工具 ,它包括压缩、优化、混淆等功能。资源优化。
还有冷启动、热启动等很多性能优化方面的技巧,在这里就不展开赘述了。大家可以看到性能优化涉及到的知识可以说是比较繁杂。为了帮助大家更好地掌握好性能优化相关内容,这里给大家分享一份2022大厂性能优化项目实战宝典。我们可以看下已经在大厂中的开发者,对于性能优化有着怎样的心得,需要的可以文末点击卡片扫码免费领取:
腾讯团队
- 腾讯光影研究室—Android P之Smart Linkify
- 腾讯Bugly—动态下发 so 库在 Android APK 安装包瘦身方面的应用
- QQ音乐—彻底弄懂浏览器缓存策略
- QQ音乐Android编译提速之路
- 全民k歌适配arm64-v8a方案
- 全民K歌内存篇1——线上监控与综合治理
- 全民K歌内存篇2——虚拟内存浅析
- 全民K歌内存篇3——native内存分析与监控
- 腾讯Bugly—对字符串匹配算法的一点理解
字节团队
- 字节跳动技术团队— 深入理解Gradle框架之一:Plugin,Extension, buildSrc
- 字节跳动技术团队—深入理解gradle框架之二:依赖实现分析
- 字节跳动技术团队—Scene:Android 开源页面导航和组合框架
- 字节跳动技术团队—AwCookieManager.nativeGetCookiecrash 排查
- 字节跳动技术团队—另类 BadTokenException 问题分析和解决
- 字节跳动技术团队—抖音包大小优化-资源优化
- 字节跳动技术团队—二维码扫描优化
- 字节跳动—Android Camera内存问题剖析
- 抖音BoostMultiDex优化实践:Android低版本上APP首次启动时间减少80%
- 抖音BoostMultiDex优化实践:Android低版本上APP首次启动时间减少80%(二)
- 抖音 Android 性能优化系列:Java 内存优化篇
- 今日头条 Android ‘秒’ 级编译速度优化
阿里团队
- 支付宝客户端架构解析:Android 客户端启动速度优化之「垃圾回收」
- 支付宝 App 构建优化解析:通过安装包重排布优化 Android 端启动性能
- 支付宝 App 构建优化解析:Android 包大小极致压缩
- 解决支付宝包体积优化的遗留问题:运行时获取dexpc
- 闲鱼技术—曾梦想 if-else 走天涯?看看“责任树模式”优化
- 闲鱼如何在2个月内实现Android启动速度翻倍的?
- 高德技术—Android Native 内存泄漏系统化解决方案
- 天猫精灵技术—史上最全Android渲染机制讲解(长文源码深度剖析)
百度团队
- 百度APP-Android H5首屏优化实践
- 百度App技术—一种简单优雅的TextView行间距适配方案
- 百度App技术—Android 10分区存储介绍及百度APP适配实践
- 百度App技术—Gradle 与 Android 构建入门
- 百度App组件化之路
- 百度App网络深度优化系列《三》弱网优化
网易团队
- 网易新闻客户端 H5 秒开优化
- 网易新闻构建优化:如何让你的构建速度“势如闪电”
- 网易传媒技术团队—AOP技术在客户端的应用与实践
- 网易大数据|互联网产品决策秘笈: AB测试
美团团队
- 美团技术团队—Android静态代码扫描效率优化与实践
- 美团技术团队—Probe:Android线上OOM问题定位组件
- 美团技术团队—移动端UI一致性解决方案
- 美团—设计稿(UI视图)自动生成代码方案的探索
- …
- …
爱奇艺团队
- 爱奇艺技术产品团队—干货|安卓APP崩溃捕获方案——xCrash
- Android篇 | 爱奇艺App启动优化实践分享
- 二维码扫描优化及爱奇艺App的实践
谷歌团队
- 谷歌开发者—Flutter 您需要知道的知识点
- 谷歌—协程中的取消和异常 | 异常处理详解
- …
- …
京东团队
- 京东技术—任意URL跳转漏洞修复与JDK中getHost()方法之间的坑
- 京东—LayoutInflater原理分析与复杂布局优化实践
- …
- …
搜狐团队
- 搜狐技术产品—深入理解Flutter多线程
- …
- …
其他
- 花椒Android端自动化测试实践
- 开源 | BoostMultiDex:挽救 Android Dalvik 机型APP升级安装体验
- 有赞移动Crash平台建设
- 贝壳APP Top Experience系列 | Android方法耗时统计工具
- 一种按照library的维度进行Android包大小分析的方法和实践
- …
- …