确定odex文件大小膨胀的原因

15

我的apk大小为13MB,但在安装后所占空间为25MB。然而,在做了一些更改(添加库,创建模块和更好地组织应用程序)后,apk大小增加到了14MB,而odex文件现在为56MB。有什么方法可以确定为什么大小增加了吗?

我有一个已root的设备。因此,如果有传统方法之外的更多方法可用,我也可以使用它们。我检查了几个博客和论坛。所有这些都解释了与odex-ing和deodex-ing相关的功能。

编辑:odex文件的大小会随着时间的推移而增加。(从25MB增加到81MB)。

这个 SO Q/A解释了odex是什么,但我找不到任何解释odex文件(缺乏更好的词语) 增长的地方。

可能的选项是当应用程序的资源被使用时,应用程序odex文件生成更多的引用,以使启动时间保持恒定/更快吗?

编辑2: 由于很多人都建议我检查我的库/依赖关系并减少它们, 我想强调观察到的事实是。文件大小在安装后的下几个启动中增加。如果是因为添加了库,则APK大小会增加,这是可以理解的。其余的文件(.db、shared preferences等)会增大,这是预期的。我无法弄清楚为什么.odex文件在安装后会增加,而且每次启动后都会继续增加。这种大小的增加只发生在.odex文件上。

我已检查这些文件,因为我使用的是已root的设备。


1
尝试对两个APK文件进行反编译,并检查它们的大小增量。 - Vivek Mishra
1
做了。就像我说的,apk大小是相同的。通过反编译,classes.jar 的大小也相似。只有 .odex 文件的大小差异非常大。 - Droidekas
你使用的是哪个设备和 Android 版本?增长情况如何随时间演变?它是否持续,是否已经稳定下来? - cuihtlauac
1
@cuihtlauac 不,它在3~4次应用程序启动后达到最大值。基于此,我可以(毫无根据地)得出结论,这是一种索引功能? - Droidekas
你是否观察到这种行为是在发布版还是调试版中出现的?并且你是否正在使用即时运行? - tynn
显示剩余7条评论
4个回答

0

它增长是因为您添加了库。也许您只需要库中的一个函数,但是您却添加了整个库,其中包含大量资源和函数,因此apk变得更大。 关于时间的增加:您的程序(或您使用的库)可能会缓存图像、网络请求、写入数据库等,因此程序的大小会增加。


请检查上一个答案中的注释。应用程序下载后,大小会持续增加。 - Droidekas
正如我在答案中所说,您的程序(或您使用的库)可能会缓存图像、网络请求、写入数据库等,因此程序的大小会增加。 - Viktor Sinelnikov
是的,但这将占用.db文件或其他类似文件夹所占用的空间。这将计入数据。静态资源,如下载的图像/外部数据库,甚至共享首选项等存储在.odex文件之外。 - Droidekas
关于臃肿的库,Proguard也会剥离未使用的方法。因此,apk大小的增加不可能是由于这个原因。 - Droidekas

0

我相信它会随着 APK 文件大小的增加而增长,主要是因为添加了库、图像资源等。

您可以尝试使用 ProGuard 来缩小 APK 大小,也许 odex 文件也会缩小。


就像我之前所说的那样,应用程序下载后,大小会随着时间的推移而增加。在此之后不会添加任何库/图像资源。因此,对于这种情况,Proguard / 添加库不应该有任何影响。 - Droidekas

0
尝试在Gradle构建文件中设置shrinkResources true以删除未使用的资源。

这将导致较小的apk大小,请查看问题的编辑以获取更多上下文。 - Droidekas

0

问题是

进行一些更改(添加库,创建模块和更好地组织应用程序

现在,考虑这个。

您添加不同的库。 当库是外部或第三方库时,代码会与您的apk打包。 但是当库是Android框架库,已经可用于设备时,它们不会捆绑在apk中。但是这些将包含在odex文件中,这就是为什么您看到膨胀的原因。

因此,我在这里的假设是您使用的附加模块和库具有许多新的系统库。 或者您内部使用的库利用了系统库。 您可以尝试删除或使用这些库的最小版本,并查看odex文件大小是否受到影响。

聊天中的解释


你能看到第二次编辑吗?我认为那应该有助于解释这种情况。 - Droidekas
这正是我试图解释的。因此,已经预装在手机上的Android库将不会被打包到APK中。但是,在创建odex文件时,将从设备上已经存在的Android操作系统中的库中获取它们。 - Viral Patel
第三方库不像 Android 系统库一样需要在设备上存在,因此它们会被打包到 APK 中。但 Android 系统库则不会。 - Viral Patel
如果可能的话,请分享您在看到膨胀之前添加的库和模块列表及其库,并让我们尝试断言我的理由是否正确。 - Viral Patel
因此,已经用于手机的 Android 库将不会打包在 APK 中。但是,在创建 odex 文件时,将从设备上 Android 操作系统中已有的库中包括它们。您是否有任何官方来源证实这一点?至于添加库,它是将一个大模块(应用程序)分成两个模块。这是所有更改的内容。 - Droidekas
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接