Android的性能优化主要从以下几个方面进行优化的:
- 稳定(崩溃、内存溢出)
- 流畅(卡顿)
- 耗损(耗电、流量)
- 安装包(APK瘦身)
稳定
获取Android的crash信息
1、实现Thread.UncaughtExceptionHandler
首先需实现一个UncaughtExceptionHandler对象,在它的uncaughtException方法中获取异常信息并将其存储在SD卡中或者上传到服务器供开发人员分析,然后调用Thread的setDefaultUncaughtExceptionHandler方法将它设置为线程默认的异常处理器,由于默认处理器是Thread类的静态成员,因此它的作用对象是当前进程的所有线程。
2、在Application中注册
3、添加权限
内存泄漏
常见的内存泄漏:
- 静态引用(自身代码和第三方代码)
- 集合内引用
- Handler消息未清除
- 非静态的内部类中持有外部内的应用
- 匿名内部类/非静态内部类和异步线程
检查方法
我使用的是leakCanary工具,
流畅
布局优化
- 删除布局中无用的控件和层数
- 有选择的使用性能较低的ViewGroup。
- 布局复用,采用标签重用layout。<include> <merge> ViewStub
- 注意使用wrap_content,会增加measure计算成本
- 提高显示速度,使用延迟View加载
- 删除控件中无用的属性
绘制优化
- onDraw方法中不要创建新的局部对象。这是因为onDraw方法可能会被频繁调用。
- onDraw方法中不要做耗时的任务,也不能执行成千上万次的循环操作。
过度绘制
- 减少布局层级
- 去除不必要的背景
- 优化自定义View的计算
启动优化
视觉体验优化
设置闪屏图片主题,为了更顺滑无缝衔接我们的闪屏页,可以在启动 Activity 的 Theme中设置闪屏页图片,这样启动窗口的图片就会是闪屏页图片,而不是白屏。
<style name="AppTheme" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowBackground">@drawable/lunch</item> //闪屏页图片
<item name="android:windowFullscreen">true</item>
<item name="android:windowDrawsSystemBarBackgrounds">false</item><!--显示虚拟按键,并腾出空间-->
</style>
代码优化
https://blog.youkuaiyun.com/qian520ao/article/details/81908505
Application优化
我们可以根据这些组件的轻重缓急之分,对初始化做一下分类 :
- 必要的组件一定要在主线程中立即初始化(入口 Activity 可能立即会用到)
- 组件一定要在主线程中初始化,但是可以延迟初始化。
- 组件可以在子线程中初始化。
放在子线程的组件初始化建议延迟初始化 ,这样就可以了解是否会对项目造成影响!
闪屏页业务优化
应用App通常会设置一个固定的闪屏页展示时间,例如2000ms,所以我们可以根据用户手机的运行速度,对展示时间做出调整,但是总时间仍然为 2000ms。
闪屏页政展示总时间 = 组件初始化时间 + 剩余展示时间。
也就是2000ms的总时间,组件初始化了800ms,那么就再展示1200ms即可。
节省 耗电优化
计算优化。算法,for循环优化Switch...case替代if...else、避开浮点运算。
避免Wake Lock使用不当
使用Job Scheduler管理后台任务