今天在将一个开源Android代码import到Android Studio 1.2.2中,在编译期间出现一个“Unable to execute DX”的编译错误,错误类型是“Multiple dex files define”,具体错误信息见下图:
html
缘由:该project包含好几个module,在源代码被import到Android Studio时,在根目录下自动生成了.idea/libraries文件夹,其中有两个xml文件,android
每一个xml文件中都包含有下面相似的name为libraryTable的component:ide
这两个xml的目的就是指定项目须要包含的sdk或libs中的jar包。当项目在build的时候,两个相同的jar都被打包到dex文件中,编译器搞不定,就出了这么个错误了。工具
解决的办法也比较简单:将其中一个xml文件删除,只保留一个xml文件,这样项目build就顺利经过了。优化
后记:根据[3],这个.idea目录下的文件是用于保存IntelliJ IDEA的设置,当设置修改后这里的文件应当会有变化。
ui
那么,什么是DX呢?参考[4]以及本地Android Studio安装路径有如下总结:idea
DX工具将Java class文件转换为一个.dex (Dalvik Executable)文件。spa
dx.jar工具所在的目录:Android/sdk/build-tools/22.0.1/libcomponent
dx.bat所在的目录:Android/sdk/build-tools/22.0.1/libxml
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