澄清安装MultiDex后会发生什么

时间:2018-10-24 12:15:16

标签: android multidex android-multidex

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

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

到目前为止,我发现了一些关于slackoverflow的关于MultiDex的主题,但是没有人谈论代码的实际情况以及MultiDex保存/缓存的数据类型。

2 个答案:

答案 0 :(得分:1)

单个.dex文件可以具有65,536个方法(引用),因此,如果引用数超过65,536,则可以使用multidex。

也许当您的应用存储了多个.dex文件时,它正在为新的.dex文件分配更多空间。

使用APK分析器关闭APK,以查看导致应用大小增加的原因

使用以下链接参考

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

答案 1 :(得分:1)

在您的gradle中启用了Multi-Dexing,并在Application类中对其进行了扩展。

在使用超过64,000种方法时使用。

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

我想说,大概90%的时间如果您遇到了多种dex需求,那么您可能没有正确管理依赖项。我不是每次都说。但是,通常的问题是人们带来了整个Google依赖关系,而不仅仅是您需要的依赖关系。例如Google Play服务。如果包含此选项,它将立即迫使您进行多重删除。但是,这确实会降低性能。现在,您要加载多个dex文件。当然,对于一些不会改变的东西,例如第三方的依赖关系,可以进行一些预先整理,以帮助您加快构建和部署的速度。但是,拥有多个查找表会带来速度问题。例如,如果您包括在内。

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可执行文件,以确保在Dalvic虚拟机上正确找到并执行唯一的方法签名。

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

现在,重要的是要认识到Android完全重做了他们的虚拟机,并且不再依赖Dex来安装现代OS虚拟机。因此,下一个问题是“您是否仍应使用它”?

好吧,如果您仍然需要支持pre-Lollipop,那么最好保留多聚糖。否则,如果您是棒棒糖或以上。 Android使用ART(Android运行时),没有此限制。老实说,拥有棒棒糖的人群很小,以我个人的观点不值得支持,但这取决于您的产品和需求。

希望可以帮助您了解这里的情况。

快乐编码