Android 性能优化总结
App 流畅运行,是用户体验的第一步。App 流程运行,涉及到性能优化,主要涉及到布局优化, 绘制优化,内存泄漏优化,响应速度优化,列表展示优化,Bitmap 优化,线程优化,包大小优化。
布局优化
- 布局优化的思路是减少布局层次。
- 同等层次的情况下,能使用 LinearLayout 和 FrameLayout 实现的效果,不用 ReleativeLayout 。
- 布局复杂的情况,使用 LinearLyout 需要增加层次的情况下,使用 ReleativeLayout ,可以减少层次
- 更加复杂的布局,使用约束布局 ContraintLayout
- 使用 include 复用布局
- include 配合 merge 减少层级
- 使用 ViewStub 按需加载
- 布局背景绘制
- 不需要绘制背景的 View ,去掉背景图
绘制优化
- 绘制优化指在 View 的 onDraw 的操作优化
- 不要在 onDraw 方法创建新的局部对象, onDraw 会比较频繁的调用,会创建大量的布局对象,不仅占用内存,而且系统更加频繁 gc
- 不要在 onDraw 方法中执行耗时任务,也不能执行大量的循环操作,循环会大量占用 CPU 时间片,造成绘制不流畅。
内存泄漏优化
- 内存泄漏是 app 优化的一个重点,需要从两个方面重视
- 平时开发避免写有内存泄漏的代码
- 使用工具进行检测
- 内存泄漏优化
- 单列模式或静态变量造成内存泄漏 ---> 单例或者静态变量引用生命周期长的对象比如 Application 的 context
- 集合造成内存泄漏 ---> 不使用的集合清空
- 内部类或者匿名内部类造成内存泄漏 ---> 使用静态内部类或者外部类,或者使用弱引用
- 资源使用完未关闭造成泄漏 ---> 使用完以后关闭,解绑观察者
启动速度优化
- 启动速度分为冷启动,热启动和温启动
- 冷启动指应用程序从头开始,可能会出现白屏或者黑屏的情况,针对该问题的优化点
- 在 Mainifest 文件给第一个 activity 设置一个带有背景的 theme ,这样就不会白屏或者黑屏的,体验比较的好点,但是治标不治本
在 Application 中的初始化内容,能往后挪的就往后挪,能异步的就异步处理
冷启动优化: https://developer.android.google.cn/topic/performance/vitals/launch-time
响应速度优化
- 不在 UI 线程做耗时操作,耗时操作异步处理
- ANR
- ANR 是指在 UI 线程做了耗时操作
- Activity 5秒
- BroadcastReceiver 10秒
- ANR 是指在 UI 线程做了耗时操作
RecyclerView 优化
- RecyclerView 作为 ListView 的继任者,针对 ViewHolder 做了缓存处理,但是针对大量的列表还是需要做优化的
- 避免在 BindViewHolder 中执行耗时操作
- 列表滑动过程中不适合开启大量的异步任务
- 分页加载数据
Bitmap 优化
- Bitmap 是个吃内存大户,需要对 Bitmap 做好优化,Bitmap 优化比较简单
- Bitmap 优化
- 对图片质量压缩
- 对图片尺寸压缩
- 加载巨图,显示局部
- 使用 .so 库进行压缩
线程优化
- 线程优化的思路是使用线程池,避免创建大量的 Thead,因为创建和销毁线程也需要花费时间的,使用线程池可以做到线程的复用。
- 针对实际业务需求,做定制化的线程池
包大小优化
- 包的大小很关键,以我工作单位的包为例,目前已经到了53M 大小了,该项目在开始的时候才1M。53M下载安装还是很费流量和时间的。
- 包大小优化
- 压缩 png,jpg 资源
- 能使用 XML 实现的效果,不使用图片
- 把 png,jpg 转换为 webp
- 删除无用的 drawable 资源
- 删除 asset 无用资源
- 开启代码混淆,即 minifyEnable = true ,开启混淆,会帮忙删除不用的代码,压缩和优化
性能建议
- 避免创建过多的对象
- 不要过多使用枚举,枚举比整形内存占用空间大
- 常量使用 static final 修饰
- 使用 Android 特有的数据结构,比如 SparseArray
- 适当使用 软引用和弱引用
- 采用内存缓存和硬盘缓存
- 尽量使用静态内部类,不要采用匿名内部类和内部类
工具
- 内存泄漏工具- LeakCancary
- LeakCancary
- MAT
- Android Profiler: https://developer.android.google.cn/studio/profile/android-profiler
- 布局优化工具
- Layout Inspector(Android Studio->Tools->Android->Layout Inspector)
- 说明:通过该工具,可以截取到当前页面的布局树,从根目录 DecorView 开始,很清晰明了的显示出来了布局深度,可以针对的减少布局层次,对布局优化很有帮忙。

