将一个项目由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的目录或文件,分析一下应该会很容易找到解决方法。
相关推荐
2. **处理依赖冲突**:如果Unity项目和其他第三方库有依赖冲突,你可能需要在`build.gradle`中调整依赖的版本或者使用`exclude`规则来解决。 七、注意事项 1. **混淆配置**:如果你在发布模式下构建,记得在`...
4. **多模块项目支持**:对于大型项目,SpringBoot可以结合Gradle构建多模块项目,每个模块可以单独构建和测试,提高开发效率。 **SpringBoot项目结构** 一个典型的SpringBoot Gradle项目结构可能如下: - `build...
在实际开发中,可能还需要处理一些特殊情况,例如处理依赖冲突、共享代码库等问题。这时,可以使用`sourceSets`来管理源代码和资源的包含关系。此外,你还可以利用Gradle的扩展性,编写自定义的Gradle插件来实现更...
Gradle是一款强大的构建工具,...随着Gradle的不断迭代,开发者可以期待更多的创新和优化,以适应快速发展的软件工程需求。如果你正在使用Android Studio或进行Java项目开发,升级到Gradle 4.2无疑会提升你的开发体验。
9. **多项目构建**:对于包含多个子项目的大型工程,Gradle 2.1 提供了更强大的多项目构建支持。开发者可以轻松管理多个项目之间的依赖关系,并一次性构建整个项目结构。 10. **持续集成**:2.1 版本加强了与各种...
总的来说,将多个Android工程打包成一个APK是一项技术性较强的任务,需要对Android的构建系统和Gradle有深入的理解。通过合理配置和调整,我们可以创建一个包含多个功能模块的大型应用,提供给用户更便捷的使用体验...
对于依赖管理,Gradle 7.4.2 提供了更智能的解析策略,可以自动解决依赖冲突,减少手动调整依赖关系的麻烦。 在构建脚本中,Gradle 7.4.2 引入了新的DSL(领域特定语言)元素,提升了脚本的可读性和可维护性。例如...
Gradle-3.1 是 Gradle 的一个重要版本,它包含了构建工程所需的所有源代码和资源。在这个版本中,Gradle 提供了丰富的特性以优化开发者的构建体验。 首先,Gradle 3.1 强化了对 Android 开发的支持。在 Android ...
- **Project**: 在Gradle中,一个项目是一个或多个任务的集合,通常对应于一个软件工程中的子项目。 - **Task**: 是一个独立的工作单元,例如编译源代码、运行测试等。 2. **Hello World示例** - Gradle提供了...
7. **多项目构建**:Gradle支持多项目构建,可以在一个顶层项目下管理多个子项目,方便大型工程的组织和协作。 8. **持续集成**:由于其强大的定制性和可扩展性,Gradle很适合与持续集成工具如Jenkins、Travis CI等...
Gradle的核心概念是基于任务的构建,每个任务对应一个特定的构建动作,如编译源代码、打包或执行测试。通过定义任务间的依赖关系,Gradle可以智能地决定何时执行哪些任务,从而提高构建效率。此外,Gradle使用Groovy...
`Anddoid-gradle封装通用的版本以及Module打包上传脚本`就是为了解决这类问题而设计的。 首先,让我们深入理解一下`Android Gradle library打包`的概念。在Android中,库(library)是开发者复用代码和资源的一种...
Gradle 2.6是该工具的一个重要里程碑,它引入了许多新特性,优化了性能,并修复了一系列问题,旨在提升开发效率。 首先,让我们了解Gradle 2.6的核心改进。这一版本加强了依赖管理,允许开发者更精确地控制依赖关系...
在Android开发中,Gradle与Android Studio紧密结合,负责编译、打包和部署应用。 1. **性能提升** - Android Gradle 3.3 强调了构建速度的提升。通过改进内部算法和资源处理,它可以更快地解析依赖项和执行构建...
Gradle能够智能地解析和下载项目所需的依赖,并处理版本冲突问题。它还提供了缓存机制,避免了不必要的网络请求,提高了构建速度。 在Gradle中,构建逻辑是围绕着“任务”进行的。任务是执行特定动作的最小单元,...
- **多项目构建**:在一个根项目下管理多个子项目,方便大型工程的构建和管理。 通过合理利用Gradle的特性,开发者可以实现高度定制化的构建流程,提高开发效率。对于初学者,理解Gradle的基础概念和核心功能,以及...
《Gradle 4.6 全面解析:构建现代软件工程的高效工具》 Gradle 4.6 是 Gradle 开源构建系统的一个重要版本,它以其强大的灵活性、可扩展性和自动化能力,深受广大开发者喜爱。这个版本在性能优化、易用性提升以及对...
7. **多项目支持**:Gradle 2.2.1 支持大型工程中的多项目构建,允许在一个顶层项目中管理多个子项目,便于大型项目组织和维护。 在实际使用中,通过解压`gradle-2.2.1`压缩包,你可以将Gradle添加到你的项目中,...
- **并行构建**:Gradle 4.5可能提升了并行构建的效率,使得多项目的构建更快。 - **缓存机制**:Gradle有智能的缓存机制,能够重用已完成的任务结果,减少不必要的工作,提高构建速度。 - **Gradle Wrapper**:...