2015-05-13 75 views
7

LeakCanary是Android和Java的内存泄漏检测库。 LeakCanary如何使用leakcanary,如何添加leakcanary作为jar来构建apk文件.mk文件

我的项目是基于android make文件系统,它依赖于一些android内部接口和自定义方法。

如何将LeakCanary作为lib添加到我的应用程序中以检测内存泄漏。

我的解决方案: 首先,我必须将LeakCanary构建为jar文件,但是如何构建。因为它是一个gradle目录结构,我以前从未使用过Gradle。

任何提示都是宝贵的。

+0

并非所有Android库都可以构建到jar中,especiall在其库(res目录)中使用Android资源。你可以在你的项目中加入.aar库吗? –

+0

您可以使用命令行中的maven构建您的项目。它包含LeakCanary作为aar并成功构建apk,您可以稍后手动安装并使用它。但是如果你想从IDE构建,可能并不那么简单 - 阅读下面的答案。 – Deepscorn

回答

1

LeakCanary不仅仅是一个JAR--它不仅包含Java代码,还包含资源(例如png)。如果您使用的是ANT,那么您唯一能做的就是将LeakCanary作为一个图书馆项目。但我强烈建议切换到gradle。因为Android开发团队不支持在最近的将来以任何用户友好的方式导入任何不仅仅是jar的库(因为gradle是优先的)。导入为图书馆项目是一个痛苦的过程,当它有时也将图书馆的依赖也包括在图书馆项目中时,这会变得更加痛苦。我很早以前就已经手动完成了,只是因为客户端使用eclipse和ant进行大型项目已经很久了。一般情况下,你必须做到以下几点:

  1. 获取来源:源代码,资产,资源...
  2. 调查LeakCanary的依赖。你可以看看“POM对象模型”here
  3. 对于不仅仅包含java代码的依赖关系,您需要再次将它们包含为库。对于其他人,只需将它们下载为jar。
  4. 对于资产(例如字体),还有一个额外的步骤:您必须将它们复制到正在处理的项目中,否则会得到资源未找到异常。
  5. 最后一步是启用清单合并。以下行添加到项目中的project.properties:

    manifestmerger.enabled =真

这是为了从库项目合并所有的AndroidManifest.xml成最终的apk。

+0

更多信息:https://commonsware.com/blog/2014/07/03/consuming-aars-eclipse.html。顺便说一下,我已经尝试了maven插件,大约半年前在那里提到。但它是越野车。Maven使用命令行包含aar来成功构建项目,但是当涉及到Eclipse集成时,事情变得很奇怪 - 我每10次运行只有1次成功构建,而无需更改任何内容。 – Deepscorn

0

你需要的是安装gradle,然后在库的漏洞金丝雀目录中调用“gradle assembleRelease”。如果一切都找到了,你会在build/outputs目录下得到几个aars文件。这些是android库。你应该引用他们作为任何其他的Android库。

5

对于Leak Canary,您应该使用Android Studio。 在Android Studio中, 在你的build.gradle,添加此

dependencies { 
debugCompile 'com.squareup.leakcanary:leakcanary-android:1.3.1' 
releaseCompile 'com.squareup.leakcanary:leakcanary-android-no-op:1.3.1' 
} 

而在你的应用程序类,加入这一行LeakCanary.install(本);中的onCreate()这样的

public class ExampleApplication extends Application { 

    @Override public void onCreate() { 
    super.onCreate(); 
    LeakCanary.install(this); 
    } 
} 

方法遵循有关详细信息,该链接https://github.com/square/leakcanary

希望这可能会有所帮助。

+0

它像一个魅力工作,谢谢。这应该是公认的答案,因为它是简单,整洁和干净的答案。 –

6

这需要成为您的应用程序的一部分,以便leakcanary工作。

public class ExampleApplication extends Application { 

@Override public void onCreate() { 
    super.onCreate(); 
    LeakCanary.install(this); 
} 
} 

但是这是令人困惑,因为我们大多数人不写这类类的直接周围扩展应用程序类,一个工作,而一个简单的语句将解决这个问题,

public class YourClass extends Activity{//AppCompatActivity, A ctionBarActivity or anything 

@Override public void onCreate() { 
    super.onCreate(); 
    LeakCanary.install(getApplication()); 
} 
} 

希望这帮助!

其更好地调用此方法在

onPostCreate() 
0

这个答案可能是你太晚了,但它可能会帮助别人。可以在常规项目中将更多通过gradle公开的项目添加为jar文件。

Gradle只是一个构建工具。这些java库在一天结束时需要一大堆jar文件。所以我做的是以下...

  1. 如果还不是这样的话,请安装Android Studio。
  2. 创建一个基于gradle的项目,您可以在其中简单添加所需的依赖关系。
  3. 同步项目,以便它处理gradle文件并更新外部库。
  4. 在项目资源管理器中,找到并展开“外部库”,你会发现你的jar文件。
  5. 将jar文件复制到其他项目所需的任何位置,然后瞧。

我这样做是为了导入整个或部分Google Play库以及其他许多库。事实上,这对我来说是一种常见的做法。

现在,正如Deepscorn所说的那样,我注意到LeakCanary有一些明显包含Android资源的res /文件夹......我现在非常需要在Titanium SDK中包含LeakCanary。所以我将以同样的方式继续,但是这一次,我会将这些资源添加到钛项目的资源文件夹中,看看会发生什么。

资源最终被包含在整个项目中并可用。我并未脱离android资源范围。你只需要R ...或... getIdentifier(...)来获取它们。

您还需要确保AndroidManifest条目被复制到将被编译的AndroidManifest文件中。

如果我有时间,我会在此发布我的结果。与此同时,任何人都可以尝试并发布一些反馈意见。