- 说明:通过该工具,可以截取到当前页面的布局树,从根目录 DecorView 开始,很清晰明了的显示出来了布局深度,可以针对的减少布局层次,对布局优化很有帮忙。
- Layout Inspector(Android Studio->Tools->Android->Layout Inspector)
- 卡顿工具
- BlockCancary
- 启动优化
- Android Device Monitor
- 在需要优化的地方插入
Debug.startMethodTracing("timeTrace")和Debug.stopMethodTracing(),然后在系统的根目录下找到 timeTrace.trace 文件,拿出来用 Android Device Monitor 打开,可以看到每个方法花费的时间和调用的次数,以及谁调用的他,他调用了谁,进一步优化节省每一 ms ,减少冷启动启动时间。
- 在需要优化的地方插入
- Android Device Monitor
- 静态代码工具
- Inspect Code - Android Lint
- 完成功能开发以后,运行
Inspect Code,位于 Analyze -> Inspect Code
- 完成功能开发以后,运行
- Inspect Code - Android Lint
Android 性能优化总结的更多相关文章
- 【腾讯Bugly干货分享】Android性能优化典范——第6季
本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/580d91208d80e49771f0a07c 导语 这里是Android性能优 ...
- android 性能优化
本章介绍android高级开发中,对于性能方面的处理.主要包括电量,视图,内存三个性能方面的知识点. 1.视图性能 (1)Overdraw简介 Overdraw就是过度绘制,是指在一帧的时间内(16. ...
- Android性能优化典范第二季
Google前几天刚发布了Android性能优化典范第2季的课程,一共20个短视频,包括的内容大致有:电量优化,网络优化,Wear上如何做优化,使用对象池来提高效率,LRU Cache,Bitma ...
- Android性能优化典范第一季
2015年伊始,Google发布了关于Android性能优化典范的专题,一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关 ...
- Android性能优化文章转载
今天看到几篇比较好的文章就转了!(链接如下) 转载注明出处:Sunzxyong Android性能优化之Bitmap的内存优化 Android性能优化之常见的内存泄漏 Android最佳实践之Syst ...
- 《Android性能优化》学习笔记链接<转载>
今天找到一博文汇总了 Android性能优化 比较好的文章 ,本计划全看完,自己再精简下,因篇幅太长,先收藏了,等有时间 再仔细拜读,总结自己的看法: 第一季: http://www.csdn.ne ...
- [转]Android性能优化典范
2015年伊始,Google发布了关于Android性能优化典范的专题,一共16个短视频,每个3-5分钟,帮助开发者创建更快更优秀的Android App.课程专题不仅仅介绍了Android系统中有关 ...
- [Android Pro] Android性能优化典范第一季
reference to : http://www.cnblogs.com/hanyonglu/p/4244035.html#undefined 2015年伊始,Google发布了关于Android性 ...
- Android性能优化系列 + Android官方培训课程中文版
Android性能优化典范 - 第6季 http://hukai.me/android-performance-patterns-season-6/ Android性能优化典范 - 第5季 htt ...
- Android性能优化之布局优化
最新最准确内容建议直接访问原文:Android性能优化之布局优化 本文为Android性能优化的第二篇——布局优化,主要介绍使用抽象布局标签(include, viewstub, merge).去除不 ...
随机推荐
- 操作系统动态内存管理——malloc和free的工作机制
动态内存分配 就 是指在程序执行的过程中动态地分配或者回收存储空间的分配内存的方法. malloc()是C语言中动态存储管理 的一组标准库函数之一.其作用是在内存的动态存储区中分配一个长度为size的 ...
- 【Java多线程】线程同步方法概览
一:使用syncrhoized内置锁实现同步 使用互斥来实现线程间的同步,保证共享数据在同一时刻只被一个线程使用.Java中最基本的互斥手段就是syncrhoized关键字. syncrhoized的 ...
- UVA 10733 - The Colored Cubes(Ploya)
UVA 10733 - The Colored Cubes 题目链接 题意:一个立方体.n种颜色,问能涂成多少不同立方体 思路:Ploya求解,正方体相应24种不同旋转一一计算出循环个数就可以.和 U ...
- 〖Linux〗简单的将Shell和一些文件打包成一个单独的“可执行文件”
有时候给别人分享一个工具的时候,同时需要提供的文件比较多: 如果分享一个压缩包还得教会对方如何解压.执行哪个脚本,感觉需要传输的内容多了就不方便: 把几个Shell脚本和文件打包成一个“单独的可执行文 ...
- Xamarin.Android服务的实现
一.服务的生命周期 服务与活动一样,在它的整个生命周期中存在着一些事件,下图可以很好解释整个过程以及涉及到的方法: 在真实的使用中,Service来还包含一个OnBind方法,并且必须要使用该方法,但 ...
- Axure JS弹窗提示部件
百度网盘:http://pan.baidu.com/s/1c1ZjUPq
- Eclipse和MyEclipse使用技巧--MyEclipse下创建的项目导入到Eclipse中详细的图文配置方法
一.情景再现. 有些人比较喜欢用Myeclipse开发,有些人却比较喜欢用eclipse开发.但是其中有一个问题,Myeclipse里面的项目导入的时候出现了一个小小的问题. 如下: 二.说明问题 导 ...
- 【laravel5.4】php artisan 常用命令
路由缓存:/www/wd***/php/bin/php artisan route:cache 查看全部路由并输出到txt文件:/www/wd***/php/bin/php artisan r ...
- 一个正则表达式,只含有汉字、数字、字母、下划线,下划线位置不限【Z】
1.一个正则表达式,只含有汉字.数字.字母.下划线不能以下划线开头和结尾: ^(?!_)(?!.*?_$)[a-zA-Z0-9_\u4e00-\u9fa5]+$ 其中: ^ 与字符串开始的地方匹配 ( ...
- 用dockerfile构建基于centos系统的jar包的镜像
实际示例: [root@master01 home-dataline]# ls dataline.jar Dockerfile jdk-8u181-linux-x64.tar.gz [root@mas ...