`
kevinffk
  • 浏览: 34636 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

gradle多工程打包冲突问题

阅读更多

 将一个项目由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这样一个文件。 
它记录了你的项目中所有依赖的库的路径、版本信息、编译后存入的路径,如下:

 

 

 

<item
        jar="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的目录或文件,分析一下应该会很容易找到解决方法。

  • 大小: 4.6 KB
分享到:
评论

相关推荐

    gradle打包给unity使用

    2. **处理依赖冲突**:如果Unity项目和其他第三方库有依赖冲突,你可能需要在`build.gradle`中调整依赖的版本或者使用`exclude`规则来解决。 七、注意事项 1. **混淆配置**:如果你在发布模式下构建,记得在`...

    基于SpringBoot的Gradle工程

    4. **多模块项目支持**:对于大型项目,SpringBoot可以结合Gradle构建多模块项目,每个模块可以单独构建和测试,提高开发效率。 **SpringBoot项目结构** 一个典型的SpringBoot Gradle项目结构可能如下: - `build...

    Android Studio 通过gradle配置同时打多个不同包名的包

    在实际开发中,可能还需要处理一些特殊情况,例如处理依赖冲突、共享代码库等问题。这时,可以使用`sourceSets`来管理源代码和资源的包含关系。此外,你还可以利用Gradle的扩展性,编写自定义的Gradle插件来实现更...

    gradle-4.2-all

    Gradle是一款强大的构建工具,...随着Gradle的不断迭代,开发者可以期待更多的创新和优化,以适应快速发展的软件工程需求。如果你正在使用Android Studio或进行Java项目开发,升级到Gradle 4.2无疑会提升你的开发体验。

    gradle-2.1-all

    9. **多项目构建**:对于包含多个子项目的大型工程,Gradle 2.1 提供了更强大的多项目构建支持。开发者可以轻松管理多个项目之间的依赖关系,并一次性构建整个项目结构。 10. **持续集成**:2.1 版本加强了与各种...

    android 多个工程 打包

    总的来说,将多个Android工程打包成一个APK是一项技术性较强的任务,需要对Android的构建系统和Gradle有深入的理解。通过合理配置和调整,我们可以创建一个包含多个功能模块的大型应用,提供给用户更便捷的使用体验...

    gradle-7.4.2-bin.zip

    对于依赖管理,Gradle 7.4.2 提供了更智能的解析策略,可以自动解决依赖冲突,减少手动调整依赖关系的麻烦。 在构建脚本中,Gradle 7.4.2 引入了新的DSL(领域特定语言)元素,提升了脚本的可读性和可维护性。例如...

    gradle-3.1-src.zip

    Gradle-3.1 是 Gradle 的一个重要版本,它包含了构建工程所需的所有源代码和资源。在这个版本中,Gradle 提供了丰富的特性以优化开发者的构建体验。 首先,Gradle 3.1 强化了对 Android 开发的支持。在 Android ...

    gradle用户手册中文版

    - **Project**: 在Gradle中,一个项目是一个或多个任务的集合,通常对应于一个软件工程中的子项目。 - **Task**: 是一个独立的工作单元,例如编译源代码、运行测试等。 2. **Hello World示例** - Gradle提供了...

    gradle最新安装包20190310

    7. **多项目构建**:Gradle支持多项目构建,可以在一个顶层项目下管理多个子项目,方便大型工程的组织和协作。 8. **持续集成**:由于其强大的定制性和可扩展性,Gradle很适合与持续集成工具如Jenkins、Travis CI等...

    实战Gradle_引领技术-2019版.zip

    Gradle的核心概念是基于任务的构建,每个任务对应一个特定的构建动作,如编译源代码、打包或执行测试。通过定义任务间的依赖关系,Gradle可以智能地决定何时执行哪些任务,从而提高构建效率。此外,Gradle使用Groovy...

    Anddoid-gradle封装通用的版本以及Module 打包上传脚本;

    `Anddoid-gradle封装通用的版本以及Module打包上传脚本`就是为了解决这类问题而设计的。 首先,让我们深入理解一下`Android Gradle library打包`的概念。在Android中,库(library)是开发者复用代码和资源的一种...

    gradle-2.6-all.zip

    Gradle 2.6是该工具的一个重要里程碑,它引入了许多新特性,优化了性能,并修复了一系列问题,旨在提升开发效率。 首先,让我们了解Gradle 2.6的核心改进。这一版本加强了依赖管理,允许开发者更精确地控制依赖关系...

    Android gradle 3.3

    在Android开发中,Gradle与Android Studio紧密结合,负责编译、打包和部署应用。 1. **性能提升** - Android Gradle 3.3 强调了构建速度的提升。通过改进内部算法和资源处理,它可以更快地解析依赖项和执行构建...

    Gradle总结供各位下载

    Gradle能够智能地解析和下载项目所需的依赖,并处理版本冲突问题。它还提供了缓存机制,避免了不必要的网络请求,提高了构建速度。 在Gradle中,构建逻辑是围绕着“任务”进行的。任务是执行特定动作的最小单元,...

    gradle-6.2.2-all.zip和gradle-6.2.2-bin.zip

    - **多项目构建**:在一个根项目下管理多个子项目,方便大型工程的构建和管理。 通过合理利用Gradle的特性,开发者可以实现高度定制化的构建流程,提高开发效率。对于初学者,理解Gradle的基础概念和核心功能,以及...

    gradle-4.6-all.zip

    《Gradle 4.6 全面解析:构建现代软件工程的高效工具》 Gradle 4.6 是 Gradle 开源构建系统的一个重要版本,它以其强大的灵活性、可扩展性和自动化能力,深受广大开发者喜爱。这个版本在性能优化、易用性提升以及对...

    gradle 2.2.1

    7. **多项目支持**:Gradle 2.2.1 支持大型工程中的多项目构建,允许在一个顶层项目中管理多个子项目,便于大型项目组织和维护。 在实际使用中,通过解压`gradle-2.2.1`压缩包,你可以将Gradle添加到你的项目中,...

    gradle4.5_my_temp

    - **并行构建**:Gradle 4.5可能提升了并行构建的效率,使得多项目的构建更快。 - **缓存机制**:Gradle有智能的缓存机制,能够重用已完成的任务结果,减少不必要的工作,提高构建速度。 - **Gradle Wrapper**:...

Global site tag (gtag.js) - Google Analytics