性能优化方向
流畅(启动速度、卡顿)
稳定(内存泄漏、崩溃)
功耗(耗电、网络)
安装包(包体积)
一、 流畅
卡顿优化
1、 布局优化
简单布局使用Java代码代替布局文件
Android加载Xml布局文件,并将其转换成View,需要经历XML解析,使用Java代码直接创建View可以省去这一过程
使用标签
:复用布局标签
: 配合使用,如果include复用的布局和其上层布局是同一种布局,则可以使用merge标签减少嵌套层级
: 在需要的时候加载。可以使用ViewStub标签来代替android:visibility=“gone”
属性。在需要的时候调用viewStub.inflate() 加载显示
1.3 减少布局嵌套层级,相同层级使用性能更好的布局
1.4 减少使用wrap_content 属性,避免View多次触发measure、layout
2、 绘制优化
避免过度绘制:
不要给View设置不必要的背景(其他无用属性也应该避免)
避免过多的层级嵌套
OnDraw()优化:
避免创建新对象
避免执行大量耗时操作
3、 避免频繁刷新View,导致View 频繁绘制
4、 避免频繁GC,导致短暂阻塞渲染
5、 UI线程中不做耗时操作(数据库、IO、或大量轻微耗时操作)
6、 生命周期优化:
在onCreate、onResume、onStart等生命周期方法中,不做太多初始化操作
7、 列表和Adapter优化:
a) Adapter中复用ItemView、避免频繁调用Adapter刷新方法
b) 列表滑动时不进行数据加载和UI刷新
c) Adapter中避免耗时操作
8、 避免同一动画多次执行,导致CPU或GPU负载过重
9、 避免ANR发生
10、使用合理的数据结构和算法
启动速度优化
冷启动:冷启动是指应用从头开始启动,系统进程在冷启动后才创建应用进程。
冷启动可以分为两个阶段:
第一阶段:
在冷启动开始时,系统有三个任务,它们是:
加载并启动应用。
在启动后立即显示应用的空白启动窗口。
创建应用进程。
第二阶段:
系统一创建应用进程,应用进程就负责后续阶段:
创建应用对象。
启动主线程。
创建主 Activity。
扩充视图。
布局屏幕。
执行初始绘制。
一旦应用进程完成第一次绘制,系统进程就会换掉当前显示的后台窗口,替换为主 Activity。此时,用户可以开始使用应用。

在创建应用和创建 Activity 的过程中可能会出现性能问题。所以冷启动优化主要针对对第二阶段优化。
优化:
1、 Application 优化
OnCreate()方法中,将耗时操作放到子线程中进行
2、 Activity 优化
a) 避免在Activity生命周期中进行耗时操作
b) 布局优化
c) 绘制优化
热启动:应用已经被启动,后台存在该应用进程,再次打开该App的过程称为热启动。
热启动后台已经存在该应用进程,所以不会走Application创建这一过程,而是直接进入Activity中
二、 稳定
内存优化
1、内存泄漏
1.1单例模式引起的内存泄露(使用全局Context)
1.2 Handler引起的内存泄漏
a)使用静态内部类继承Handler
b)使用弱引用持有当前Activity,在handleMessage()方法中判断弱引用Activity是否为空
c)页面销毁时,移除消息
1.3 非静态内部类引起内存泄漏(eg:线程的Runnable方法)
非静态内部类会持有外部类的引用,如果当前Activity销毁,类还在执行,会导致Activity被持有
1.4 图片引起的内存泄漏
大图压缩、Bitmap及时释放、使用Glide等优秀的图片缓存框架
1.5 WebView引起的内存泄漏
a)开启独立进程处理web View逻辑
b)页面销毁的时候,清空WebView内容
1.6 资源未关闭(IO、Cursor)、注册的资源未及时解除注册
1.7 动画引发的内存泄漏
及时取消动画
1.8 集合未及时清理导致的内存泄漏
将一个对象放到集合中后,集合就会持有该对象的引用,导致对象无法被回收造成对象内存泄漏
2、内存溢出
2.1 大量内存泄漏导致的内存溢出
2.2 图片过大、图片资源过多导致的内存溢出
a)大图需要压缩、缓存
b)加载图片使用优秀的开源框架(eg:Glide)
2.3 ListView的Adapter中未复用ConcertView
2.4 for循环中无线创建对象
3、 内存抖动
3.1 短时间内大量字符串拼接
3.2 for循环或者频繁刷新的地方创建对象
三、 功耗
网络优化:
目标:提高网络请求速度、节约流量
a)加载WebP格式的图片,可以大幅节约流量,提高加载速度
b)图片加载使用缓存,避免重复网络加载。优秀的图片加载框架自带缓存功能(Glide)
c) 在WiFi环境进行数据传输和下载,大文件下载使用断点续传
d)网络数据缓存,网络不好时可以使用缓存数据
e)初始界面接口划分合理,减少网络请求时间
f)设置合理的超时时间
电量优化
a)使用WiFi进行数据传输,WIFI传输数据比移动网络传输数据不仅省流量还省电
b)电量低时,不要执行非紧急任务。非紧急任务可以选择合适的时间执行
c)避免频繁的间隔进行网络操作,最好批量进行网络请求
e)网络请求时,先判断网络状态,并设置合理的超时时间,避免一直在后台等待数据
f)通过获得手机电量,决定是否执行一些耗电操作
g)避免后台频繁唤醒CPU
四、 安装包
APK结构如下:


优化方案有:
a)屏幕只适配一套代码xxh
b)使用WebP格式图片、.9图片
c)小图标使用shape或者矢量图
c)开启混淆minifyEnabled true
shrinkResources true 删除无用资源
zipAlignEnabled true 压缩优化
d)移除无用代码、资源、删除无用功能
网友评论