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

还在为项目中的内存泄露发愁呢?还在为卡顿现象找不到原因吗?今天介绍一个强大的调试工具——BlockCannery。学完这个相信你能收获不少。 #### BlockCannery- 轻松找出Android App界面卡顿元凶 没有了解过性能优化的童鞋们建议先阅读: Android性能优化 (1)—— 内存溢出和内存泄漏的介绍 BlockCanary 是一个 Android 平台的一个,应用只需要实现一个抽象类,提供一些该组件需要的上下文环境,就可以在平时使用应用的时候检测主线程上的各种卡慢问题,并通过组件提供的各种信息分析出原因并进行修复。 BlockCanary已有几个不同的版本,其改进如下: - 1.5.0  添加可以在调试模式下停止监视的上下文。 - 1.4.1 修复错误 - 1.4.0 错误修复,在上下文中添加onBlock拦截器。 - 1.3.1 启用标签和图标的配置。 - 1.3.0 添加白名单和关注包功能。 先看效果图吧: 代码指向了DemoFragment.java的第109行 #### 用法: - 第一步: 在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()方法里加入: BlockCanary.install(this, new AppBlockCanaryContext()).start(); - 第三步 监视应用程序的标签和图标可以通过在xhdpi drawable目录和strings.xml中放置一个可以绘制的块金丝雀图来配置: /* 实现各种上下文,包括应用标示符,用户 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连接: https://github.com/androidstarjack/MyBlockCanaryTest #### 相关介绍 - 非侵入式,简单的两行就打开监控,不需要到处打点,破坏代码优雅性。 - 精准,输出的信息可以帮助定位到问题所在(精确到行),不需要像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,最后都会回到这里: cpuBusy判断: 到这里大家是不是很清楚了。原理是参考的简书作者为http://www.jianshu.com/p/cd7fc77405ac。在这里深表感谢。 #### 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及内存信息。并且将信息格式化后保存到本地文件,并且通知用户 工作原理流程图: 据知:目前阿里内多个Android项目接入并使用BlockCanary来优化Android应用的性能 BlockCannery很方面使用,另外大家也可以使用 LeakCanary检测内存泄漏及解决办法。 另外大家如果对Android内存泄露和溢出不太熟悉的童鞋们可以进行阅读: Android性能优化 (1)—— 内存溢出和内存泄漏的介绍 博客地址: http://blog.csdn.net/androidstarjack/article/details/70197985 #### 相信自己,没有做不到的,只有想不到的 如果你觉得此文对您有所帮助,欢迎入群 QQ交流群 :232203809 微信公众号:终端研发部

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