背景
似乎一些旧的 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://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
此外,谷歌发布了如何通过动态加载代码来解决它:
http://android-developers.blogspot.co.il/2011/07/custom-class-loading-in-dalvik.html
问题
脸书是怎么做到的?
是否也可以通过其他方式克服这一点?
是否有任何免费库可以增加/消除此缓冲区的限制?
对较新的 Android 版本有什么限制(如果有)?
其他大型应用程序(和游戏)如何处理这个问题?他们是否将代码放入 C/C++ 中?
动态加载 dex 文件会解决这个问题吗?