将一个项目由eclipse转android studio时,由于该项目引用lib多达6、7个,一上手就碰到了引用包冲突的问题,问题描述如下

UNEXPECTED TOP-LEVEL EXCEPTION:
com.android.dex.DexException: Multiple dex files define Landroid/support/v4/acce
ssibilityservice/AccessibilityServiceInfoCompat$AccessibilityServiceInfoVersionI
mpl;at com.android.dx.merge.DexMerger.readSortableTypes(DexMerger.java:579)at com.android.dx.merge.DexMerger.getSortedTypes(DexMerger.java:535)at com.android.dx.merge.DexMerger.mergeClassDefs(DexMerger.java:517)at com.android.dx.merge.DexMerger.mergeDexes(DexMerger.java:164)at com.android.dx.merge.DexMerger.merge(DexMerger.java:188)at com.android.dx.command.dexer.Main.mergeLibraryDexBuffers(Main.java:50
4)at com.android.dx.command.dexer.Main.runMonoDex(Main.java:334)at com.android.dx.command.dexer.Main.run(Main.java:277)at com.android.dx.command.dexer.Main.main(Main.java:245)at com.android.dx.command.Main.main(Main.java:106)

虽然这个问题在网上有很多类似解决的帖子,但均说的不全面详细,,我另外花了不少时间才把问题彻底解决,,在这里把经验分享出来。

第一步:
如果直接使用v4的jar包,gradle打包时,会将v4包打包进当前module,如果有引用该module的其它工程,会再将该module中的v4包再编译一次,导致v4包被打包多次,引起冲突。在对应项目的build目录下,你可以发现实实在在的存在多个v4包,只是它们的名字会多了一串sha1算法生成的字符串:

\build\intermediates\pre-dexed\official\debug

解决办法:在build.gradle中加入compile ‘com.android.support:support-v4:23.1.0’并删除libs目录下的v4包,这样可以避免多v4包的冲突问题(注意对应版本的V4包你是否下载,否则会另报错):

dependencies {compile fileTree(dir: 'libs', include: '*.jar')compile 'com.android.support:support-v4:23.1.0'
}

如果第一步可以了,那恭喜你,下面的内容可以暂时忽略了(如果以后没有包冲突的问题)。
但一般引用lib库多,由eclipse转的时候并不一定能这样理想,所以如果还有冲突,请继续看第二步。

第二步
既然还有冲突,那就去找到实际冲突的文件是哪些。
首先打开项目的root目录,也就是项目文件夹同一级的目录,会有一些gradle project的基本配置,目录结构如下:

your project/src/res/
build/
build.gradle
settings.gradle

打开build文件夹,定位到build\intermediates\dex-cache下,会有cache.xml这样一个文件。
它记录了你的项目中所有依赖的库的路径、版本信息、编译后存入的路径,如下:

 <itemjar="C:\tfs\you project\libs\android-support-v4.jar"jumboMode="false"revision="23.0.2"sha1="5896b0a4e377ac4242eb2bc785220c1c4fc052f4"><dex dex="C:\tfs\your project\build\intermediates\pre-dexed\official\debug\android-support-v4_8d5ef003cbda980f7be9134c6bb7eb7a566626d2.jar" /></item>

搜索其中的android-support-v4.jar,这些即是多余的引起冲突的包了,根据它提供的路径,找到并删除该jar。实际操作时,仅删除jar是不够的,由于gradle缓存文件的问题,上一次的编译可能已经将jar在build目录下编译了对应的文件,,所以直接将整个build目录删除了,避免缓存带来的删除jar不生效的问题。

这样再次编译应该就能解决v4包冲突的问题了。

如果存在其它类似的引用冲突的问题(基本上带Multiple dex的提示信息都是同一个问题),,也可以直接打开cache.xml,去定位问题。
gradle打包初次上手会有不少问题,,基本上找关键字build或gradle的目录或文件,分析一下应该会很容易找到解决方法。

