Android SDK会导致泄漏吗?
是。在AOSP和制造商实现中,有许多已知的内存泄漏已经随着时间的推移得到了修复。当这样的泄漏发生时,您作为应用程序开发人员几乎无法修复它。出于这个原因,LeakCanary有一个内置的、需要识别的Android泄漏列表,称为“库泄漏”(请参见对泄漏进行分类).
如果你找到一个新的,请制造问题(选择AndroidSDK/Support库中的泄漏)并遵循以下步骤:
- 提供整个泄漏跟踪信息(包括元数据),并使用backticks(`)进行格式化。
- 阅读该版本Android的AOSP源代码,并试图找出发生这种情况的原因。通过切换GitHub镜像上的分支,您可以轻松地浏览SDK版本:Android/平台框架库.
- 检查它是否发生在最新版本的Android上,否则就会在修复时使用责备来查找。
- 如果它还在发生,建立一个简单的复制案例。
- 在.上提出一个问题b.android.com带着泄密痕迹和复写箱。
我怎么知道LeakCanary在跑?
您可以确认LeakCanary通过过滤logcat中的LeakCanary标记来正确启动:
$ adb logcat | grep LeakCanary
D/LeakCanary: Installing AppWatcher
如果你看不到Installing AppWatcher
在日志中,检查您的依赖项(./gradlew app:dependencies
确保LeakCanary在那里。
注意,LeakCanary在测试中被自动禁用
$ adb logcat | grep LeakCanary
D/LeakCanary: Installing AppWatcher
D/LeakCanary: JUnit detected in classpath, app is running tests => disabling heap dumping & analysis
D/LeakCanary: Updated LeakCanary.config: Config(dumpHeap=false)
LeakCanary在哪里存储堆转储?
默认行为是将堆转储存储在leakcanary
文件夹下的应用程序目录。如果应用程序已被授予android.permission.WRITE_EXTERNAL_STORAGE
权限,则堆转储将存储在leakcanary-com.example
文件夹(其中com.example
是您的应用程序包名)在Download
外部存储的文件夹。如果应用程序未被授予android.permission.WRITE_EXTERNAL_STORAGE
允许,但该权限列在AndroidManifest.xml
然后LeakCanary将显示一个通知,该通知可以被点击以授予许可。
我怎么才能发现泄漏?
有时,泄漏跟踪是不够的,您需要挖掘堆转储 MAT 或YourKit.
- 转到堆分析屏幕,单击溢出菜单并选择共享堆转储.
下面是如何在堆转储中找到泄漏实例:
- 寻找所有实例
leakcanary.KeyedWeakReference
. - 对于其中的每一个,请查看
key
场。 - 找到
KeyedWeakReference
有一个key
字段等于LeakCanary报告的引用键。 - 这个
referent
那个领域KeyedWeakReference
是泄露的东西。 - 从那时起,这件事就掌握在你的手中了。一个好的开端是查看GCRoot的最短路径(不包括弱引用)。
如何仅通过添加依赖项来安装LeakCanary?
在Android上,内容提供者是在创建Application实例之后,在调用Application.onCreate()之前创建的。这个leakcanary-object-watcher-android
工件中定义了一个非导出的ContentProviderAndroidManifest.xml
档案。安装该ContentProvider时,它会向应用程序添加活动和片段生命周期监听器。
LeakCanary添加了多少种方法?
0。LeakCanary是一个仅用于调试的库。
如何使用快照版本?
将依赖项更新为最新快照(请参阅build.gradle):
dependencies {
debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.5-SNAPSHOT'
}
添加Sonatype的snapshots
储存库:
repositories {
mavenCentral()
maven {
url 'https://oss.sonatype.org/content/repositories/snapshots/'
}
}