Showing posts with label memory management. Show all posts
Showing posts with label memory management. Show all posts

Thursday, January 26, 2017

Android Application best performance improvement tips

Recently I got chance to work on ongoing project. which means I had to continue working on code written by other developers. so I had to understand code so I can start working on my part.
After looking at code I realized that code is poorly written and it has several performance related issues in layout files and java classes. so I started making list of all issues I noticed in Code so I can share with other developers(already working on project) and we can improve our Android Application.
Some friends/colleagues asked me how you were able to identify so many issues in code so I though I will write an article on this.
Some points which I shared with other members in first code review.
  • Application shared preferences need to be singleton (Currently creating new objects every time in each class)
  • Fire base analytics need to be initialized once. (same as above)
  • supportsRtl was set to false in manifest file (They had to add support for Right to left layouts,But they added static files for each language. 1 file for English, 1 layout file for Arabic)
  • Use of inner classes for AsyncTask
  • No exception Handling
  • No run time checks with implicit Intents
  • Too many static Application objects.

You can study further why above mentioned points are bad practices/discouraged.
After above phase I noticed that some layouts are taking time while rendering even without any network call. surely performance issue agree ? Than I decided that I have to identify more issues in code and have to improve Application.
Than I started working on memory monitoring using:
  • Android studio memory profiling (Heap Dump)
  • Leak Canary
And identified activities which are leaking memory. and shared my findings with team members so they can also learn and not repeat these mistakes in future.
I am sure still there are many performance issues in Application, so I decided to take advantage of Lint.
Go to Toolbar in Android Studio and Under Analyze section click Inspect Code.
I am still looking for performance issues in our Application because I want to make it best Application. Still I have not started working on my part. fixing issues in code :)
Than I installed a plugin “Find Bugs-IDEA” in Android studio and analyzed code using Find Bugs. this is how its result looks like.
After fixing all of the above issues plus memory leaks. I am now confident that we have followed standards to some extent and our code is much optimized now.
Happy Coding :)
Please ignore Grammar and Punctuation mistakes. English is not my native language :)
Hammad Tariq
Android Developer

Tuesday, July 5, 2016

Processing Bitmap and Memory Management in Android




Hi, in this Blog post I will explain how to deal with bitmaps in Android and avoid memory leaks and out of memory errors. I will give you some tips on how you can use low memory and can get same results.


First of all let me add some points why your Application can crash due to out of memory error when you are dealing with bitmaps in your Android Application.


1. In Android operating system every application has specific memory limit which can be assigned to it, so that its code can execute in that available memory. it is usually 16MB for most of devices.


And if you are processing larger bitmap say 5MP photo. Memory required for decoding this bitmap is 2592*1936*4 is 19MB (Value 4 is color channel, will explain below). out of memory error, without doing any important, long running task :(


2 . You are loading multiple bitmaps at once for displaying in list view, grid view and view pager.

And you are trying to allocate more space than available heap.


Please note
dalvik do not merge free memory blocks automatically. for example you have 5MB free space and you need 2MB but you still get out of memory error because there is memory leak. you do not have 2MB available space in a single block.


3. There could be memory leak if Object cannot be garbage collected. Why an object cannot be garbage collected. I will explain below,


Now here are tips which you can follow and can avoid out of memory exception in your Android Application.
1. Always use Activity context instead of Application context. because Application context cannot be garbage collected. And release resources as your activity finishes. (life cycle of object should be
same as of activity).

2 . When Activity finishes. Check HEAP DUMP (memory analysis tool in Android studio).

If there are objects in HEAP DUMP from finished activity there is memory leak. review your
code and identify what is causing memory leak.

3. Always use inSampleSize

Now what is inSampleSize ?
with the help of inSampleSize you are actually telling the decoder not to grab every pixel in memory, instead sub sample image.
This will cause less number of pixels to be loaded in memory than the original image. you can tell decoder to grab every 4th pixel or every second pixel from original image.
if inSampleSize is 4. decoder will return an Image that is 1/16 the number of pixels in original image.

so how much memory you have saved ? calculate :)

4.  Read Bitmap Dimensions before loading into memory.

     How reading bitmap dimensions before loading image into memory can help you avoid out of       
     memory error ? Let's Learn

     use inJustBounds = true

here is technique with the help of which you can get image dimension beore loading it in memory

BitmapFactory.Options options = new BitmapFactory.Options();
options.inJustDecodeBounds = true;
Bitmap bitmap = BitmapFactory.decodeResource(getResources(), R.id.myimage, options);
int imageHeight = options.outHeight;
int imageWidth = options.outWidth;
String imageType = options.outMimeType;

Above code snippet will not give us any image/bitmap.  it will return null for bitmap Object.
but it will definitely return width and height of that image. which is R.id.myimage.

Now you have width and height of Image. you can scale up or scale down image based on these factors:

- ImageView size which will be used to display Image.
- Available amount of memory. you can check available amount of memory using ActivityManager    and getMemoryClass. 
- Screen size and density of device.

5. Use appropriate Bitmap Configuration

   Bitmap configurations is color space/color depth of an Image. Default bitmap Configuration in     Android is RGB_8888 which is 4 bytes per pixel.

If you use RGB_565 color channel which use 2 Bytes per pixel. half the memory allocation for same resolution :)


6. Use inBitmap property for recycling purpose.

7. Do not make static Drawable Object as it cannot be garbage collected.

8. Request large heap in <application> in manifest file.

9. Use multiple processes if you are doing lot of image processing(memory intensive task) or use NDK (Native Development    using c, c++)


Author:
Hammad Tariq
Android Developer

Kotlin Android MVP Dagger 2 Retrofit Tutorial

http://developine.com/building-android-mvp-app-in-kotlin-using-dagger-retrofit/