史上最全Android性能优化方案解析_android 性能优化
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
Android中的性能优分为以下几个方面
布局优化
网络优化
安装包优化
内存优化
卡顿优化
启动优化
……
一.布局优化
布局优化的本质就是减少View的层级。常见的布局优化方案如下
-
在LinearLayout和RelativeLayout都可以完成布局的情况下优先选择LinearLayout可以减少View的层级但是注意相同组件可能RelativeLayout绘制时间长
-
使用 < include > 标签将常用的布局组件共同的部分抽取出来以便复用。
-
通过 < ViewStub > 标签来加载不常用的布局延迟加载需要的时候在activity中加载出来
-
使用 < Merge > 标签来减少布局的嵌套层次
二.绘制优化
绘制优化是指View的onDraw方法要避免执行大量的操作这主要体现在两个方面
1.onDraw中不要创建新的局部对象。
因为onDraw方法可能会被频繁调用这样就会在一瞬间产生大量的临时对象这不仅占用了过多的内存而且还会导致系统更加频繁gc降低了程序的执行效率。
2.onDraw方法中不要做耗时的任务
不能执行成千上万次的循环操作尽管每次循环都很轻量级但是大量的循环仍然十分抢占CPU的时间片这会造成View的绘制过程不流畅。
按照Google官方给出的性能优化典范中的标准View的绘制频率保证60fps是最佳的这就要求每帧绘制时间不超过16ms(16ms = 1000/60)虽然程序很难保证16ms这个时间但是尽量降低onDraw方法中的复杂度总是切实有效的。
三.网络优化
常见的网络优化方案如下:
-
尽量减少网络请求能够合并的就尽量合并
-
避免DNS解析根据域名查询可能会耗费上百毫秒的时间也可能存在DNS劫持的风险。可以根据业务需求采用增加动态更新IP的方式或者在IP方式访问失败时切换到域名访问方式。
-
大量数据的加载采用分页的方式
-
网络数据传输采用GZIP压缩
-
加入网络数据的缓存避免频繁请求网络
-
上传图片时在必要的时候压缩图片
四.安装包优化
-
安装包优化的核心就是减少apk的体积常见的方案如下
-
减少应用中不必要的资源文件比如图片在不影响APP效果的情况下尽量压缩图片有一定的效果
-
在使用了SO库的时候优先保留v7版本的SO库删掉其他版本的SO库。原因是在2018年v7版本的SO库可以满足市面上绝大多数的要求可能八九年前的手机满足不了但我们也没必要去适配老掉牙的手机。实际开发中减少apk体积的效果是十分显著的如果你使用了很多SO库比方说一个版本的SO库一共10M那么只保留v7版本删掉armeabi和v8版本的SO库一共可以减少20M的体积。
-
res资源优化
1只使用一套图片使用高分辨率的图片。
2UI设计在ps安装TinyPNG插件对图片进行无损压缩。
3svg图片一些图片的描述牺牲CPU的计算能力的节省空间。使用的原则简单的图标。
4图片使用WebP(https://developers.google.com/speed/webp/)的格式Facebook、腾讯、淘宝在用。缺点加载相比于PNG要慢很多。但是配置比较高。工具http://isparta.github.io/
5使用tintcolor(android - Change drawable color programmatically)实现按钮反选效果。
-
代码优化
1实现功能模块的逻辑简化
2Lint工具检查无用文件将无用的资源列在“UnusedResources: Unused resources”删除。
3移除无用的依赖库。
-
lib资源优化
1动态下载的资源。
2一些模块的插件化动态添加。
3so文件的剪裁和压缩。
-
assets资源优化
1音频文件最好使用有损压缩的格式比如采用opus、mp3等格式但是最好不要使用无损压缩的音乐格式
2对ttf字体文件压缩可以采用FontCreator工具只提取出你需要的文字。比如在做日期显示时其实只需要数字字体但是使用原有的字体库可能需要10MB大小如果只是把你需要的字体提取出来生成的字体文件只有10KB
-
代码混淆。
-
使用proGuard 代码混淆器工具它包括压缩、优化、混淆等功能。
-
插件化
-
可将功能模块放服务器需要用时再加载。
-
7z极限压缩
五.Android内存优化
1.Android内存管理机制
Android应用都是在Android虚拟机上运行的内存分配和垃圾回收都是由Android虚拟机来完成的。
2.常见的内存泄漏
其实内存泄漏的本质就是较长生命周期的对象引用了较短生命周期的对象。
2.1 内存泄露
内存泄漏原因堆上分配的对象已经不会再使用但是GC收集器无法对其进行回收此对象被强应用所引用 。
静态变量导致的内存泄漏
解决办法将内部类设为静态内部类或独立出来使用context.getApplicationContext()。
单例模式导致的内存泄漏
解决办法传参context.getApplicationContext()。
属性动画导致的内存泄漏
解决办法在Activity.onDestroy()中调用Animator.cancel()停止动画。
Handler导致的内存泄漏
解决办法使用静态内部类+WeakReference弱引用当外部类结束生命周期时清空消息队列。
线程导致的内存泄漏
解决办法将AsyncTask和Runnable设为静态内部类或独立出来在线程内部采用弱引用保存Context引用。
资源未关闭导致的内存泄漏
解决办法在Activity销毁的时候要及时关闭或者注销。例如
① BraodcastReceiver调用unregisterReceiver()注销
②CursorStream、File调用close()关闭
③Bitmap调用recycle()释放内存2.3版本后无需手动。
Adapter导致的内存泄漏
详情不使用缓存而只依靠getView() 每次重新实例化Item会给gc制造压力。
解决办法在构造Adapter时使用缓存的convertView。
WebView导致的内存泄漏。
详情WebView比较特殊即使是调用了它的destroy方法依然会导致内存泄漏。
解决办法其实避免WebView导致内存泄漏的最好方法就是让WebView所在的Activity处于另一个进程中当这个Activity结束时杀死当前WebView所处的进程即可我记得阿里钉钉的WebView就是另外开启的一个进程应该也是采用这种方法避免内存泄漏。
集合类泄漏
详情比如全局map等有静态应用最后没有做删除。
解决办法在onDestry时回收不需要的集合。
2.2 扩大内存
大厂的SDK可能内存泄漏会少一些但一些小厂的SDK质量也就不太靠谱一些。那应对这种我们无法改变的情况最好的办法就是扩大内存。
扩大内存通常有两种方法
一个是在清单文件中的Application下添加largeHeap="true"这个属性另一个就是同一个应用开启多个进程来扩大一个应用的总内存空间。
第二种方法其实就很常见了比方说我使用过个推的SDK个推的Service其实就是处在另外一个单独的进程中。
Android中的内存优化总的来说就是开源和节流开源就是扩大内存节流就是避免内存泄漏。
2.3 检测、分析内存泄漏的工具
MemoryMonitor随时间变化内存占用的变化情况
MAT输入HRPOF文件输出分析结果
a. Histogram查看不同类型对象及其大小
b.DominateTree对象占用内存及其引用关系
c.MAT使用教程
LeakCanary实时监测内存泄漏的库LeakCanary原理
六.卡顿优化方案
-
不要在主线程进行网络访问/大文件的IO操作
-
绘制UI时尽量减少绘制UI层次减少不必要的view嵌套可以用Hierarchy Viewer工具来检测后面会详细讲
-
当我们的布局是用的FrameLayout的时候我们可以把它改成merge,可以避免自己的帧布局和系统的ContentFrameLayout帧布局重叠造成重复计算(measure和layout)
-
提高显示速度,使用ViewStub当加载的时候才会占用。不加载的时候就是隐藏的仅仅占用位置。
-
在view层级相同的情况下尽量使用 LinerLayout而不是RelativeLayout因为RelativeLayout在测量的时候会测量二次而LinerLayout测量一次可以看下它们的源码
-
删除控件中无用的属性;
-
布局复用.比如listView 布局复用
-
尽量避免过度绘制overdraw,比如背景经常容易造成过度绘制。由于我们布局设置了背景同时用到的MaterialDesign的主题会默认给一个背景。这时应该把主题添加的背景去掉还有移除
-
XML 中非必须的背景
-
自定义View优化。使用 canvas.clipRect()来帮助系统识别那些可见的区域只有在这个区域内才会被绘制。也是避免过度绘制.
-
启动优化,启动速度的监控发现影响启动速度的问题所在优化启动逻辑提高应用的启动速度。比如闪屏页面合理优化布局加载逻辑优化数据准备.
-
合理的刷新机制尽量减少刷新次数尽量避免后台有高的 CPU 线程运行缩小刷新区域。
七.耗电优化
耗电的原因其实很多这里我就讲一下几种优化方案优化方案的反面就是他的原因了几种优化方案如下
-
合理的使用wake_lock锁wake_lock锁主要是相对系统的休眠(这里就是为了省电才做休)而言的意思就是我的程序给CPU加了这个锁那系统就不会休眠了这样做的目的是为了全力配合我们程序的运行。有的情况如果不这么做就会出现一些问题比如微信等及时通讯的心跳包会在熄屏不久后停止网络访问等问题。所以微信里面是有大量使用到了wake_lock锁。
-
使用jobScheduler2集中处理一些网络请求有些不用很及时的处理可以放在充电的时候处理比如图片的处理APP下载更新等等
-
计算优化避开浮点运算等。
-
数据在网络上传输时尽量压缩数据后再传输建议用FlatBuffer序列化技术这个比json效率高很多倍不了解FlatBuffer建议找资料学习一下。
针对“性能优化”这个要点分享给大家一份《360°全方位Android性能优化解析》这份学习手册将会带领大家一步一步深入探索Android的性能优化让产品的性能从各个方面得到提升希望大家喜欢。
这份资料一共有721页4个大点25个小章节不仅仅有详细的底层原理的解析还有专门的实践案例
《360°全方位Android性能优化解析》
第一章 设计思想与代码质量优化
1.六大原则
-
单一职责原则
-
里氏替换原则
-
依赖倒转原则
-
接口隔离原则
-
……
2.设计模式
-
结构型模式桥接模式、适配器模式、装饰器模式、代理模式、门面外观模式……
-
创建型模式建造者模式、单例模式、抽象工厂模式、工厂方法模式……
-
数据结构数组、栈、队列、链表、树……
-
算法排序算法、查找算法……
第二章 程序性能优化
1.启动速度与执行效率优化
-
冷启动和热启动解析
-
APP 启动黑白屏解决办法
-
APP 卡顿问题分析及解决方案
-
启动速度与执行效率优化之 StrictMode
-
……
2.布局检测与优化
-
布局层级优化
-
过度渲染
-
……
3.内存优化
-
内存抖动和内存泄漏
-
内存大户
-
Bitmap 内存优化
-
Profile 内存监测工具
-
Mat 大对象与泄漏检测
-
耗电优化
-
网络传输与数据存储优化网络传输与数据存储优化
-
APK 大小优化
-
屏幕适配
-
……
4.耗电优化
-
Doze&Standby
-
Battery Historian
-
JobScheduler
-
WorkManager
5.网络传输与数据存储优化
-
google 序列化工具 protobuf
-
7z 极限压缩
-
……
6.APK 大小优化
-
APK 瘦身
-
微信资源混淆原理
-
……
7.屏幕适配
-
进行适配的原理
-
屏幕分辨率限定符与 smallestWidth 限定符适配原理
-
为什么选择 smallestWidth 限定符适配
-
怎么适配其他 module
-
常见问题处理
……
8.OOM 问题原理解析
-
adj 内存管理机制
-
JVM 内存回收机制与 GC 算法解析
-
生命周期相关问题总结
-
Bitmap 压缩方案总结
-
……
9.ANR 问题解析
-
AMS 系统时间调节原理
-
程序等待原理分析
-
ANR 问题解决方案
-
……
10.Crash 监控方案
-
Java 层监控方案
-
Nativie 层监控方案
-
……
第三章 开发效率优化
- 分布式版本控制系统 Git
企业高效持续集成平台场景介绍
GIT 分布式版本控制系统
-
GIT 分支管理
-
……
2.自动化构建系统 Gradle
-
Gradle 与 Android 插件gradle 与 android gradle 插件的关系、Gradle Transform API 的基本使用……
-
Gradle Transform API 的基本使用什么是 Transform、Transform 的使用场景、Transform API 学习、输入的类型……
-
自定义插件开发Gradle 插件简介、开始准备、实践、自定义 Gradle 插件、buildSrc 模块方式……
-
插件实战多渠道打包、发版自动钉钉……
第四章 APP 性能优化实践
1.启动速度
-
应用启动的一般流程
-
冷启动和热启动
-
启动速度的测量
-
启动窗口优化
-
线程优化
-
系统调度优化
-
GC 优化
-
IO 优化
-
资源重排
-
主页布局优化
-
类加载优化
-
选择合适的启动框架
-
减少 Activity 的跳转层次
-
厂商优化
-
后台保活
-
……
-
2.流畅度
-
性能问题分析的一些工具和套路
-
通过性能数据数据分析
-
Android 平台性能导致的性能案例
-
Android App 自身导致的性能问题
-
低内存的数据特征和行为特征
-
应用宝
-
讯飞输入法无障碍服务导致的整机卡顿分析
-
字节跳动今日头条图文详情页秒开实践
-
……
-
3.抖音在 APK 包大小资源优化的实践
-
图片压缩
-
webp 无侵入式兼容
-
多 DPI 优化
-
重复资源合并
-
shrinkResource 严格模式
-
资源混淆(兼容 aab 模式)
-
ARSC 瘦身
-
……
-
4.优酷响应式布局技术全解析
-
优酷APP响应式布局技术概述
-
优酷APP响应式布局Android落地
-
在分发场景的落地
-
在消费场景的落地
-
优酷APP响应式布局之测试方案
-
……
-
5.网络优化
-
手机淘宝在网络的链路优化
-
百度 APP 在网络深度优化的实践
-
……
-
6.手机淘宝双十一性能优化项目揭秘
-
一秒法则的实现
-
启动时间和页面帧率提升 20%
-
Android 手机内存节省50%
-
……
-
7.高德 APP 全链路源码依赖分析
-
高德 APP 平台架构
-
基础实现原理
-
项目架构
-
应用场景及实现原理
-
……
-
8.彻底干掉OOM的实战经验分享
-
排查内存泄漏
-
兜底策略
-
内存峰值太高
-
特大图排查优化
-
……
-
9.微信 Android终端内存优化实践
-
Activity 泄露检测
-
Bitmap 分配及回收追踪
-
Native 内存泄漏检测
-
线程监控
-
内存监控
-
……
总结
性能优化不是更新一两个版本就可以解决的是持续性的需求持续集成迭代反馈。在实际的项目中在项目刚开始的时候由于人力和项目完成时间限制性能优化的优先级比较低等进入项目投入使用阶段就需要把优先级提高但在项目初期在设计架构方案时性能优化的点也需要提早考虑进去这就体现出一个程序员的技术功底了。希望这份《360°全方位Android性能优化解析》可以给到你帮助。
文中资料可点击下方CSDN官方认证卡片免费领取