gradle多工程打包冲突问题相关推荐

  1. Devops之Gradle SpringBoot构建打包工程jar、搭建jenkins自动发布

    本文逐渐涉及当前敏捷开发中非常火的DevOps相关的技术,也就是自动化开发运维.整体偏向于环境搭建,整体学习路线为: (1)SpringBoot+Gradle+Nexus远程仓库构建打包工程jar ( ...

  2. Android Studio下项目构建的Gradle配置及打包应用变体

    Gradle简介   Gradle是一个自动化构建工具,采用Groovy的Domain Specific Language(领域特定语言)来描述和控制构建逻辑.具有语法简洁.可读性强.配置灵活等特点. ...

  3. Spring Boot Maven聚合工程 打包部署教程

    Spring Boot 给聚合工程 打包部署,这里打jar包进行部署,首先等保证父子工程能正常运行,依赖都能加载,不会造成maven之间循环依赖等问题,如图 从上面的图来看,就会发生循环依赖的问题,这 ...

  4. 【Unity3D】Android 打包 ④ ( Android 工程打包 | Unity 中导出安卓工程 | Android Studio 打开 Unity 导出的 Android 工程 )

    文章目录 一. Android 工程打包 二. Android Studio 打开 Unity 导出的 Android 工程 一. Android 工程打包 Android 工程打包 就是将 Unit ...

  5. python程序打包成apk_利用Gradle+Python3自动打包Android APK上传到蒲公英。

    利用Gradle+Python3自动打包Android APK上传到蒲公英. 面对每次都要打包一个版本发布给测试,都要手动打包签名~然后登录上传文件.这些繁琐的事情.于是就想到一句很经典的话,(人生苦 ...

  6. Android Studio 一个工程打包多个不同包

    Android Studio 一个工程打包多个不同包 转: https://blog.csdn.net/kdsde/article/details/88639194 AS主要是利用gradle来实现这 ...

  7. 自定义Gradle插件实现打包上传到蒲公英

    上一篇文章提到了关于如何写Gradle自定义插件Plugin,本篇文件介绍下如何写gradle插件实现打包上传到pgy. 要实现打包上传到蒲公英必须要弄清楚以下问题: 1.什么时候打包完成?监听到打包 ...

  8. vue工程打包上线样式错乱问题 - bug解决(4种)

    vue工程打包上线样式错乱问题 - bug总结(4种) 项目开发完成后,执行npm run build,进行打包,将打包完成的dist文件部署在服务器.配置好域名解析,就可以实现工程上线. 上线后,有 ...

  9. Android 工程打包资源文件-OBB文件设置

    Android 工程打包资源文件-OBB文件设置 设备/引擎:Mac(11.6)/cocos 开发工具:Android studio(4.1.2) 开发语言:java 开发需求:对工程的资源文件进行打 ...

最新文章

  1. 统计数据背后的指数分布模型
  2. sqlite3 增删更改查询 callback使用
  3. 3.4.2 停止等待协议
  4. Docker容器网络管理
  5. [WUSTCTF2020]level3
  6. 如何使用docker配置深度学习开发环境
  7. jboss7的服务器开启和关闭命令
  8. Redis应用学习——Redis事务与实现分布式锁
  9. php redis hgetall 慢,redis的hGetAll函数的性能问题(记Redis那坑人的HGETALL)
  10. Impala使用RPM安装过程
  11. WPF中DataGrid在没有数据的时候也可以显示水平滚动条
  12. ceph分布式存储简介
  13. Spoiler Alert – 实现内容模糊隐藏效果的 jQuery 插件
  14. ThinkPHP的四种URL模式 URL_MODEL
  15. bodymovin输出Json动画为黑白的解决方案
  16. layui图片放大功能
  17. 动态图snapshot构建
  18. 基于Ubuntu 18.04配置固定IP方法
  19. 微信移动学习平台小程序 后台基于php+mysql
  20. 不用win10的人,在用win7-usb-creator时出现的一个无提示现像.

热门文章

  1. android 添加日程失败,Andriod向系统日历添加日程
  2. python ioc di_Spring介绍,IOC(控制反转),DI(依赖注入)介绍及两种注入方法
  3. matlab求传递函数在某个频率点的增益_【干货分享】轻松弄懂开关电源TL431环路补偿传递函数推导...
  4. Redis重新连接弹性
  5. Intellij IDEA 使用Spring-boot-devTools无效解决办法
  6. Activiti如何实现流程的回退
  7. C++ Exercises(十八)
  8. gecco 1.1.0稳定版发布,易用的轻量化爬虫
  9. Struts和Sitemesh整合,实现多个装饰器
  10. java软件工程师成长过程的学习