说干就干!
一、LeakCanary
LeakCanary,用于 Android 和 Java 的内存泄漏检测库(可以直接在手机端查看内存泄露的工具)。
1、概念
LeakCanary 本质上就是一个基于 MemoryAnalyzerTool(Mat)进行 Android 应用程序内存泄漏自动化检测的的开源工具,通过集成这个工具到自己的 Android 工程,就能够在程序调试开发过程中通过一个漂亮的界面(如下图)随时发现和定位内存泄漏问题,而不用每次在开发流程中都抽出专人来进行内存泄漏问题检测,极大地方便了 Android 应用程序的开发。
2、引入项目
build.gradle:
dependencies {
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5.2'
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5.2'
}
Application:
public class ExampleApplication extends Application {
@Override public void onCreate() {
super.onCreate();
if (LeakCanary.isInAnalyzerProcess(this)) {
// This process is dedicated to LeakCanary for heap analysis.
// You should not init your app in this process.
return;
}
LeakCanary.install(this);
// Normal app init code...
}
}
3、使用
还是上文的模拟单例内存泄漏问题:《内存泄露:分析及工具使用》
通过 LeakCanary 帮我们定位的内存泄漏信息,到指定类中进行引用关系、生命周期分析,从而找到问题所在。
ps:上面只是最基本的使用,还有其它使用方式:https://github.com/square/leakcanary/wiki/FAQ#how-do-i-use-it
4、遇到的问题
Demo 时遇到这样一个问题:
Error:Execution failed for task ':app:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.dex.DexException: Multiple dex files define Lcom/squareup/leakcanary/watcher/R;
查了很久也没找到原因,但是把 LeakCanary 版本号改低就可以了:
ps:以后找到原因再补上!
5、LeakCanary 和 MemoryAnalyzerTool(Mat)
LeakCanary 原理就是自动 dump heap,对生成的 .hprof 文件进行分析,但是工具比较死板,有些程序逻辑错误并不能检测出来。另外有些内存可以优化的地方,使用 LeakCanary 也是分析不出来的,比如程序中用到集合类,如果用完不调用 clear 并置为 null 的话,导致一个游离的对象集合会在内存中存在一段时间,只有等到下次 GC 检测到对象没有用的时候才会回收。因此,要结合 Mat 进行内存泄漏分析,将两份 .hprof 文件进行对比,看看增加的都是什么对象,然后查看一下引用链,是什么引用到了对象,导致得不到释放。
二、Android Studio 的 Analyze
1、概念
Android Studio 提供一个名为 Lint 的代码扫描工具,可帮助开发者发现并纠正代码结构质量的问题,而无需实际执行该应用,也不必编写测试用例。该工具会报告其检测到的每个问题并提供该问题的描述消息和严重级别,以便可以快速确定需要优先进行哪些关键改进。此外,还可以调低问题的严重级别,忽略与项目无关的问题,也可以调高严重级别,以突出特定问题。
Lint 工具可检查 Android 项目源文件是否包含潜在错误,以及在正确性、安全性、性能、易用性、便利性和国际化方面是否需要优化改进。在使用 Android Studio 时,配置的 Lint 和 IDE 检查会在每次构建应用时运行。不过,可以手动运行检查或从命令行运行 Lint。
2、使用(手动运行检查)
从菜单栏选择 Analyze > Inspect Code:
在 Specify Inspection Scope 对话框中进行设置,选择要检查的 Module:
生成检查结果:
在左侧窗格树形视图中,通过展开并选择错误类别、类型和问题,查看检查结果。右侧窗格显示所选错误类别、类型或问题的检查报告,并提供错误的名称和位置。在适用情况下,检查报告会显示问题摘要等其他信息,以帮助纠正问题。(本介绍是AS官网最新版本的介绍,但本人用的As 3.0,可能有出入)
在左侧窗格树形视图中,右键点击某个类别、类型或问题,显示上下文菜单。
取决于上下文,可以执行以下全部或部分操作:跳到源文件、排除和包含选定项、消除问题、编辑设置、管理检查警报和重新运行检查。
3、分析
Android Lint: Accessibility --> 可访问性
Android Lint: Correctness --> 正确性
Android Lint: Internationalization --> 国际化
Android Lint: Performance --> 性能
Android Lint: Security --> 安全性
Android Lint: Usability --> 使用
Class structure --> 类结构
Compiler issues --> 编译器问题
Data flow issues --> 数据流的问题
Declaration redundancy --> 声明冗余
Javadoc issues --> Javadoc 问题
Probable bugs --> 可能的错误
Spelling --> 拼写
XML --> XML
例子1:静态字段泄漏
例子2:没有被使用的资源
例子3:可能存在的问题(else 主体为空)
ps:Android Studio 的 Analyze 还有很多好用的功能,平时可以试试,找到能给自己开发带来便利的功能,这种过程也是一种乐趣。
参考文章:
https://github.com/square/leakcanary
http://coolpers.github.io/leakcanary%7Cmat/2015/06/04/LeakCanary-Brief.html
https://www.zhihu.com/question/38957633
https://developer.android.google.cn/studio/write/lint.html
http://blog.youkuaiyun.com/thl789/article/details/8037473