48
votes

I'm analyzing memory usage of my Android app with help of Eclipse Memory Analyzer (also known as MAT). Sometimes I can find strange instances of android.graphics.Bitmap class, utilizing big portion of heap. Problem is what I can't find source of this bitmaps, no filename, no resourceID, nothing. All information what I can find for bitmap is following: bitmap_info

There is a field mBuffer with array of image pixels, I assume. But it's in some internal Android format, not PNG.

Question: how can I view image represented by this bitmap from memory dump?

2
If mBuffer is null, how can check the value of this member variable of a Bitmap in code?toobsco42
how did you show the variables values of the bitmap?android developer
hi mate. I can't find similar window with the information about bitmap in my MAT Eclipse. Where did you find it?Nazerke

2 Answers

124
votes

I have found a way to view such bitmaps:

  • First, you need to download and install GIMP
  • Next, find your Bitmap object in MAT, right-click on mBuffer field, in the popup menu choose "Copy" -> "Save Value To File" menu item and save value of this array to some file
  • give extension .data to that file
  • launch GIMP, choose "File" -> "Open", select your .data file and click Open button
  • "Load Image from Raw Data" dialog will appear. Here you need to set correct parameters for your bitmap
  • first, choose "Image type" as "RGB Alpha" (most Android resources have this image type, but you may need to experiment with other image types)
  • second, set correct Width and Height for your bitmap (correct dimensions can be found in the memory dump)

At that point you should already observe preview of original image. If you didn't, you can try to change some other parameters in "Load Image from Raw Data" dialog.

NOTE: to get a width and height of image you can look at mWidth and mHeight fields in MAT in attributes section as shown in image in question.

6
votes

You can convert memory dumps from MAT to png using with ImageMagick on command line.

In MAT for related Bitmap object right click mBuffer field and select "Copy" -> "Save Value To File", name the file with an .rgba extension.

You need to note bitmap width and height from mWidth and mHeight fields, which you can see in Bitmap object.

Having ImageMagick command line tools installed (for Ubuntu apt-get install imagemagick), you issue convert command with the following parameters.

convert -size 'width'x'height' -depth 8 filename.rgba filename.png

For example

 convert -size 680x1209 -depth 8 phone_decor.rgba phone_decor.png

You can check generated png file via eog, like eog phone_decor.rgba on Ubuntu easily.