Android性能优化(三):响应优化

1、为什么要进行响应优化?
我在布局优化的文章中说过,Android系统每隔16ms会发出一个VSYNC信号来触发UI的渲染,如果在16ms内不能完成UI的渲染,界面就出现卡顿的情况。
(1)页面如果5秒钟之内无法响应屏幕触摸事件或者键盘输入事件就会出现ANR;
(2)BroadcastReceiver如果10秒钟之内还未执行完操作也会出现ANR;
(3)主线程在执行Service的各个生命周期函数时20秒内没有执行完毕。
为了避免ANR,我们需要进行响应速度的优化。

2、如何查找ANR产生的原因?
当出现ANR时,系统会手机/data/anr/目录下生成traces.txt文件,我们可以使用adb命令将traces.txt文件取出来分析;

adb pull data/anr/traces.txt D:\log

通过AS开发工具也可以看到,如图:

3、如何避免ANR?

  1. 避免主线程堵塞:开辟单独的子线程来处理耗时阻塞事务。
  2. 避免CPU满负荷, I/O阻塞:文件读写或数据库操作不要在主线程中执行, 通过开辟子线程的方式异步执行。
  3. 避免内存泄漏导致ANR:内存泄漏会导致手机内存不足,造成ANR。
  4. 避免频繁的GC:频繁GC有两个原因:1、内存抖动, 即大量的对象被创建又在短时间内马上被释放.2、瞬间产生大量的对象会严重占用内存区域。

4、如何检测应用主线程卡顿?
检测工具:BlockCanary

  • BlockCanary是一个非侵入式式的性能监控函数库,用来监控应用主线程的卡顿。

  • 它的基本原理是利用主线程的消息队列处理机制,通过对比消息分发开始和结束的时间点来判断是否超过设定的时间,如果是,则判断为主线程卡顿。

接入方法:

  1. 在build.gradle中添加依赖;
implementation 'com.github.markzhai:blockcanary-android:1.5.0'

2.在application中进行安装初始化;

BlockCanary.install(this,new BlockContext()).start();

3.创建BlockContext类继承BlockCanaryContext;

import com.github.moduth.blockcanary.BlockCanaryContext;

public class BlockContext extends BlockCanaryContext {

    /** * Implement in your project. * * @return Qualifier which can specify this installation, like version + flavor. */
    @Override
    public String provideQualifier() {
        return "unknow";
    }


    /** * @return 用户ID */
    @Override
    public String provideUid() {
        return "uid";
    }

    /** * 网络类型 * @return {@link String} like 2G, 3G, 4G, wifi, etc. */
    public String provideNetworkType() {
        return "unknown";
    }

    /** * 日志保存路径 * @return */
    @Override
    public String providePath() {
        return "/Block/";
    }
}

在这里已经表示完成了。

本文地址:https://blog.csdn.net/weixin_42574892/article/details/106692594