What different between drawable and mipmap in Android
Tags: android, google
Published: 2023-02-23 10:11:42



> In old project code, some images were use in the 'drawable' folder, and other in the 'mipmap' folder. Occasionally, I had doubts and searched for articles. But I an not  understand enough. Recently, I try to find it. so I checked the content of the article one by one and found that the actual results were far from the conclusion.


# Several common conclusions

### Case 1 drawable will remove other densities, mipmap will retain all (the final conclusion is related to this)

> When a xhdpi density phone loads this apk, Google has an optimization that will remove the other density files in the drawable folder, Just leaving only a basic drawable and the drawable-xhdpi folder, But  mipmap will retain this all.


The detection method is also relatively simple. Put the same type of image (with image text for tag) in the folders to different densities folder of drawable and mipmap, Then check this installation package and application size

Case1.1 Installation package and application size

|  | Installation package size | 	Application size |
| --- | --- | --- |
| drawable | 13.3 MB (14,016,841 bytes) | 14.04MB |
| mipmap | 13.3 MB (14,017,191 bytes) | 14.04MB |

##### Conclusion1.1

From this, although the size of two installation packages is slightly different, considering the size of image itself (each image is more than 1MB), it can be considered that there is no difference between the images placed in the drawable and mipmap folders after the installation of the application.

Case1.2 In-app performance

Excluding the installation package situation, let's take a look at the performance in the app (use `adb shell wm density` to ensure density without change other info).

|  | 100 | 420 | 800 |
| --- | --- | --- | --- |
| drawable | <img width="200px" src="https://clwater-obsidian.oss-cn-beijing.aliyuncs.com/img/202212192034141.png"/> | <img width="200px" src="https://clwater-obsidian.oss-cn-beijing.aliyuncs.com/img/202212192034231.png"/> | <img width="200px" src="https://clwater-obsidian.oss-cn-beijing.aliyuncs.com/img/202212192034624.png"/> |
| mipmap | <img width="200px" src="https://clwater-obsidian.oss-cn-beijing.aliyuncs.com/img/202212192032115.png"/> | <img width="200px" src="https://clwater-obsidian.oss-cn-beijing.aliyuncs.com/img/202212192031816.png"/> | <img width="200px" src="https://clwater-obsidian.oss-cn-beijing.aliyuncs.com/img/202212192033995.png"/> |


##### Conclusion1.2

From this, it can be seen that no matter which folder the file is placed in, it will be correctly displayed as its matching image resource on the phone.


### Case 1.3 In-app scaling

> If an imageView have scaling animation, using the image under drawable, one image will be continuously used to scale the image to achieve imageView scaling animation.

> If you use the image under mipmap, the image with the closest resolution to the current resolution and larger than the current resolution will be automatically selected for scaling according.

This conclusions may be not is an common conclusions, but since there is shuch a saying, let is test it.

###### drawable 
| Small Scaling Ratio  | Large Scaling Ratio |
| --- | --- |
| <img width="200" src="https://clwater-obsidian.oss-cn-beijing.aliyuncs.com/img/202212192118872.png"/> | <img width="200" src="https://clwater-obsidian.oss-cn-beijing.aliyuncs.com/img/202212192118141.png"/> |


##### mipmap 

| Small Scaling Ratio | Large Scaling Ratio |
| --- | --- |
| <img width="200" src="https://clwater-obsidian.oss-cn-beijing.aliyuncs.com/img/202212192119332.png"/> | <img width="200" src="https://clwater-obsidian.oss-cn-beijing.aliyuncs.com/img/202212192119909.png"/> |

##### Conclusion 1.3

It can be seen that the same animation is displayed throughout the scaling animation process.

Case 2 Application Performance

> Google has optimized the performance of mipmap images to make them perform better.
>

###### drawable 
| Performance Overview | MEMORY | Average time for loading 10 images |
| --- | --- | --- |
|  <img width="200px" src="https://clwater-obsidian.oss-cn-beijing.aliyuncs.com/img/202212201029065.png"/> |  <img width="200px" src="https://clwater-obsidian.oss-cn-beijing.aliyuncs.com/img/202212201030206.png"/> | 146 |

##### mipmap 
| Performance Overview | MEMORY | Average time for loading 10 images |
| --- | --- | --- |
| <img width="200px" src="https://clwater-obsidian.oss-cn-beijing.aliyuncs.com/img/202212201030747.png"/> | <img width="200px" src="https://clwater-obsidian.oss-cn-beijing.aliyuncs.com/img/202212201030493.png"/> | 151 |

###### Conclusion 2

