今天打包时,发现2.3机器,产生的APK在某些机器上不能安装(Installation error: INSTALL_FAILED_DEXOPT),针对这个问题的一个可能解释是:最新的ADT和SDK Tool在将jar转化成dex的时候,可能会合并类的代码,这将致使巨大的类;类中的每个方法都分配有一个id,字节码中以id标识和调用方法;早期的Dalvik VM内部使用short类型变量来标识方法的id,最大值限制在65535;综合上述因素,代码在安装的时候,不能经过验证,因此安装失败。android
咱们的项目由于代码里引入了过多的开源library,因此致使方法数过多,最后只能精简代码,删除没必要要的library来解决这个问题。
最新的Android已经解决了这个问题,可是更早的Android版本可能仍然存在此问题。
所以,因为大量遗留机器的存在,这个问题是不能完全解决的,一个临时的解决方案是:删掉没有实际使用的代码,或者使用ProGuard处理代码(能够减少代码体积)。
一个不幸的推论是:随着一个软件功能的增长,代码的膨胀,APK包终将超出能够处理的范围,也许就是8M(指APK包里面的classes.dex).
与此问题相关的两个讨论组是:
https://code.google.com/p/android/issues/detail?id=40409
https://groups.google.com/forum/?fromgroups=#!topic/adt-dev/tuLXN9GkVasgoogle
目前2.3版本市场只有20%了,但愿这个占有率快速降低吧!spa