常见的性能优化的帮助工具:
MAT, Memory Monitor(属于AndroidMonitor中一个模块), HeapTool(查看堆信息), Allaction Tracking, LeakCanary Lint工具
上一篇里面我们介绍了AndroidMonitor和MAT,HeapTool报告分析,那么今天继续介绍Allaction Tracking,LeakCanary以及Lint工具。
Allaction Tracking
追踪内存分配信息。可以很直观地看到某个操作的内存是如何进行一步一步地分配的。下面简单介绍一下,首先运行我们的项目,然后在AndroidMonitor的面板上面点击第三个图标,开始分析,在此之前我们也可以先手动GC多几遍,使得内存比较稳定:
工具栏.png
再次点击第三个图标,停止分析,那么AS会自动帮我们打开一个alloc文件,也可以查看饼状图(点击Group by Methd右边的饼状图图标),在这里你可能找不到自己的类的分配,这里我推荐大家使用DDMS。
内存分配分析.png
如下图所示,打开DDMS,左边选择我们APP的进程,然后在右边的Allocation Tracker选项卡里面点击start Tracking,在这个期间我们旋转屏幕,使得LeakActivity有一个重新构建(分配内存)的过程。然后点击Get Allocations,然后点击stop Tracking结束采集过程。
DDMS.png
在那么多的信息中,我们可以通过搜索过滤出我们自己的类,比如LeakActivity,在下面的面板中可以详细地看到我们LeakActivity在内存里面是如何被一步一步分配的,相信熟悉源码的朋友对于这些一定不会陌生,所以说这个工具对于追踪源码、学习源码很有意义。
DDMS1.png
使用LeakCanary检测内存泄漏
Square公司的一个开源内存泄漏分析工具,是在手机上运行的,可以直接在手机端查看内存泄露的工具。
基本使用:
1、添加依赖。
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.5' releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5' testCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.5'
2、在Application里面初始化。
public class App extends Application { public static Context sContext; @Override public void onCreate() { super.onCreate(); sContext = this; initLeakCanary(); } private void initLeakCanary() { 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); } }
3、发生内存泄漏的时候,会自动弹出通知。
实现原理:两个进程,本质上还是用命令控制生成hprof文件分析检查内存泄露。
然后发送通知。
Application
install()
LeakCanary
androidWatcher()
RefWatcher
new AndroidWatcherExecutor() --->dumpHeap()/analyze()(--->runAnalysis())--->Hprof文件分析
new AndroidHeapDumper()
new ServiceHeapDumpListener
Lint分析工具(Eclipse时期就已经有的)
Android Studio很方便,很好用,你可以试试点击AS菜单栏上面的Analyze选项,然后点击Inspection Scope,然后选择你需要检测的范围(比如整个项目),然后AS会自动弹出下图所示的面板,在面板左边列出了一些问题,在右边列出了修改的建议等等,这里不详细介绍,大家自己慢慢操作体会一下,遇到不懂的单词百度翻译一下就好,所见即所得,啊哈。
lint.png
Lint工具可以分析的东西比较多:
检测资源文件是否有没有用到的资源。 检测常见内存泄露 安全问题SDK版本安全问题 是否有费的代码没有用到 代码的规范---甚至驼峰命名法也会检测 自动生成的罗列出来 没用的导包 可能的bug