It can be seen that in the case when system loading a single image, their performance is basically the same, except for the case where this image is too small or too few to optimize the performance obviously. However, even in the case of repeated loading of images, the performance is still similar. Perhaps the optimization is only for specific types of images? If you know more details, feel free to communicate with me.

### Case3 Launcher icons

> While researching, it was found that the minmap folder is often recommended to only include the launcher icon of the application, this way can make performance optimize better.


|  | 100dpi | 420dpi | 800dpi |
| --- | --- | --- | --- |
|  | <img width="200px" src="https://clwater-obsidian.oss-cn-beijing.aliyuncs.com/img/202212201828162.png"/> | <img width="200px" src="https://clwater-obsidian.oss-cn-beijing.aliyuncs.com/img/202212201829421.png"/> | <img width="200px" src="https://clwater-obsidian.oss-cn-beijing.aliyuncs.com/img/202212201829421.png"/> |

##### Conclusion 3

It can be seen the display of application icon is consistent across different dpi settings, and the boundary value for switching the application icon is also consistent. As for the situation why this display effect is same for 420dpi and 800dpi, because app icon need to be enlarged by about 25% when selecting image resources for various reasons. [^1]

**At this point, you may have the same doubts as me. Since the performance of the images under drawable and mipmap is the same, whether it is in installation package or in  application itself, and even the official documentation says so, why do various test results show that the performance of the two is basically consistent?**

# The Culprit: Bundle (.aab)

If you do not use Google Play to pushing you apk(like me), you will unfamiliar adbout this. and even many who have previously published app on Google Play are not very familiar with it. This actually appears every time we manually package an app.

![image](https://clwater-obsidian.oss-cn-beijing.aliyuncs.com/img/202212201633188.png)

Simply put, the .aab package is generally used for the Google Play store. When you download an app from the Google Play store, it will download resources from different drawables based on your phone's actual usage to reduce the size of the installation package. (In general, the phone's dpi does not change, and other resources densities will not be used until the app is uninstalled.)

The tool used in the following test is bundletool [^2], which simulates the process of downloading and installing an app from Google Play.


## Comparison of installation packages
|  | Installation Package (apks) Size | Application Size |
| --- | --- | --- |
| drawable | 5.91 MB (6,201,543 字节) | 6.22MB |
| mipmap | 12.6 MB (13,230,670 字节) | 13.26MB |

## In-app performance

|  | 100 | 420 |
| --- | --- | --- |
| drawable | <img width="200px" src="https://clwater-obsidian.oss-cn-beijing.aliyuncs.com/img/202212201832564.png"/> | <img width="200px" src="https://clwater-obsidian.oss-cn-beijing.aliyuncs.com/img/202212201831242.jpg"/> |
| mipmap | <img width="200px" src="https://clwater-obsidian.oss-cn-beijing.aliyuncs.com/img/202212201832837.jpg"/> | <img width="200px" src="https://clwater-obsidian.oss-cn-beijing.aliyuncs.com/img/202212201832319.jpg"/> |

It can be seen that when the image is used on the drawable  folder, the application installed through the .aab package will be  smaller than the one used under minmap folder, and when changing the DPI in the application, it not can  longer automatically select the corresponding image according to the current DPI.

# Conclusion

Based on the above tests, we can get the following conclusions.
**The following conclusions do not involve performance optimization related to mipmap (mainly because we have not yet designed a clear comparison test)**
**The test phone model is Pixel 7, and the tested Android version is 13**

1. When the application is built as an .apk, there is no difference between drawable or mipmap folders, whether it is in the application or in the launcher (application icon).
2. When the application is built as an .aab, the resources in the drawable folder will look for matching device density to keep, and unmatched resources will be deleted to ensure the size of the .apk. However, all resources files in the mipmap folder will be kept.

## Can we place the images used in the application in any directory?

If your application is distributed and installed through .apk, there is no difference in principle. However, Google also has recommended instructions for the related directories, as shown below:
![image](https://clwater-obsidian.oss-cn-beijing.aliyuncs.com/img/202302231534338.png)

As we can see, mipmap directory can only save application icons in principle. Similarly, their [official projects](https://github.com/orgs/android/repositories?type=all) and [single density resource projects](https://github.com/android/architecture-samples/tree/main/app/src/main/res) also use these two folders in this way.


## Is the retention mechanism of the mipmap folder in the .aab package only applicable to application icons?

After testing, it can be found that the retention mechanism of mipmap is applicable to all image resources under mipmap, whether they are application icons or not.

Related code can be accessed on my [GitHub](https://github.com/clwater/drawable_mipmap).


[^1]: https://developer.android.com/training/multiscreen/screendensities#mipmap
[^2]: https://github.com/google/bundletool/