运行包含大量代码的应用程序

时间:2014-02-19 10:52:37

标签: android facebook dexopt

背景

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

正如我发现的那样,限制是在名为“LinearAlloc”的缓冲区上。

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

问题

如果您的代码太大(并且应用程序可以达到此状态),您将无法在旧设备上安装应用程序,从而获得下一个错误(也报告为here):< / p>

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

问题

Facebook是如何做到的?

是否有可能以其他方式克服这个问题?

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

对于较新的Android版本有什么限制,如果有的话?

其他巨大的应用程序(和游戏)如何处理此问题?他们把代码放到C / C ++中吗?

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

2 个答案:

答案 0 :(得分:1)

限制是方法引用的总数:

在FB / Google文章中描述的无操作和多方式方法之间的中间立场是使用像ProGuard这样的工具来删除Java级别对未使用代码的引用。参见:

答案 1 :(得分:0)

谷歌有一个新的解决方案:

您似乎只需做以下任何事情:   - 从“MultiDexApplication”而不是“Application”扩展   - 在应用程序的attachBaseContext

中调用MultiDex.install(context)

但现在我想知道:

  1. 真的吗?
  2. 有任何问题吗?它会影响性能吗?
  3. 它是如何运作的?
  4. ContentProvider应该怎么做,因为它在Application初始化之前被调用了?
  5. 帖子说“在所有API 4+设备上都提供MultiDex支持(好吧,直到v21,你可以在这里得到它)”。这是否意味着从v21开始它将是默认行为,或者只是该类将被内置并且您不需要使用支持库的类?
  6. 这个解决方案也适用于Eclipse吗?