Android APP性能优化(一)
Android APP性能优化(最新总结)
思考优化
- 稳定(内存溢出、崩溃)
- 流畅(卡顿)
- 耗损(耗电、流量)
- 安装包(APK瘦身)
一、稳定——内存优化
使用分析工具
- Memory Monitor 工具:
- Memory Analyzer工具:
MAT 是一个快速,功能丰富的 Java Heap 分析工具,通过分析 Java 进程的内存快照 HPROF 分析,从众多的对象中分析,快速计算出在内存中对象占用的大小,查看哪些对象不能被垃圾收集器回收,并可以通过视图直观地查看可能造成这种结果的对象。
- LeakCanary工具:
简单,傻瓜式操作。这个工具是在Github开源的,是Square公司出品的,不是有一句话嘛,Square出品必属精品,https://github.com/square/leakcanary我们可以在Gradle里引用它。
- Android Lint 工具:
稳定性建议
二、流畅——交互优化
四个方面大致归为如下两类:
- 界面绘制:主要原因是绘制的层级深、页面复杂、刷新不合理,由于这些原因导致卡顿的场景更多出现在 UI 和启动后的初始界面以及跳转到页面的绘制上。
- 数据处理:导致这种卡顿场景的原因是数据处理量太大,一般分为三种情况,一是数据在处理 UI 线程,二是数据处理占用 CPU 高,导致主线程拿不到时间片,三是内存增加导致 GC 频繁,从而引起卡顿。
总结原因:我们知道Android的绘制步骤是::Measure、Layout、Draw,所以布局的层级越深、元素越多、耗时也就越长。还有就是Android 系统每隔 16ms 发出 VSYNC 信号,触发对 UI 进行渲染,如果每次渲染都成功,这样就能够达到流畅的画面所需的 60FPS。如果某个操作花费的时间是 24ms ,系统在得到 VSYNC 信号时就无法正常进行正常渲染,这样就发生了丢帧现象。那么用户在 32ms 内看到的会是同一帧画面,无法在 16ms 完成渲染,最终引起刷新不及时。两个根本原因:
绘制任务太重,绘制一帧内容耗时太长。
主线程太忙,根据系统传递过来的 VSYNC 信号来时还没准备好数据导致丢帧。
建议1:布局优化
- 布局复用,使用<include>标签重用layout;
- 提高显示速度,使用<ViewStub>延迟View加载;
- 减少层级,使用<merge>标签替换父级布局;
注意使用wrap_content,会增加measure计算成本;
删除控件中无用属性;
建议2:绘制优化
布局上的优化。移除 XML 中非必须的背景,移除 Window 默认的背景、按需显示占位背景图片
自定义View优化。使用 canvas.clipRect()来帮助系统识别那些可见的区域,只有在这个区域内才会被绘制。
建议3:启动优化
UI 布局。应用一般都有闪屏页,优化闪屏页的 UI 布局,可以通过 Profile GPU Rendering 检测丢帧情况。
启动加载逻辑优化。可以采用分布加载、异步加载、延期加载策略来提高应用启动速度。
数据准备。数据初始化分析,加载数据可以考虑用线程初始化等策略。
建议4:刷新优化
- 减少刷新次数;
- 缩小刷新区域;
建议5:动画优化
- 在实现动画效果时,需要根据不同场景选择合适的动画框架来实现。有些情况下,可以用硬件加速方式来提供流畅度。
三、节省——耗电优化
在移动设备中,电池的重要性不言而喻,没有电什么都干不成。对于操作系统和设备开发商来说,耗电优化一致没有停止,去追求更长的待机时间,而对于一款应用来说,并不是可以忽略电量使用问题,特别是那些被归为“电池杀手”的应用,最终的结果是被卸载。因此,应用开发者在实现需求的同时,需要尽量减少电量的消耗。
在 Android5.0 以前,在应用中测试电量消耗比较麻烦,也不准确,5.0 之后专门引入了一个获取设备上电量消耗信息的 API:Battery Historian。Battery Historian 是一款由 Google 提供的 Android 系统电量分析工具,和Systrace 一样,是一款图形化数据分析工具,直观地展示出手机的电量消耗过程,通过输入电量分析文件,显示消耗情况,最后提供一些可供参考电量优化的方法。
除此之外,还有一些常用方案可提供:
计算优化,避开浮点运算等。
避免 WaleLock 使用不当。
使用 Job Scheduler。
四、APK瘦身
应用安装包大小对应用使用没有影响,但应用的安装包越大,用户下载的门槛越高,特别是在移动网络情况下,用户在下载应用时,对安装包大小的要求更高,因此,减小安装包大小可以让更多用户愿意下载和体验产品。
常用应用安装包的构成,如图所示:
从图中我们可以看到:
assets文件夹。存放一些配置文件、资源文件,assets不会自动生成对应的 ID,而是通过 AssetManager 类的接口获取。
res。res 是 resource 的缩写,这个目录存放资源文件,会自动生成对应的 ID 并映射到 .R 文件中,访问直接使用资源 ID。
META-INF。保存应用的签名信息,签名信息可以验证 APK 文件的完整性。
AndroidManifest.xml。这个文件用来描述 Android 应用的配置信息,一些组件的注册信息、可使用权限等。
classes.dex。Dalvik 字节码程序,让 Dalvik 虚拟机可执行,一般情况下,Android 应用在打包时通过 Android SDK 中的 dx 工具将 Java 字节码转换为 Dalvik 字节码。
resources.arsc。记录着资源文件和资源 ID 之间的映射关系,用来根据资源 ID 寻找资源。
减少安装包大小的常用方案
代码混淆。使用proGuard 代码混淆器工具,它包括压缩、优化、混淆等功能。
资源优化。比如使用 Android Lint 删除冗余资源,资源文件最少化等。
图片优化。比如利用 AAPT 工具对 PNG 格式的图片做压缩处理,降低图片色彩位数等。
避免重复功能的库,使用 WebP图片格式等。
插件化。比如功能模块放在服务器上,按需下载,可以减少安装包大小。
五、小结:
最后说一句,性能优化是一个非常具有挑战性的工作,上面列出很多分析内存、优化内存的方法,但是真正优化工作远不止这么简单,这里只是列举了一些入门的方法,而要进行完美的内存优化、内存分析绝非一日之功,需要开发者深厚的技术功底合耐心。
Android APP性能优化(一)相关推荐
- Android APP性能优化
转载自:https://www.cnblogs.com/qwangxiao/p/8727229.html Android APP性能优化(最新总结) 导语 安卓大军浩浩荡荡,发展已近十个年头,技术优化 ...
- Android App 性能优化系列结语篇
Android App 性能优化系列结语篇 原文出处:http://gold.xitu.io/post/581f4ad667f3560058a33057 关于Android App的优化, 从第一篇的 ...
- Android App性能优化系列
Android App性能优化系列 关于Android App的优化,从第一篇的计划开始,到内存优化的系列文结束,不知不觉近三个月的时间,写了十五六篇相关的博文,算是对自己的知识的一个系统化,也希望能 ...
- Android App 性能优化总结
Android App 性能优化系列结语篇 转发自:http://blog.lmj.wiki/2016/11/06/app-opti/app_opt_summary/#more 关于Android A ...
- Android App 性能优化之稳定性
Android App性能优化之稳定性问题分类 1. ANR 2. Crash 3. 应用退出 1. ANR ANR(Application Not Responding 应用程序无响应) 1.1大致 ...
- Android App性能优化十技巧
无论锤子还是茄子手机的不断冒出,Android系统的手机市场占有率目前来说还是最大的,因此基于Android开发的App数量也是很庞大的.那么,如何能开发出更高性能的Android App?相信是软件 ...
- Android App性能优化之内存优化
为什么要进行内存优化? 1.App运行内存限制,OOM导致App崩溃 2.App性能:流畅性.响应速度和用户体验 Android的内存管理方式 Android系统内存分配与回收方式 ● 一个App ...
- Android App性能优化总结
优化方向 Android系统性能已经非常流畅了.但是,到了各大厂商手里,改源码自定系统,使得Android原生系统变得鱼龙混杂,然后到了不同层次的开发工程师手里,因为技术水平的参差不齐,即使很多手机在 ...
- android app性能优化大汇总(UI渲染性能优化)
UI性能测试 性能优化都需要有一个目标,UI的性能优化也是一样.你可能会觉得"我的app加载很快"很重要,但我们还需要了解终端用户的期望,是否可以去量化这些期望呢?我们可以从人机交 ...
最新文章
- 北京科技大学转专业到计算机,北科大学生全可转专业
- 【helloworld】-微信小程序开发教程-入门篇【1】
- java 对 mongoDB 分组统计操作 以及一些常用操作
- 您好GroovyFX
- 跳一跳python_微信跳一跳python怎么刷分?跳一跳python怎么使用?
- oracle 拉文件进ubuntu,ubuntu 18-20 安装oracle java 打开jnlp文件
- Android 进程间通信——Service、Messenger
- 至诚学院MATLAB第四次,MATLAB 第二次实验课课堂作业(4学时)
- 【赠书活动】清华社的两本Android技术书籍
- 2018年AI要怎么“玩”?李飞飞和李开复在达沃斯论坛上给出这几点…
- POJ 1182 食物链(带权并查集)
- 2017年美国大学生数学建模竞赛E题O奖65123论文解读
- 3次样条曲线差值函数c++实现
- opencv-图像平滑处理
- labelme为圆环状物体打标签【tips】
- 【着色器实现Shine局部或整体扫光效果_Shader效果第三篇】
- 国内著名声学期刊简介
- PTA题目 : 用指针实现将一个3*3的整型矩阵转置
- python输入名字、输出欢迎你_Python交互环境下打印和输入函数的实例内容
- shell的一些基础