Friday, March 17, 2017

Detecting memory leaks on Android apps

More often than it should you find yourself wondering if your application is leaking memory and if so what, where and how.A lot of questions that usually don't have enough answers.There are many well know ways your application can leak memory. To name a few

static references to Contexts, Views or Activities

inner classes holding a reference to the outer class

anonymous classes, commonly used in listeners

drawables holding a reference to the Context

and many more cases

If you are interested in more detailed descriptions of these common ways your app can leak memory this article will help you.Also, as there are pitfalls there are tools to help you find them. Again, to name a few

Android Studio monitors

dalvik and art GC log messages

heap dumps

dumpsys

etc.

To do an effective use of these tools and uncover memory leaks you should stress your app, running it for a while, or forcing continuous invocations of Activities, perhaps navigation back to the Home screen and launching the Activity again and again. While you can do this manually and the most obvious cases will be detected, it is always more efficient to automate these steps so they can be run before and after to verify that you actually solved the problem.And what better than AndroidViewClient/culebra to automate these steps as we have discussed so many times in previous articles. Precisely, one of the latest additions is the ability to capture dumpsys information and create plots with it.This is an example of a method we can define to exercise our Activities including some extra steps like stopping the application to start clean and forcing garbage collection along the way (see complete source code here)