有关项目依赖包发生 Manifest Merge 冲突的详细解决方案
安卓开发使用 Gradle 插件管理依赖包确实非常方便,尤其是在解决一些依赖冲突的问题上。比如,重复依赖的问题,具体内容请我之前写的一篇文章:
开发中,你可能还会遇到一种情况,就是项目所引用的 AAR 、Library 等第三方库所包含的 Manifest 清单文件与主 Module (默认名为 app )中定义的 Manifest 内容合并时发生冲突。 举个例子。比如在项目中引用的某个 Library 的 AndroidManifest 文件中,application 标签中内容如下:
<application android:theme="@android:style/Theme.Black"/> 其中的
<application android:allowBackup="false" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:theme="@style/AppTheme">
并且二者所使用的值不同。这样,在编译的时候就会发生合并冲突,错误信息如下: Error:Execution failed for task ':app:processDebugManifest'. > Manifest merger failed with multiple errors,see logs
通过点击 Messages 菜单左侧【Show Console Output】选项可以打开 Gradle Console 控制台查看错误日志和对应的解决方案: 如上图所示,Library 与 主 Module 在合并 Manifest 时发生错误。其中还包含看到具体错误信息,注明了是android:theme属性发生冲突。并且给出了建议的解决方案,使用tools:replace方式解决冲突。 我们就按照错误提示在主 Module 的 Manifest 文件中添加这行设置试试看:(注意需要声明 tools 命名空间)
而此时 app module 中的 Manifest 内容的 "android:allowBackup,android:theme">
Error:Execution failed for task ':app:processDebugManifest'. > Multiple entries with same key: android:theme=REPLACE and android:theme=REPLACE
如我们所想,合并时发生冲突。然而,痛苦的是这种情况下,编译器也无解,无法给出相应解决方案!
当然,这种情况很极端,但也不是没有出现的可能。第三方库和我们的 App Module 都想使用自己的属性,也在情理之中。那么怎么办呢,如果是本地 Library 依赖方式的话,还可以手动修改 Library 的 Manifest 内容。但是如果是远程依赖的 AAR的话,我们是改不了的啊。
这个时候,我们就得想办法在合并的时候自动删除 Library 的 Manifest 内容。伟大的 GitHub网站有一个插件,能够帮助我们实现这个功能。先上地址:
这个插件可以帮助我们做到这些:
这里我们还用上面的例子,介绍一下 Seal 插件的使用方式。 首先在项目根目录下的 build.gradle 文件中设置 Seal 插件的地址: buildscript { repositories { jcenter() } dependencies { classpath 'com.android.tools.build:gradle:2.3.0' classpath 'me.xx2bab.gradle:seal-manifest-precheck-plugin:1.0.0' } }
然后在 app module 的 build.gradle 文件中引用这个插件: apply plugin: 'com.android.application' apply plugin: 'seal'
注意,在 manifestPath 配置下添加自己项目引入并发生冲突的 Library 名字,例子中使用的是 samplelibrary。同时在 还有一点需要注意的是,如果 Gradle 插件开启了 build-cache 功能(Gradle 插件 2.3 版本开始默认开启),还需要在项目根目录下的 gradle.properties 文件中添加如下内容: android.buildCacheDir=./build-cache
这些工作都做完之后,我们再次 Build 工程,就能成功编译通过啦。 当然,真实项目中 Manifest 合并时能遇到 tools 规则冲突的情况并不多见,而更多的是,普通属性的使用冲突。不过,还是值得注意一下,以备不时之需。
转自:http://blog.csdn.net/growing_tree/article/details/74938536
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- dart – 在Flutter中导航后无法在新页面中关注TextField
- ruby-on-rails – 在Rails应用程序中运行异步作业的最佳方式
- c – OpenSSL解密失败或错误记录mac boost :: asio
- c# – 如何:将StreamReader内容保存在字符串中
- 使用Selenium WebDriver C#从下拉列表中选择一个值
- C#根据http和ftp图片地址获取对应图片
- reactjs – 什么时候使用Flux(等)与React?
- ruby-on-rails – Rails factory_girl create_list构建相同
- 什么是BIM数据库?使用BIM数据库的四大优势
- vue渲染时闪烁{{}}的问题及解决方法