你真的了解BlockCanary了吗?让我带你走进源码,深入了解BlockCanary的实现原理与使用

BlockCanary是一个非侵入式的Android性能监控组件,用于检测UI线程卡顿。本文介绍了其原理,包括主线程的Looper机制、卡顿原因分析以及如何在项目中使用和配置BlockCanary,通过源码分析揭示了BlockCanary监测UI卡顿的核心机制。
摘要由CSDN通过智能技术生成

这次疫情还没有过去,但是生活依旧,还是要工作,还是要挣钱,在这里多的话不说,“武汉加油!”闲言少叙,我们直接走入主题,我们在开发复杂项目的时候,代码的迭代,修改等,都会出现UI卡顿,或者出现ANR的时候,造成的程序崩溃,等,我们如何定位到卡顿的位置等,所以国内开发者,给我送来一个福利,BlockCanary这个框架。

1.介绍 BlockCanary

BlockCanary 这个框架是android平台,非侵入式的性能监控组件。使用时提供一个抽象类,传一个上下文环境就可以使用了,使用方便.

2.UI卡顿问题

原理:

在android开发中,我们的APP的帧频性能最优的目标就是保持在60fps上。

60fps --->16ms/帧

所以我们尽量保证每次在16ms内处理完所有的CPU与GPU计算,绘制,渲染等操作,否则会造成丢帧卡顿问题。

 

3.UI卡顿的原因分析

1.UI线程中做耗时操作

1)主线程的作用:把事件分发给合适的view或者widget

解决办法:我们通过handler在子线程中做耗时操作

runOnUiThread方法:

View.post 方法

VIew.postDelayed方法

2.布局layout过于复杂,没办法在16ms中完成渲染

3.View的过度绘制,由于过度绘制导致在同一帧重复绘制

4.view频繁的触发measure,layout

5.内存频繁触发GC过多(在同一帧内频繁的创建临时变量)

 

4.BlockCanary的简单实用

1)添加开源库的依赖:

compile 'com.github.markzhai:blockcanary-android:1.5.0'

2)在Application中注册我们的BlockCanary

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

3).创建一个类AppBlockContext 继承 BlockCanaryContext:

public class AppBlockContext extends BlockCanaryContext {
    // 实现各种上下文,包括应用标示符,用户uid,网络类型,卡慢判断阙值,Log保存位置等

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

    /**
     * Implement in your project.
     *
     * @return user id
     */
    public String provideUid() {
        return "uid";
    }

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

    /**
     * Config monitor duration, after this time BlockCanary will stop, use
     * with {@code BlockCanary}'s isMonitorDurationEnd
     *
     * @return monitor last duration (in hour)
     */
    public int provideMonitorDuration() {
        return -1;
    }

    /**
     * Config block threshold (in millis), dispatch over this duration is regarded as a BLOCK. You may set it
     * from performance of device.
     *
     * @return threshold in mills
     */
    public int provideBlockThreshold() {
        return 1000;
    }

    /**
     * Thread stack dump interval, use when block happens, BlockCanary will dump on main thread
     * stack according to current sample cycle.
     * <p>
     * Because the implementation mechanism of Looper, real dump interval would be longer than
     * the period specified here (especially when cpu is busier).
     * </p>
     *
     * @return dump interval (in millis)
     */
    public int provideDumpInterval() {
        return provideBlockThreshold();
    }

    /**
     * Path to save log, like "/blockcanary/", will save to sdcard if can.
     *
     * @return path of log files
     */
    public String providePath() {
        return "/blockcanary/";
    }

    /**
     * If need notification to notice block.
     *
     * @return 
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值