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

背景

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

正如我所发现的,限制在一个名为“LinearAlloc”的缓冲区中。

在2.2或2.3这大约是5-8 MB,而我认为在其他方面是16或更多。

问题

如果代码太大(应用程序可以达到此状态),则在较旧的设备上将无法安装该应用程序,从而得到下一个错误( 此处也报告):

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

我发现了什么

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

我发现下面的链接谈论Facebook如何解决这个问题,以某种方式增加限制:

  • http://www.slashgear.com/how-facebook-fixed-its-gingerbread-dalvik-problem-04272478/
  • http://arstechnica.com/business/2013/03/how-facebook-dug-deep-within-android-to-fix-its-mobile-app/
  • https://www.facebook.com/notes/facebook-engineering/under-the-hood-dalvik-patch-for-facebook-for-android/10151345597798920

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

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

这个问题

Facebook如何做到这一点?

有没有可能以其他方式克服呢?

有没有免费的库增加/删除这个缓冲区的限制?

如果有更新的Android版本有什么限制?

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

加载dex文件dynamic地解决这个问题?

Solutions Collecting From Web of "运行包含大量代码的应用程序"

限制是方法引用的总数:

在FB / Google文章中描述的多任务处理方法之间的中间立场是使用像ProGuard这样的工具在Java级别去除对未使用代码的引用。 看到:

Google提供了一个新的解决scheme:

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

但是现在我想知道:

  1. 这是真的吗?
  2. 它有什么问题吗? 它会影响性能吗?
  3. 它是如何工作的?
  4. ContentProvider应该做些什么,因为它在Application被初始化之前调用?
  5. 这篇文章说:“所有API 4+设备都支持MultiDex支持(直到v21,本地获得这个设备)”。 这是否意味着从v21开始它将成为默认行为,或者只是将该类构build在内,而不需要使用支持库的类?
  6. 这个解决scheme也可以在Eclipse上工作吗?