欢迎经过我的个人博客来查看此文章

老项目代码中发现有的图片放到了drawable中, 有的图片放到了mipmap中, 开发时秉承哪个目录下文件多放哪里的准则, 偶尔有疑问搜一搜文章, 看到了定论也就这么运用了, 不过今日有时刻, 顺次查验了一下文章中的内容, 发现和实践的体现收支甚远.

常见的几种定论

Case 1 drawable会除掉其它密度, mipmap会保存全部(实践上最终的定论和这个有相关)

当xhdpi密度的手机在加载apk的时分Google是有一个优化的,是会除掉drawable其他密度的文件,只保存一个基本的drawable和drawable-xhdpi的文件,而mipmap是会全部保存的。

检测方法也比较简略, 在drawablemipmap不同密度的问价夹下别离放入同一类图片(图片标文字用于查看), 别离打包并查看其巨细

Case1.1 装置包与运用巨细

装置包巨细 运用巨细
drawable 13.3 MB (14,016,841 字节) 14.04MB
mipmap 13.3 MB (14,017,191 字节) 14.04MB
###### 定论1.1
由此可见, 虽然两个装置包巨细略有差异, 考虑到图片本身的巨细(每张图片都在1Mb作用), 能够以为放入drawablemipmap文件夹中的图片在装置包和运用装置后没有差异

Case1.2 运用内体现

扫除装置包的状况, 咱们看一下在运用内的体现状况(经过adb shell wm density确保只修改手机的dpi信息)

100 420 800
drawable
Android中drawable和mipmap到底有什么区别
Android中drawable和mipmap到底有什么区别
Android中drawable和mipmap到底有什么区别
mipmap
Android中drawable和mipmap到底有什么区别
Android中drawable和mipmap到底有什么区别
Android中drawable和mipmap到底有什么区别
###### 定论1.2
由此可见, 文件不管放在哪个目录下, 在手机中都会正确的显现为其匹配的图片资源

Case 1.3 运用内缩放

假如一个 imageView 有缩放动画,运用 drawable 下的图片,会一直运用一张来缩放图片实现 imageView 缩放动画。 假如运用 mipmap 下的图片,会依据缩放程度主动挑选比当时分辨率大而又最接近当时分辨率的图片来做缩放处理。

这个或许咱们见得不是很多, 不过已然有这种说法, 那就来测验一下

drawable
小缩放比例 大缩放比例
Android中drawable和mipmap到底有什么区别
Android中drawable和mipmap到底有什么区别
mipmap
小缩放比例 大缩放比例
Android中drawable和mipmap到底有什么区别
Android中drawable和mipmap到底有什么区别
###### 定论1.3
能够看到在缩放动画的进程中, 一直显现的都是同一个动画

Case 2 运用内功能

Google对mipmap的图片进行了功能优化, 使其能够体现的更好

drawable
功能查看一览 MEMORY 10次图片加载平均时刻
Android中drawable和mipmap到底有什么区别
Android中drawable和mipmap到底有什么区别
146
mipmap
功能查看一览 MEMORY 10次图片加载平均时刻
Android中drawable和mipmap到底有什么区别
Android中drawable和mipmap到底有什么区别
151
###### 定论2
能够看到, 加载单张图片的状况下其功能基本共同,不扫除图片太小/太少功能优化不明显的状况, 不过测验单证图片重复加载的状况下依旧体现为功能附近的状况, 或许时只针对特别类型有优化? 如各位知道的更详细, 欢迎和我进行沟通.

Case3 发动图标

在查阅材料的时分, 发现多次提及minmap运用只放入运用的发动图标, 使其能够得到优化.

100dpi 420dpi 800dpi
Android中drawable和mipmap到底有什么区别
Android中drawable和mipmap到底有什么区别
Android中drawable和mipmap到底有什么区别
定论3

能够看到, 不同dpi的状况下运用图标的显现状况都是共同的. 其运用图标切换的边界值也是共同的. 关于420dpi和800dpi显现作用一样的状况, 因为种种原因, 运用图片在挑选图片资源的时分, 需要将密度扩展25%左右1.

看到这里咱们应该和我有着一样的疑问, 已然drawable和mipmap下图片的体现不管是装置包仍是运用内, 甚至连官方文档都这么说了, 为什么各种测验结果下来, 两者的体现基本的共同呢?

元凶巨恶 Bundle(.aab)

说到Bundle(.aab)国内的开发者或许都比较生疏, 甚至不少之前做过Google Play上架运用的都不是很熟悉. 这个其实在咱们每次手动打包的时分都会呈现.

Android中drawable和mipmap到底有什么区别
简略来说.aab包一般用于Google Play商店运用, 在你从Google Play商店下载运用时, 它会依据你手机的实践运用状况来下载不同drawable中的资源. 以期望达到减少装置包巨细的意图. (一般状况下手机dpi不会改动, 其它密度下的资源文件直到运用卸载时都不会被运用).

下面的测验运用到的东西为bundletool2, 简略来说, 就是模仿从Google Play下载运用和装置运用的进程.

装置包比较

装置包(apks)巨细 运用巨细
drawable 5.91 MB (6,201,543 字节) 6.22MB
mipmap 12.6 MB (13,230,670 字节) 13.26MB

运用内体现

100 420
drawable
Android中drawable和mipmap到底有什么区别
Android中drawable和mipmap到底有什么区别
mipmap
Android中drawable和mipmap到底有什么区别
Android中drawable和mipmap到底有什么区别
能够看到, 当图片放到drawable相关文件夹下的时分, 经过.aab包装置的运用会比放到minmap的下的运用小许多, 并且运用内更改dpi的时分页能够看到其不再能主动依据当时dpi挑选对应的图片了.

定论

那么经过以上的测验, 咱们能够得到以下定论了 以下定论均不涉及mipmap的功能优化相关(主要是暂未能设计好一个比较清晰的测验比照) 以下测验机型为pixel 7, 测验Android版本为13

  1. 当运用构建为.apk的状况下, drawablemipmap文件夹下的资源体现无差异, 不管是运用内体现仍是在发动器(运用图标)中体现.
  2. 当运用构建为.aab的状况下, drawable文件夹下的资源会寻觅匹配的设备密度保存, 不匹配的资源会被删去已确保apk的巨细.而mipmap文件夹下的资源文件会全部被保存.

那么咱们运用内运用的图片就能够放到恣意的目录下么?

假如你的运用是经过.apk分发装置的, 准则上是没有区别的. 可是Google对相关的目录也有引荐阐明:

Android中drawable和mipmap到底有什么区别

能够看到, mipmap目录下准则上只能保存运用图标. 同样, 其官方项目及单密度资源项目也都是这样运用设计这两个文件夹的.

.aab包内mipmap保存机制是否是只适用于运用图标

测验后能够发现, mipmap的保存机制适用于mipmap下所有的图片资源, 不管是否为运用图标

相关代码能够访问我的GitHub

Footnotes

  1. developer.android.com/training/mu… ↩

  2. github.com/google/bund… ↩