Android技术知识Android开发经验谈Android开发

Android 优化——卡顿优化

2018-07-09  本文已影响84人  三流之路

Android 优化目录


Android 系统每隔 16ms 会发出 VSYNC 信号重绘界面(Activity)。之所以是 16ms,是因为 Android 设定的刷新率是 60FPS(Frame Per Second),也就是每秒 60 帧的刷新率,约合 16ms 刷新一次。

这就意味着,我们需要在 16ms 内完成下一次要刷新的界面的相关运算,以便界面刷新更新。

假设我们更新屏幕的背景图片需要 24ms 来做这次运算,当系统在第一个 16ms 时刷新界面,由于运算还没有结束,无法绘出图片。当系统隔 16ms 再发一次 VSYNC 信息重绘界面时,用户才会看到更新后的图片。也就是说 32ms 后才看到了这次刷新(并不是 24ms),这就是丢帧(dropped frame)

丢帧给用户的感觉就是卡顿,而且如果运算过于复杂,丢帧会更多,导致界面常常处于停滞状态。

卡顿原因

优化方法

  1. 减少刷新次数

    比如进度更新,要进度有变化再去刷新,且保证频率不得高于系统的刷新频率。

  2. 避免非必要的刷新

    若控件不可见,则无需刷新。

  3. 避免后台线程影响

    如列表控件,在滑动时不要去加载图片,可以在滑动监听里停止图片的加载。

  4. 局部刷新

    如 RecyclerView 的 DiffUtil。自定义 View 可以使用下面两个方法:

    invalidate(Rect dirty);
    invalidate(int left, int top, int right, int bottom);
    
  5. 尽量使用属性动画,它减少了自身的重绘。最后要清除

  6. StringBuilder,List 等在创建时传入一个合适的参数指定初始容量,以避免频繁扩容的开销。

  7. 开启硬件加速

    原理可见 Android硬件加速原理与实现简介理解Android硬件加速原理的小白文

    • Application 级别

      <application android:hardwareAccelerated="true" />
      
    • Activity 级别

      <activity android:hardwareAccelerated="true" />
      
    • Window 级别

      getWindow().setFlags(WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED,
      WindowManager.LayoutParams.FLAG_HARDWARE_ACCELERATED);
      
    • View 级别

      // 如果是 software,会将 View 绘制到一个 Bitmap,
      // 然后依然是通过硬件加速将 Bitmap 绘制到 Canvas
      view.setLayerType(View.LAYER_TYPE_SOFTWARE, null);
      
      • LAYER_TYPE_NONE:普通渲染方式,不会返回一个离屏的缓冲,默认值。
      • LAYER_TYPE_HARDWARE:如果这个应用使用了硬件加速,这个 View 将会在硬件中渲染为 硬件纹理,如果应用程序并没有被硬件加速,则其效果和 LAYER_TYPE_SOFTWARE 相同。
      • LAYER_TYPE_SOFTWARE:此 View 通过软件渲染为一个 Bitmap。
    • 检查是否开启了硬件加速

      view.isHardware-Accelerated();
      Canvas.isHardwareAccelerated();
      

    如果 View 中要处理中文长文本,需要关闭硬件加速。因为每个中文编码不一样,缓存效果不理想。

监控

ANR

Activity 的 View:5 秒无响应
BroadcastReceiver:10 秒无响应
Service:20 秒无响应

ANR 时,系统会生成一个 traces.txt 的文件放在 /data/anr/ 下。通过 adb 命令将其导出到本地

$adb pull data/anr/traces.txt ~/Desktop

UI 线程做耗时操作,内存泄露导致内存不足都可能产生 ANR。

上一篇下一篇

猜你喜欢

热点阅读