澄清安装 MultiDex 后会发生什么

Clarification on What happens after installing MultiDex

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

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

到目前为止,我在 slackoverflow 上找到了一些关于 MultiDex 的主题,但是 none 讨论了代码真正发生的事情,以及 MultiDex 的数据类型 saves/caches。

一个 .dex 文件可以有 65,536 个方法(引用),所以如果引用的数量超过 65,536,你就用 multidex。

可能因为您的应用存储了多个 .dex 文件,它正在为新的 .dex 文件分配更多 space。

使用 APK 分析器分解您的 APK 以查看导致应用大小增加的原因

使用以下link参考

https://developer.android.com/studio/build/apk-analyzer

如果您想减小应用程序的大小,这篇文章很有帮助

https://medium.com/exploring-code/how-you-can-decrease-application-size-by-60-in-only-5-minutes-47eff3e7874e

Multi-Dexing 在您的 gradle 中启用并在您的应用程序 class.

中扩展

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

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

我想说,如果您遇到多 dex 需求,可能有 90% 的时间,您可能没有正确管理您的依赖项。我不是每次都说。但是,通常问题是人们引入了整个 Google 依赖项,而不仅仅是您需要的依赖项。例如 Google 播放服务。如果你包括这个,它会立即迫使你进入 multi-dexing。但是,这确实会影响性能。你现在有多个 dex 文件要加载。当然有一些 pre-dexing 不会改变的东西,例如第 3 方依赖项,可以帮助您加快构建和部署速度。但是,多次查找 tables 会带来速度上的后果。例如,如果您包括。

com.google.android.gms

其中仅包含大约 44,000 个方法,您应该像

一样指定您想要的方法
com.google.android.gms:play-services-location:16.0.0

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

如果你已经完成了所有这些,但你仍然需要使用 Multi-Dex(我在大公司已经 运行 进入了这个,这些公司迫使你使用大量膨胀的库)那么你就去吧.

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

我认为这个问题与 header 每个方法签名分配 2 个字节和查找 table 有关。他们可以创建的唯一 ID 数量有限。因此,它需要您创建多个 dex 文件,其中包含多个查找 tables 的方法签名。所以简短的回答是,它生成多个 Dalvik Executable 文件以确保在 Dalvic 虚拟机上正确找到并执行唯一的方法签名。

其他需要注意的重要事项是,在 Android API 21 之前,虚拟机仅支持 1 个 dex 文件。因此,您需要在您的应用程序 onCreate 上执行 multi-dex install 以正确引入其余部分。但是,如果您使用的是混淆器,您的额外 dex 文件可能已被删除,因此您可能还需要处理 MultDexProguard 文件。

现在,重要的是要意识到 Android 完全重做了他们的虚拟机,不再依赖 Dex 作为他们现代的 OS 虚拟机。那么下一个问题是"should you still use it"?

好吧,如果您仍然需要支持 pre-Lollipop,那么您最好将 multi-dex 留在原地。否则,如果你是 Lollipop 及以上。 Android 使用 ART(Android 运行时)并且没有此限制。老实说,pre-Lollipop的人口太少了,我个人认为不值得支持,但这取决于你的产品和你的需求。

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

快乐编码