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

标签 android facebook dexopt

背景

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

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

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

问题

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

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

我发现了什么

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

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

此外,Google 已发布如何通过动态加载代码来解决此问题:

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

问题

Facebook 是怎么做到的?

是否也可以通过其他方式克服这个问题?

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

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

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

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

最佳答案

限制是方法引用的总数:

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

关于android - 运行包含大量代码的应用程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21878324/

相关文章:

java - Robolectric String.format() 格式化数字时的无效行为

android - Facebook 广告中的安装历史记录不足

error-handling - 无法使用 android studio 在设备上运行应用程序

Android:以编程方式查看.setID(int id) - 如何避免 ID 冲突?

android - 错误 : "failed to find Build Tools revision..." after Android Studio installation

facebook - 无需登录即可使用 Meteor 登录服务连接社交网络

android - 处理 Android Facebook API 的响应对象

android - 包在设置中的 uid : 10124 on disk, 10134 不匹配

android - 调用api时如何处理map<dynamic> null对象