Android性能优化

一、防止程序闪退

Android出现闪退和崩溃主要有以下三个原因

  1. ANR(程序无响应):原因是系统规定在四大组件中不能做耗时过多的操作

    解决:看anr日志具体分析

  2. Exception(异常) 出现了程序员意想不到的错误。

    一般用try-catch包裹可能抛出异常的代码。

    通过Thread.setDefaultUncaughtExceptionHandler(Thread.UncaughtExceptionHandler)不过全局异常

  3. LMK(低内存)Android默认分配给虚拟机的内存是有限的。当系统内存太低会触发LMK,出现闪退、崩溃现象。

    可以通过在application节点中设置属性android:largeHeap=”true”来设置最大可分配多少内存空间就可以突破一定限制

    LeakCanary工具:检查内存泄漏

二、防止画面卡顿

画面卡顿问题一般分为如下两类:

  1. 界面绘制:主要原因是绘制的层级深、页面复杂、刷新不合理。这些原因导致的卡顿场景一般出现在UI和启动后的初始界面以及跳转到页面的绘制上
  2. 数据处理:朱阳原因是数据处理量大,一般分为三种情况,一是数据在处理UI线程,二是数据处理占用CPU高,导致主线程拿不到时间片,三是内存增加导致频繁GC

解决方案:

  1. 布局优化:如果一个Viw树的高度太高会严重影响测量、布局、绘制的速度。

    • 使用约束布局(ConstraintLayout)减少布局层次
    • 使用标签替换父级布局,减少层次
    • 使用延迟Viw加载(懒加载)提高显示速度
    • 注意使用wrap_content,会增加计算成本
  2. 绘制优化:过度绘制是指在屏幕上的某个像素在同一帧的时间内被绘制了多次。在多层次的重叠的UI结构中,如果不可见的UI也在做绘制的操作,就会导致某项像素被绘制了多次,浪费了Cpu以及Gpu的资源

    • 布局上的优化,移除Xml里的非必需的背景,移除Window默认的背景、按需显示占位背景图
    • 自定义View优化,使用canvas.clipRect()帮助系统识别那些可见区域,只有在这个区域内才会被绘制
  3. 启动优化:启动优化

    • 启动黑白屏问题:设置windowsBackground欺骗用户的眼睛
    • 启动加载逻辑优化处理:Application里只放必须的初始化方法,可以异步加载的一不加载,可以延迟加载的延迟加载(比如,闪屏页显示后或者主页显示后),用ViewStub进行懒加载
  4. 刷新优化:

    1. 减少刷新次数,必须要刷新时再刷新,灵活利用缓存及限时刷新(??)
    2. 缩小刷新区域,局部刷新,避免多余请求;RecyclerViwe刷新,部分刷新调用notifyItemChanged等方法而不是调用notifyDataSetChanged简单粗暴的刷新,浪费性能
  5. 动画优化:??

    需要实现动画效果时,需要根据不同场景选择不同的动画框架来实现

    有些情况下可以用硬件加速方式来提供流畅度来降低动画卡顿。

三、耗电优化

  1. 计算优化:算法、for循环优化、Switch…case代替if…else、避开浮点数

  2. 避免WakeLock使用不当

    不要忘记释放Wake_Lock

  3. 使用JobScheduler管理后台任务

    google提供了一个叫做JobScheduler API的组件,来处理当某个时间点或者当满足某个特定的条件时执行一个任务的场景

四、减少安装包体积

  1. 资源优化:删除已经不使用的资源文件
  2. 图片优化:使用有损压缩等形式压缩图片,或者用webp格式图片
  3. 开启混淆,删除无用类
  4. 插件化热修复开发。功能模块按需下载,减少安装包大小
  5. 避免重复或无用功能的第三方库

你可能感兴趣的:(Android)