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

top

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

老项目代码中发现有的图片放到了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不会改变, 其它密度下的资源文件直到应用卸载时都不会被使用).

下面的测试使用到的工具为bundletool[2], 简单来说, 就是模拟从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


  1. https://developer.android.com/training/multiscreen/screendensities#mipmap ↩︎

  2. https://github.com/google/bundletool/ ↩︎

原文链接:https://www.cnblogs.com/clwater/p/17154850.html

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Android中drawable和mipmap到底有什么区别 - Python技术站

(0)
上一篇 2023年4月18日
下一篇 2023年4月18日

相关文章

  • 欢迎页轮播动画

    如图,引导开始,球从上落下,同时淡入文字,然后文字开始轮播,最后一页时停止,点击进入首页。 在来看看效果图。 重力球先不讲,主要欢迎轮播简单实现 首先新建一个类 TextTranslationXGuideView,用于动画展示 文本是类似的,最后会有个图片箭头动画,布局很简单,就是一个 TextView 跟 ImageView,直接写 xml 布局里方便了 …

    Android 2023年4月19日
    00
  • Android Banner – ViewPager 02

    Android Banner – ViewPager 02 现在来给viewpager实现的banenr加上自动轮播 自动轮播的原理,使用handler的延迟消息来实现。 自动轮播实现如下内容 开始轮播&停止轮播 可配置轮播时长、轮播方向 通过自定义属性来配置轮播时长,方向 感知生命周期,可见时开始轮播,不可见时停止轮播 感知手指触摸,触摸按下时停止…

    Android 2023年4月17日
    00
  • 投放视频广告时,如何快速与第三方播放器兼容?

    新媒体时代,广告样式越来越丰富。相较于传统的图文信息,视频类广告更具有直观性,能够让消费者在了解产品知识和功能的同时加深对产品的印象。 因此在各类网站或App上投放视频类广告是个很好的宣传方式,但广告商们如果想在网站上展示视频广告,必须确保视频广告投放协议与发布渠道的播放器兼容;如果不能兼容,广告商或者视频广告投放平台必须创建不同的响应,来与特定视频播放器兼…

    Android 2023年4月17日
    00
  • 【FAQ】关于JavaScript版本的华为地图服务Map的点击事件与Marker的点击事件存在冲突的解决方案

    一. 问题描述 创建地图对象,并添加marker标记,对map和marker均添加了点击事件; <body> <script> function initMap() { // 创建地图对象 const map = new HWMapJsSDK.HWMap(document.getElementById(‘map’), { center…

    Android 2023年4月27日
    00
  • Android 常用 adb 命令总结

    Android 常用 adb 命令总结 adb ( 全称为Android Debug Bridge)是一个C/S 架构命令行工具,起到调试桥的作用,是连接Android手机与PC端的桥梁,方便我们在电脑上对手机进行操作。adb 命令可用于执行各种设备操作,如安装和调试应用。 点击下载adb工具 ADB和Fastboo最新Google官方下载地址:https:…

    Android 2023年4月18日
    00
  • Android中设置Button为透明

    设置Button为透明状态,有两种最简单的方式: 1. 在layout.xml文件中的Button节点下,设置Button的Alpha属性,因为该属性在0~255范围内取值,0表示完全透明,255表示完全不透明; 但是此方法有一个缺点,当设置为0后,Button上的文字也看不见了。所以在项目中使用了第二种方法。 2. 在layout.xml文件中的Butto…

    Android 2023年4月17日
    00
  • Android报”InflateException”如何解决?

    Android报”InflateException”异常通常是在使用布局文件时出现的,表示在布局文件中出现了错误,导致无法正常加载页面,下面详细讲解该异常的原因和解决办法。 原因 1. Layout文件中资源文件引用错误 如果在布局文件中引用了不存在资源文件或者资源文件引用错误,就会出现”InflateException”异常,比如在布局文件中使用的图片文件…

    Android 2023年4月3日
    00
  • Opengl ES之踩坑记

    前因 最近在尝试使用Opengl ES实现一些LUT滤镜效果,在实现这些滤镜效果的时候遇到一些兼容性的坑,踩过这些坑后我希望把这几个坑分享给读者朋友们,希望同在学习Opengl ES的朋友们能少走弯路。 关于LUT滤镜相关的介绍,也是这个Opengl ES系列入门教程的一项内容,在后面的文章中会专门介绍,这里暂时不展开讲解,后续大家敬请期待。 踩坑详情 1、…

    Android 2023年4月18日
    00
合作推广
合作推广
分享本页
返回顶部