xref: /aosp_15_r20/external/leakcanary2/docs/faq.md (revision d9e8da70d8c9df9a41d7848ae506fb3115cae6e6)
1# FAQ
2
3## Can a leak be caused by the Android SDK?
4
5Yes. There are a number of known memory leaks that have been fixed over time in AOSP as well as in manufacturer implementations. When such a leak occurs, there is little you can do as an app developer to fix it. For that reason, LeakCanary has a built-in list of known Android leaks to recognize, called Library Leaks (see [Categorizing leaks](fundamentals-how-leakcanary-works.md#4-categorizing-leaks)).
6
7If you find a new one, please [create an issue](https://github.com/square/leakcanary/issues/new/choose) (choose **��Leak in Android SDK / support library**) and follow these steps:
8
91. Provide the entire leak trace information (including metadata), and use backticks (`) for formatting.
102. Read the AOSP source for that version of Android, and try to figure out why it happens. You can easily navigate through SDK versions by switching branches on the GitHub mirror: [android/platform_frameworks_base](https://github.com/android/platform_frameworks_base).
113. Check if it happens on the latest version of Android, and otherwise use blame to find when it was fixed.
124. If it's still happening, build a simple repro case.
135. File an issue on [b.android.com](http://b.android.com) with the leak trace and the repro case. Please remember to follow up the issue when there are new responses. [b/176886060](https://issuetracker.google.com/issues/176886060) is a good example of effective and respectful communication.
146. Create a PR in LeakCanary to update [AndroidReferenceMatchers](/leakcanary/api/shark-android/shark/-android-reference-matchers/). Optional: if you find a hack to clear that leak on previous versions of Android, feel free to document it.
15
16## How do I know if LeakCanary is running?
17
18You can confirm that LeakCanary starts correctly by filtering on the LeakCanary tag in Logcat:
19
20```
21$ adb logcat | grep LeakCanary
22
23D/LeakCanary: Installing AppWatcher
24```
25
26If you do not see `Installing AppWatcher` in the logs, check your dependencies (`./gradlew app:dependencies`) and make sure LeakCanary is there.
27
28Note that LeakCanary is automatically disabled in tests (see [LeakCanary test environment detection](recipes.md#leakcanary-test-environment-detection)):
29
30```
31$ adb logcat | grep LeakCanary
32
33D/LeakCanary: Installing AppWatcher
34D/LeakCanary: JUnit detected in classpath, app is running tests => disabling heap dumping & analysis
35D/LeakCanary: Updated LeakCanary.config: Config(dumpHeap=false)
36```
37
38## Where does LeakCanary store heap dumps?
39
40The default behavior is to store heap dumps in a `leakcanary` folder under the app directory. If the app has been granted the `android.permission.WRITE_EXTERNAL_STORAGE` permission, then heap dumps will be stored
41in a `leakcanary-com.example` folder (where `com.example` is your app package name) under the `Download` folder of the external storage. If the app has not been granted the `android.permission.WRITE_EXTERNAL_STORAGE` permission but that permission is listed in `AndroidManifest.xml` then LeakCanary will show a notification that can be tapped to grant permission.
42
43## How can I dig beyond the leak trace?
44
45Sometimes the leak trace isn't enough and you need to dig into a heap dump with [MAT](http://eclipse.org/mat/) or [YourKit](https://www.yourkit.com/).
46
47* Go to a heap analysis screen, click the overflow menu and select *Share Heap Dump*.
48
49Here's how you can find the leaking instance in the heap dump:
50
511. Look for all instances of `leakcanary.KeyedWeakReference`.
522. For each of these, look at the `key` field.
533. Find the `KeyedWeakReference` that has a `key` field equal to the reference key reported by LeakCanary.
544. The `referent` field of that `KeyedWeakReference` is your leaking object.
555. From then on, the matter is in your hands. A good start is to look at the shortest path to GC Roots (excluding weak references).
56
57## How does LeakCanary get installed by only adding a dependency?
58
59On Android, content providers are created after the Application instance is created but before Application.onCreate() is called. The `leakcanary-object-watcher-android` artifact has a non exported ContentProvider defined in its `AndroidManifest.xml` file. When that ContentProvider is installed, it adds activity and fragment lifecycle listeners to the application.
60
61## How many methods does LeakCanary add?
62
63**0**. LeakCanary is a debug only library.
64
65## How do I use the SNAPSHOT version?
66
67Update your dependencies to the latest SNAPSHOT (see [build.gradle](https://github.com/square/leakcanary/blob/main/build.gradle)):
68
69```gradle
70dependencies {
71  debugImplementation 'com.squareup.leakcanary:leakcanary-android:{{ leak_canary.next_release }}-SNAPSHOT'
72}
73```
74
75Add Sonatype's `snapshots` repository:
76
77```gradle
78repositories {
79  mavenCentral()
80  maven {
81    url 'https://s01.oss.sonatype.org/content/repositories/snapshots/'
82  }
83}
84```
85
86Status of the snapshot build: [![Build Status](https://travis-ci.org/square/leakcanary.svg?branch=main)](https://travis-ci.org/square/leakcanary)
87
88## Who's behind LeakCanary?
89
90LeakCanary was created and open sourced by [@pyricau](https://github.com/pyricau), with [many contributions](https://github.com/square/leakcanary/graphs/contributors) from the community.
91
92## Why is it called LeakCanary?
93
94The name **LeakCanary** is a reference to the expression [canary in a coal mine](http://en.wiktionary.org/wiki/canary_in_a_coal_mine), because LeakCanary is a sentinel used to detect risks by providing advance warning of a danger. Props to [@edenman](https://github.com/edenman) for suggesting it!
95
96## Who made the logo?
97
98* [@pyricau](https://github.com/pyricau) quickly made the [first version](https://github.com/square/leakcanary/blob/f0cc04dfbf3cca92a669f0d250034d410eb05816/assets/icon_512.png) of the logo. It was based on cliparts from [Android Asset Studio](http://romannurik.github.io/AndroidAssetStudio/icons-generic.html), mixed with the selection from a photo of a Canary. The exclamation mark means danger, the shield stands for protection, and the bird, well, is a canary.
99* [@romainguy](https://github.com/romainguy) turned the ugly logo into [a nice vector asset](https://github.com/square/leakcanary/pull/36).
100* [@flickator](https://github.com/flickator) designed [a much nicer logo](https://github.com/square/leakcanary/pull/1269) for LeakCanary 2.0!
101
102<p align="center">
103<img src="../images/logo-2.0.png" />
104</p>
105