AS问题解决系列1—Unable to execute DX错误

Posted 再见理想

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了AS问题解决系列1—Unable to execute DX错误相关的知识,希望对你有一定的参考价值。

 

http://my.oschina.net/1pei/blog/478968

摘要 在将一个开源android代码import到Android Studio 1.2.2中时,解决了编译期间出现的“Unable to execute DX(Multiple dex files define)”问题,并学习了DX工具在应用程序编译期间所起的作用。

    今天在将一个开源Android代码import到Android Studio 1.2.2中,在编译期间出现一个“Unable to execute DX”的编译错误,错误类型是“Multiple dex files define”,具体错误信息见下图:

技术分享

    原因:该project包含好几个module,在源代码被import到Android Studio时,在根目录下自动生成了.idea/libraries文件夹,其中有两个xml文件,

    技术分享

     每个xml文件中都包含有下面类似的name为libraryTable的component:

    技术分享

   这两个xml的目的就是指定项目需要包含的sdk或libs中的jar包。当项目在build的时候,两个相同的jar都被打包到dex文件中,编译器搞不定,就出了这么个错误了。

   解决的办法也比较简单:将其中一个xml文件删除,只保留一个xml文件,这样项目build就顺利通过了。

 

   后记:根据[3],这个.idea目录下的文件是用于保存IntelliJ IDEA的设置,当设置修改后这里的文件应当会有变化。 

   那么,什么是DX呢?参考[4]以及本地Android Studio安装路径有以下总结:

   DX工具将Java class文件转换为一个.dex (Dalvik Executable)文件。

   dx.jar工具所在的目录:Android/sdk/build-tools/22.0.1/lib

    dx.bat所在的目录:Android/sdk/build-tools/22.0.1/lib

 

    DX工具在Android中是做什么用的?

    Java源文件可通过Java编译器转换为Java class文件。

    dx工具将Java class文件转换为一个.dex (Dalvik Executable)文件。应用程序的所有class文件都放在这个.dex文件中,在转换过程中class文件中的冗余信息被优化掉。例如,在不同的class文件中如果有相同的String,那么.dex文件只包含这个String的一个引用。因此.dex文件要比对应的class文件要小。

    .dex文件与Android项目中的资源,例如图片资源,XML文件等, 被打包到一个.apk (Android Package)文件中。

    Android编译过程可参见下图:

技术分享

 

   

 

   上图中的aapt (Android Asset Packaging Tool) 将创建apk, 最终的.apk文件包含应用程序执行所有必要的数据,可通过ADB(Android Device Bridge)工具来部署,见下图。

   技术分享

 

参考资料

[1] Android项目Build报错:Unable to execute DX, http://www.baidufe.com/item/976bc16ceb9b4ab5507c.html

[2] Unable to execute DX(Multiple dex files define), http://www.baidufe.com/item/09a352cc9829270660ba.html

[3] Managing Projects Overview, https://developer.android.com/intl/zh-cn/tools/projects/index.html

[4] Android dx tool, http://stackoverflow.com/questions/8487268/android-dx-tool

[5] Building and Running Overview, http://developer.android.com/intl/zh-cn/tools/building/index.html

以上是关于AS问题解决系列1—Unable to execute DX错误的主要内容,如果未能解决你的问题,请参考以下文章

解决mui错误:Unable to preventDefault inside passive event listener due to target being treated as passiv

[Intervention] Unable to preventDefault inside passive event listener due to target being treated as

解决移动端报错:Unable to preventDefault inside passive event listener due to target being treated as……

解决移动端报错:Unable to preventDefault inside passive event listener due to target being treated as……(代码片段

Postman出现Unable to load data as you‘re offline的解决办法

Unable to preventDefault inside passive event listener due to target being treated as passive.