【发布时间】:2012-09-21 17:42:31
【问题描述】:
我的 Android 应用 APK 相当大,约为 480 MB。我可以很好地安装应用程序,但在 Android OS 2.2 上,当应用程序启动时我收到此错误(在 logcat 中):
09-21 00:04:12.855: W/dalvikvm(3178): mmap(480331001, RO, FILE|SHARED, 28, 0) failed: Out of memory
09-21 00:04:12.855: W/dalvikvm(3178): Map of '/data/app/com.mycompany.myapp-1.apk' failed
09-21 00:04:12.855: D/AndroidRuntime(3178): Shutting down VM
09-21 00:04:12.855: W/dalvikvm(3178): threadid=1: thread exiting with uncaught exception (group=0x4001d828)
09-21 00:04:12.859: E/AndroidRuntime(3178): FATAL EXCEPTION: main
09-21 00:04:12.859: E/AndroidRuntime(3178): java.lang.RuntimeException: Unable to instantiate activity
...
这在 OS 4.0+ 上不会发生。一些用户在 2.3.4 和 2.3.7 中报告启动时崩溃,我怀疑这是同一个问题。为什么我的 APK 上的 mmap 失败?
编辑:我知道该应用程序非常大(这是一款包含大量资产的游戏),并且 Play 商店将 APK 限制为 50 MB,但这是针对另一个国家/地区的运营商没有APK 大小限制。我已经在 Play 商店中有一个应用版本,其 APK 约为 20MB,它使用了没有 mmap 问题的扩展文件。
【问题讨论】:
-
只是出于好奇,您的应用程序是如何消耗将近一半的空间的?
-
哇,哇,我的内存疼。将这些东西从 APK 中移开,并在首次运行时下载它,或者根据需要进行分区和下载。它是什么,我可以问一下吗?离线电话簿?高清电影?
-
该应用是一款游戏,拥有大量资产。 APK 的大小不应该与它消耗多少内存 (RAM) 无关吗? APK 是 mmap 的,这应该意味着它在虚拟内存中占用的地址空间是由文件系统支持的,而不是由内存支持的,对吗?这个“mmap out of memory”问题发生在我在 Java 中执行单个“new”或在 C 中执行“malloc”之前(我使用 JNI)。
-
附注:您只能以 50MB 的增量将 APK 上传到 Play 商店。如果您打算使用它,则需要将其拆分为expansion APKs。
-
我确实有一个使用 Play 商店扩展文件的应用版本,但这个特定版本适用于另一个国家/地区的另一个运营商的商店,它没有 APK 大小限制(并且没有扩展文件选项)。附带说明一下,Play 商店中使用扩展文件的 APK 大小约为 20 MB 的版本没有 mmap 问题。