10

背景

似乎一些旧的 Android 操作系统(甚至可能是最新的)对每个应用程序可以容纳的代码量有限制。

正如我所发现的,限制是在一个名为 "LinearAlloc" 的缓冲区上。

在 2.2 或 2.3 上大约是 5-8 MB ,我认为在其他版本上是 16 或更多。

问题

如果您的代码太大(并且应用程序可以达到此状态),您将无法在旧设备上安装该应用程序,出现下一个错误(也报告在这里):

Installation error: INSTALL_FAILED_DEXOPT
Please check logcat output for more details.
Launch canceled!

我发现了什么

一种解决方案是尽可能多地删除代码和库,但在一些大型项目中,这样的事情很难做到。

我发现下一个链接讨论了 Facebook 如何通过某种方式增加限制来解决这个问题:

此外,谷歌发布了如何通过动态加载代码来解决它:

http://android-developers.blogspot.co.il/2011/07/custom-class-loading-in-dalvik.html

问题

脸书是怎么做到的?

是否也可以通过其他方式克服这一点?

是否有任何免费库可以增加/消除此缓冲区的限制?

对较新的 Android 版本有什么限制(如果有)?

其他大型应用程序(和游戏)如何处理这个问题?他们是否将代码放入 C/C++ 中?

动态加载 dex 文件会解决这个问题吗?

4

2 回答 2

1

限制是方法引用的总数:

什么都不做和 FB/Google 文章中描述的多 dex 方法之间的中间立场是使用 ProGuard 之类的工具在 Java 级别删除对未使用代码的引用。看:

于 2014-04-18T19:59:07.470 回答
0

谷歌提供了一个新的解决方案:

看来您所要做的就是接下来的任何事情: - 从“MultiDexApplication”而不是“Application”扩展 - 在应用程序的 attachBaseContext 中调用 MultiDex.install(context)

但现在我想知道:

  1. 真的是这样吗?
  2. 它有什么问题吗?会影响性能吗?
  3. 它是如何工作的?
  4. ContentProvider 应该怎么做,因为它在应用程序初始化之前被调用?
  5. 该帖子说“在所有 API 4+ 设备上为您提供 MultiDex 支持(嗯,直到 v21,您可以在本地获得它)”。这是否意味着从 v21 开始它将成为默认行为,或者只是该类将被内置并且您不需要使用支持库的类?
  6. 这个解决方案也适用于 Eclipse 吗?
于 2014-10-26T18:09:36.190 回答