Extract multi process out (#1307)

* Remove perflib android artifact, keep analyzer

* merge new heap dump back into main module

* Recreate leakcanary-android which provides the single process manifest

* New module for running leakcanary in a separate process
13 files changed
tree: e9e8d2e0699c5ae1f7f5b96cc2018acd2b8cc71b
  1. .buildscript/
  2. .github/
  3. gradle/
  4. leakcanary-analyzer/
  5. leakcanary-analyzer-core/
  6. leakcanary-analyzer-perflib/
  7. leakcanary-android/
  8. leakcanary-android-core/
  9. leakcanary-android-instrumentation/
  10. leakcanary-android-process/
  11. leakcanary-haha/
  12. leakcanary-leaksentry/
  13. leakcanary-log/
  14. leakcanary-sample/
  15. leakcanary-watcher/
  16. .gitignore
  17. .travis.yml
  18. build.gradle
  19. CHANGELOG.md
  20. checkstyle.xml
  21. gradle.properties
  22. gradlew
  23. LICENSE.txt
  24. README-1.6.md
  25. README.md
  26. settings.gradle
README.md

LeakCanary

A memory leak detection library for Android and Kotlin.

“A small leak will sink a great ship.” - Benjamin Franklin

Getting started

Add LeakCanary to your build.gradle:

dependencies {
  debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.0-alpha-1'
}

You're good to go! LeakCanary will automatically show a notification when an activity or fragment memory leak is detected in your debug build.

Note: LeakCanary 2 is in alpha. To set up LeakCanary 1.6, go to the 1.6 Readme.

Presentations

Recipes

Watching custom objects

class MyService : Service {

  // ...

  override fun onDestroy() {
    super.onDestroy()
    LeakSentry.refWatcher.watch(this)
  }

}

Configuring LeakSentry & LeakCanary

LeakSentry is in charge of detecting memory leaks. Its configuration can be updated at any time by replacing LeakSentry.config:

class DebugExampleApplication : ExampleApplication() {

  override fun onCreate() {
    super.onCreate()
    LeakSentry.config = LeakSentry.config.copy(watchFragmentViews = false)
  }
}

LeakCanary is in charge of taking heap dumps and analyzing them. Its configuration can be updated at any time by replacing LeakCanary.config:

disableLeakCanaryButton.setOnClickListener {
  LeakCanary.config = LeakCanary.config.copy(dumpHeap = false)
}

Counting retained instances in production

In your build.gradle:

dependencies {
  implementation 'com.squareup.leakcanary:leakcanary-sentry:2.0-alpha-1'
}

In your leak reporting code:

val retainedInstanceCount = LeakSentry.refWatcher.retainedKeys.size

Alternate setup with the old perflib heap parser

If you want to try LeakCanary 2.0 features with the battle tested perflib heap parser, use a different dependency:

dependencies {
  // debugImplementation 'com.squareup.leakcanary:leakcanary-android:2.0-alpha-1'
  debugImplementation 'com.squareup.leakcanary:leakcanary-android-perflib:2.0-alpha-1'
}

In your debug Application class:

class DebugExampleApplication : ExampleApplication() {

  override fun onCreate() {
    if (LeakCanary.isInAnalyzerProcess(this)) {
      // This process is dedicated to Perflib for heap analysis.
      // You should not init your app in this process.
      return
    }
    super.onCreate()
  }
}

FAQ

Note: the entries in this FAQ have not been updated for LeakCanary 2 yet.

License

Copyright 2015 Square, Inc.

Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at

   http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.