首页 > 解决方案 > 说明安装 MultiDex 后会发生什么

问题描述

安装 MultiDex 后,我注意到,首次启动应用程序需要额外的 4-5 秒。然而,经过一些研究,我注意到手机设置(应用程序管理器)中的应用程序大小从 7 MB 变为 19 MB,如果我清除数据,应用程序又回到 7 MB。但是每次我第一次启动应用程序时,应用程序的大小都会增加一倍以上。

现在我的问题是,是什么导致了应用程序大小增加了这么多?

到目前为止,我在 slackoverflow 上找到了一些关于 MultiDex 的主题,但没有人谈论代码真正发生了什么,以及 MultiDex 保存/缓存的数据类型。

标签: androidandroid-multidex

解决方案


Multi-Dexing 在您的 gradle 中启用并在您的 Application 类中扩展。

当您使用超过 64,000 种方法时使用此选项。

https://developer.android.com/studio/build/multidex

如果您遇到多 dex 需求,我会说可能有 90% 的时间,您可能没有正确管理您的依赖项。我不是每次都说。但是,通常问题是人们引入了整个 Google 依赖项,而不仅仅是您需要的那些。例如 Google Play 服务。如果你包含这个,它会立即迫使你进入多索引。但是,这确实会影响性能。您现在有多个 dex 文件要加载。当然,对于不会改变的事物(例如 3rd 方依赖项)有一些预索引,以帮助您加快构建和部署速度。但是,拥有多个查找表会带来速度后果。例如,如果您包括在内。

com.google.android.gms

仅其中就有大约 44,000 种方法,您应该指定您想要的方法

com.google.android.gms:play-services-location:16.0.0

例如。因此,在您开始使用 Multi-Dex 之前,请确保您已正确清理了未使用的依赖项,并且您正在正确管理传递依赖项树。另外不要忘记使用 ProGuard 或新的 D8 缩小过程,因为这也可能对您有所帮助,尽管如果您有大量依赖项,可能还需要您在 Debug 中运行。

如果你已经完成了所有这些,但你仍然需要使用 Multi-Dex(我在大型公司遇到过这种情况,迫使你使用大量臃肿的库),那么你就去做吧。

现在说到发生了什么,Dex 代表 Dalvik Executable。它是将代码打包成 Dalvik 字节以供执行的过程。这仅限于 65,536 种方法。他们在文档中说 64k,但我读过的所有地方都显示 65k+。许多 Google 的库已经包含 17k 种方法,这使您可以直接使用 1/4 的方法。

我相信这个问题与每个方法签名和查找表的 2 个字节的标头分配有关。他们可以创建的唯一 ID 数量受到限制。所以它需要你为方法签名创建多个带有多个查找表的 dex 文件。所以简短的回答是,它制作了多个 Dalvik 可执行文件,以确保在 Dalvik 虚拟机上正确找到和执行唯一的方法签名。

其他需要注意的重要事项是,在 Android API 21 之前,虚拟机仅支持 1 个 dex 文件。因此,您需要在应用程序 onCreate 上进行多 dex 安装,以正确引入其余部分。但是,如果您使用 proguard,您的附加 dex 文件可能已被删除,因此您可能还需要处理 MultDexProguard 文件。

现在,重要的是要意识到 Android 完全重做了他们的虚拟机,并且不再依赖 Dex 来构建他们的现代操作系统虚拟机。那么下一个问题是“你还应该使用它吗”?

好吧,如果您仍然需要支持棒棒糖之前的版本,那么您最好保留您的 multi-dex。否则,如果你是棒棒糖及以上。Android 使用 ART(Android Runtime),没有这个限制。老实说,拥有前棒棒糖的人口太少了,我个人认为不值得支持,但这取决于您的产品和您的需求。

希望这有助于阐明这里的一些事情。

快乐编码


推荐阅读