Android性能优化你了解多少

还在为项目中的内存泄露发愁呢?还在为卡顿现象找不到缘由吗?今天介绍一个强大的调试工具——BlockCannery。学完这个相信你能收获很多。java

BlockCannery- 轻松找出Android App界面卡顿元凶

没有了解过性能优化的童鞋们建议先阅读:android

Android性能优化 (1)—— 内存溢出和内存泄漏的介绍git

BlockCanary 是一个 Android 平台的一个,应用只须要实现一个抽象类,提供一些该组件须要的上下文环境,就能够在平时使用应用的时候检测主线程上的各类卡慢问题,并经过组件提供的各类信息分析出缘由并进行修复。github

BlockCanary已有几个不一样的版本,其改进以下:性能优化

  • 1.5.0  添加能够在调试模式下中止监视的上下文。
  • 1.4.1 修复错误
  • 1.4.0 错误修复,在上下文中添加onBlock拦截器。
  • 1.3.1 启用标签和图标的配置。
  • 1.3.0 添加白名单和关注包功能。

先看效果图吧:bash

Markdown
Markdown

Markdown
Markdown

代码指向了DemoFragment.java的第109行微信

Markdown
Markdown

用法:

  • 第一步:

在androidmenifest.xml中配置:网络

//compile 'com.github.markzhai:blockcanary-android:1.5.0'
debugCompile'com.github.markzhai:blockcanary-android:1.5.0'
releaseCompile 'com.github.markzhai:blockcanary-no-op:1.5.0'复制代码
  • 第二步:

实现本身的application
并在onCreate()方法里加入:app

BlockCanary.install(this, new AppBlockCanaryContext()).start();复制代码
  • 第三步

监视应用程序的标签和图标能够经过在xhdpi drawable目录和strings.xml中放置一个能够绘制的块金丝雀图来配置:ide

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

public class AppBlockCanaryContext  extends BlockCanaryContext {

    /**
     * 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";
    }
  ......
}复制代码

第四步运行demo便可

这里我已经写了相关的例子:

用例demo链接:
github.com/androidstar…

相关介绍

  • 非侵入式,简单的两行就打开监控,不须要处处打点,破坏代码优雅性。

  • 精准,输出的信息能够帮助定位到问题所在(精确到行),不须要像Logcat同样,慢慢去找。
    目前包括了核心监控输出文件,以及UI显示卡顿信息功能。仅支持Android端。

若是咱们熟悉Message/Looper/Handler系列的同鞋们必定知道Looper.java中这么一段:

public static void prepareMainLooper() {
    prepare(false);
    synchronized (Looper.class) {
        if (sMainLooper != null) {
            throw new IllegalStateException("The main Looper has already been prepared.");
        }
        sMainLooper = myLooper();
    }
}

/** Returns the application's main looper, which lives in the main thread of the application. */ public static Looper getMainLooper() { synchronized (Looper.class) { return sMainLooper; } }复制代码

即整个应用的主线程,只有这一个looper,无论有多少handler,最后都会回到这里:

Markdown
Markdown

cpuBusy判断:

Markdown
Markdown

到这里你们是否是很清楚了。原理是参考的简书做者为 www.jianshu.com/p/cd7fc7740…。在这里深表感谢。

BlockCanary参数的解读

  • cpuCore:手机cpu个数。

  • processName:应用包名。

  • freeMemory: 手机剩余内存,单位KB。

  • totalMemory: 手机内训总和,单位KB。

  • timecost: 该Message(事件)执行时间,单位 ms。

  • threadtimecost: 该Message(事件)执行线程时间(线程实际运行时间,不包含别的线程占用cpu时间),单位 ms。

  • cpubusy: true表示cpu负载太重,false表示cpu负载不重。cpu负载太重致使该Message(事件) 超时,错误不在本事件处理上。

BlockCanary卡顿检测流程

BlockCanary启动一个线程负责保存UI线程当前堆栈信息,将堆栈信息以及CPU信息保存分别保存在 mThreadStackEntries和mCpuInfoEntries中,每条信息都以时间撮为key保存。

BlockCanary注册了logging来获取事件开始结束时间。若是检测到事件处理时间超过阈值(默认值1s),则从mThreadStackEntries中查找T1~T2这段时间内的堆栈信息,而且从mCpuInfoEntries中查找T1~T2这段时间内的CPU及内存信息。而且将信息格式化后保存到本地文件,而且通知用户

工做原理流程图:

Markdown
Markdown

据知:目前阿里内多个Android项目接入并使用BlockCanary来优化Android应用的性能

BlockCannery很方面使用,另外你们也可使用 LeakCanary检测内存泄漏及解决办法。

另外你们若是对Android内存泄露和溢出不太熟悉的童鞋们能够进行阅读:
Android性能优化 (1)—— 内存溢出和内存泄漏的介绍

博客地址:
blog.csdn.net/androidstar…

相信本身,没有作不到的,只有想不到的

若是你以为此文对您有所帮助,欢迎入群 QQ交流群 :232203809
微信公众号:终端研发部

技术+职场
技术+职场
相关文章
相关标签/搜索