LeakCanary 实用的内存泄露自动探测工具
来源:互联网 发布:奇葩说 网络暴力 编辑:程序博客网 时间:2024/06/10 17:19
好吧,今天就现学现卖,把今天刚学会用的新东西分析給大家。内存泄露自动探测神器——LeakCanary。它是一个Android和Java的内存泄露检测库,可以大幅度减少了开发中遇到的OOM问题,对于开发者来说,无疑是个福音,下面对该库的readme进行简单的翻译:
“A small leak will sink a great ship.” - Benjamin Franklin
小漏不补沉大船。——本杰明 富兰克林
什么是内存泄露(memory leak)?
一些对象有有限的使用期,当它们的工作完成后,它们预期会被当作内存垃圾回收。如果一个持有对象的引用链结束了它的预期寿命,这将会产生一个内存泄露。随着泄露的积累,应用程序将会耗尽内存。
例如,Activity的onDestroy()被调用后,这个Activity的视图层次和相关的位图都应该进行垃圾回收。而如果一个线程在后台运行这个Activity的引用,那么相应的内存将不能被回收,这最终就导致了OutOfMemoryError的出现。
(上述描述转载自:http://www.jianshu.com/p/e9891d7512ff)
接下来我们开始使用LeakCanary这个工具目前我只知道在Android Studio上可以使用,其他的我就没试过。
在我们做项目的初期阶段,对于OOM可能不会引起太多的关注,只想把项目能够按时完成,所以在我们开发的过程中难免会忽略内存的优化,特别是对于配置较低,或者图片Bitmap过大等情况是非常容易出现OOM的情况的。
首先,在项目的build.gradle文件添加:
//内存泄露检测工具 区分开发、发行版 debugCompile 'com.squareup.leakcanary:leakcanary-android:1.4-beta2' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2' testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.4-beta2'
初始化 内存检测工具
package com.fryp.frnewweb;import android.app.Application;import android.content.Context;import com.squareup.leakcanary.LeakCanary;import com.squareup.leakcanary.RefWatcher;/** * Created by Administrator on 2016/5/31. */public class MyApplication extends Application { private static MyApplication instance; static Context mContext; private RefWatcher refWatcher; @Override public void onCreate() { super.onCreate(); mContext = getApplicationContext(); refWatcher = LeakCanary.install(this);//初始化 内存检测工具 } /** * 获取全局的Context */ public static Context getContextInstance() { return mContext; } /** * 获得内存监视器 监视任何对象 * 使用 refWatcher.watch(object); * * @return 全局的refWatcher */ public static RefWatcher getRefwatcher(Context context) { MyApplication myApplication = (MyApplication) context.getApplicationContext(); return myApplication.refWatcher; } public static MyApplication getInstance() { if (null == instance) { instance = new MyApplication(); } return instance; }}
到此,LeakCanary就可以监听所有的Activity的内存异常问题,并将问题在通知栏那里展示,点击就能够查看问题的详细了。如下图
上述只针对Activity的监听,当我们需要在Fragment监听异常时,需要在onDestroy的方法中,获取在MyApplication 中的全局变量refWatcher并开始监听。
package com.fryp.frnewweb.base;import android.app.Fragment;import android.os.Bundle;import android.support.annotation.Nullable;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import com.fryp.frnewweb.MyApplication;import butterknife.ButterKnife;public abstract class BaseFragment extends Fragment { private View rootView; @Nullable @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { rootView = inflater.inflate(getLayoutId(), container, false); return rootView; } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); } @Override public void onDetach() { super.onDetach(); } @Override public void onDestroyView() { super.onDestroyView(); } @Override public void onDestroy() { super.onDestroy(); MyApplication.getRefwatcher(getActivity()).watch(this); }}
到这里为止,你就可以一直点击App中经常崩溃但不知道原因的地方,然后查看错误信息就行了。我在这里需要的功能不是很多,当然了这个工具具备的特点不止这些。你可以修改通知栏通标、上传错误信息到服务器,发布正式版本的时候使RefWatcher失效,不需要在客户端弹出通知等。那些详细的功能点在这里我就不一一描述了,不同的朋友可以去参照:
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0510/2860.html
- LeakCanary 实用的内存泄露自动探测工具
- 内存泄露自动探测神器——LeakCanary
- 一个内存泄露自动探测神器——LeakCanary
- AppCrawler 自动遍历工具结合LeakCanary检查内存泄露
- 内存泄露工具(leakcanary、Lint)的使用
- 【Android】【内存】内存泄露检查工具 LeakCanary
- Android内存泄露抓取工具leakcanary
- Android内存泄露抓取工具leakcanary
- 检测App内存泄露--LeakCanary工具
- Android内存泄露监测工具之leakcanary
- Android内存泄露分析工具LeakCanary
- LeakCanary:检测所有的内存泄露
- LeakCanary:检测所有的内存泄露
- 内存泄露检测工具LeakCanary
- LeakCanary: 查找内存泄露
- 内存泄露检测工具LeakCanary
- [leakcanary]内存泄露检测
- LeakCanary检查内存泄露
- Android动画
- Pasha and Stick
- 【Linux全面学习】6.Linux常用命令(重点)
- Android 混淆总结(直接copy)
- adb logcat指令参数详解
- LeakCanary 实用的内存泄露自动探测工具
- Android 自定义ViewGroup 实战篇 -> 实现FlowLayout
- 快速编写“专家级”makefile(2.创建基本编译环境)
- 百度UEditor编辑器使用教程与使用方法
- CountDownTimer手机短信计时器的使用
- ORM 框架之 greenDAO 使用心得
- AndroidManifest.xml官方介绍
- cacti监内网本机TCP连接状况
- leetcode Set Matrix Zeroes