Android当代码方法超过65536个时,在2.3机器上会不能安装,出现INSTALL_FAILED_DEXOPT错误

今天打包时,发现2.3机器,产生的APK在某些机器上不能安装(Installation error: INSTALL_FAILED_DEXOPT),针对这个问题的一个可能解释是:最新的ADT和SDK Tool在将jar转化成dex的时候,可能会合并类的代码,这将导致巨大的类;类中的每一个方法都分配有一个id,字节码中以id标识和调用方法;早期的Dalvik VM内部使用short类型变量来标识方法的id,最大值限制在65535;综合上述因素,代码在安装的时候,不能通过验证,所以安装失败。

  我们的项目因为代码里引入了过多的开源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/tuLXN9GkVas

  目前2.3版本市场只有20%了,希望这个占有率快速下降吧!

时间: 2024-11-02 03:06:47

Android当代码方法超过65536个时,在2.3机器上会不能安装,出现INSTALL_FAILED_DEXOPT错误的相关文章

Android恶意代码分析与渗透测试

这篇是计算机类的优质预售推荐>>>><Android恶意代码分析与渗透测试> 从环境构建到分析,涵盖服务体系全过程:以线上线下技巧为基础,展现虚拟环境渗透测试真方法 编辑推荐 从环境构建到分析,涵盖服务体系全过程 以线上/线下技巧为基础,展现虚拟环境渗透测试真方法 内容简介 本书由"恶意代码分析"和"移动服务诊断"两大主题组成.各章节包含了分析步骤,作者们还亲自编写了黑客大赛应用程序试题,读者可以借此复习学过的内容. Androi

解决Android单个dex文件不能超过65536个方法问题

当我们的项目代码过大时,编译运行时会报Unable to execute dex: method ID not in[0, 0xffff]: 65536)错误.当出现这个错误时说明你本身自己的工程代码中含有的太多的方法,或者你的工程lib文件夹下引用的第三方插件jar包有太多的方法,这两者的方法加起来已经超过了65536这个数目.而谷歌规定单个dex文件中的方法不能超过65536的限制. 那么这个时候,我们就需要分包处理解决.一般情况下的解决方案就是把整个项目工程包括jar,区分开来分解成两个d

Android - Android调用JNI方法 及 代码

Android调用JNI方法 及 代码 本文地址: http://blog.csdn.net/caroline_wendy JNI: Java Native Interface, 实现Java和C/C++的互通. 在Android上使用JNI的方法. 时间:2014.9.3 环境: 必须使用标准Eclipse, 安装Android的环境, 才可以使用NDT插件. Eclipse Standard/SDK Version: Luna Release (4.4.0); Android: ADT-23

android在代码中四种设置控件背景颜色的方法(包括RGB)

转载请注明出处: http://blog.csdn.net/fth826595345/article/details/9208771  TextView tText=(TextView) findViewById(R.id.textv_name); //第1种: tText.setTextColor(android.graphics.Color.RED);//系统自带的颜色类 // 第2种: tText.setTextColor(0xffff00ff);//0xffff00ff是int类型的数据

将应用代码由eclipse导入Android studio的方法NDK-Build和Cmake两种方法(以android_serialport_api为例)

网上翻了几百篇博客,看了半天,要不就是写的乱七八糟看不懂,要不就是隐藏了一些细节,要不就是实现不了,最后还是在Android官网上看明白了,而且说得有条有理,以后遇到不懂的一定要先翻官网. 参考资料:https://developer.android.com/studio/projects/add-native-code.html?utm_source=android-studio#link-gradle 1. 导入eclipse到Android studio 1. 导入工程: 点击如下所示:

图片--Android有效解决加载大图片时内存溢出的问题

Android有效解决加载大图片时内存溢出的问题 博客分类: Android Android游戏虚拟机算法JNI 尽量不要使用setImageBitmap或setImageResource或BitmapFactory.decodeResource来设置一张大图,因为这些函数在完成decode后,最终都是通过java层的createBitmap来完成的,需要消耗更多内存. 因此,改用先通过BitmapFactory.decodeStream方法,创建出一个bitmap,再将其设为ImageView

DEX 方法超过64K限制和gradle编译OOM问题解决

如果你是一个Android开发者,你至少听说过的Dalvik的蛋疼的64K方法限制.概括地说,在一个DEX文件,你可以调用很多的方法,但你只能调用它们最前面的65,536个 ,因为这是在方法调用集合中的所有的空间了.如果你的源代码和狂拽炫酷叼炸天的三方库中方法超过了这个限制.看这篇文章就对了. UNEXPECTED TOP-LEVEL EXCEPTION: com.android.dex.DexIndexOverflowException: method ID not in [0, 0xffff

Android性能优化方法(九)

通常我们写程序,都是在项目计划的压力下完成的,此时完成的代码可以完成具体业务逻辑,但是性能不一定是最优化的.一般来说,优秀的程序员在写完代码之后都会不断的对代码进行重构.重构的好处有很多,其中一点,就是对代码进行优化,提高软件的性能.下面我们就从几个方面来了解Android开发过程中的代码优化. 1)静态变量引起内存泄露 在代码优化的过程中,我们需要对代码中的静态变量特别留意.静态变量是类相关的变量,它的生命周期是从这个类被声明,到这个类彻底被垃圾回收器回收才会被销毁.所以,一般情况下,静态变量

Android开发代码规范(转)

Android开发代码规范 1.命名基本原则    在面向对象编程中,对于类,对象,方法,变量等方面的命名是非常有技巧的.比如,大小写的区分,使用不同字母开头等等.但究其本,追其源,在为一个资源其名称的时候,应该本着描述性以及唯一性这两大特征来命名,才能保证资源之间不冲突,并且每一个都便于记忆. 对于理解应用程序的逻辑流,命名方案是最有影响力的一种帮助.名称应该说明“什么”而不是“如何”.命名原则是:使名称足够长以便有一定的意义,并且足够短以避免冗长.唯一名称在编程上仅用于将各项区分开.以下几点