安卓工程如何正确导入第三方jar (1) ---问题原因

来源:互联网 发布:dnf校园网打团网络冲突 编辑:程序博客网 时间:2024/05/22 13:42

问题描述

使用的是 intellij idea,在某个安卓工程下想利用volley框架编写一些程序,导入了volley.jar然后成功编译,部署到模拟器或者真机器的时候出现问题,出现了,

INSTALL_FAILED_DEXOPT

这种问题。

参考资料

Hack Dalvik VM解决Android 2.3 DEX/LinearAllocHdr超限
Android dex分包方案
Android 使用android-support-multidex解决Dex超出方法数的限制问题,让你的应用不再爆棚

问题答案

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

*原本以为这只是一些小问题,想不到竟然牵扯到android虚拟机的问题*,

  1. android的jvm,错了,叫dvm不能运行class代码,必须先将所有代码【包括jar里面的】,就是说,项目先通过java compiler编译成class文件,然后再通过dex工具统一编译到一个dex文件里面,由于dex要帮每一个方法进行id提取命名,但是用的是short变量,所有最多只能由65000+多个方法,超出这个数量就报错。

  2. android的jvm,错了,叫dvm不能运行class代码,必须先将所有代码【包括jar里面的】,就是说,项目先通过java compiler编译成class文件,然后再通过dex工具统一编译到一个dex文件里面,由于dex要帮每一个方法进行id提取命名,但是用的是short变量,所有最多只能由65000+多个方法,超出这个数量就报错。

  3. android的jvm,错了,叫dvm不能运行class代码,必须先将所有代码【包括jar里面的】,就是说,项目先通过java compiler编译成class文件,然后再通过dex工具统一编译到一个dex文件里面,由于dex要帮每一个方法进行id提取命名,但是用的是short变量,所有最多只能由65000+多个方法,超出这个数量就报错。
    **

重要的事重复三次。

下面顺便将安卓项目编译过程图贴出来:
这里写图片描述

解释【这段话是引用的】


  1. IDE中的资源打包工具 (Android Asset Packaging Tool ,即图中的aapt) 会将应用中的资源文件进行编译,这些资源文件包括AndroidManifest.xml文件,为Activity定义的 XML 文件等等。在这个编译过程中也会产生一个R.java文件,这样你就可以在你的Java代码中引用这些资源了。
  2. aidl 工具会将你项目中的所有.aidl接口转换成Java接口。
  3. 项目中的所有的Java代码,包括R.java和.aidl文件,都会被Java编译器编译,然后输出 .class 文件。
  4. 接着 dex 工具就会把上一步骤产生的 .class 文件转成 Dalvik 字节码,也就是.dex文件。同时项目中包含的所有第三方类库和 .class 文件也会被转换成.dex文件,这样讲方便下一步被打包成最终的.apk文件。
  5. 所有的不能编译的资源(比如图片等等)、编译后的资源文件和 .dex 文件会被 apkbuilder 工具打包成一个.apk文件。
  6. 一旦.apk文件被构建好之后,如果要把把它安装到设备上面去的话,它就必须用一个debug 或者发行key来对这个apk文件签名。
  7. 最后,如果应用程序已经被签名成为发行模式的apk,你还需要使用aipalign工具对.apk进行对齐优化。这样的话可以减少应用程序在设备上的内存消耗。

解决方案

采用gradle进行安卓项目编译,设置成为编译多个dex文件,app里面采用 android-support-multidex.jar加载不同的dex
但是这个问题实在有点麻烦,解决方案就等下一篇文章了

0 0