实体中的属性与各网银插件之前的冲突有冲突该怎么处理

Android studio Module依赖 出现Manifest Merge 冲突的详细解决方案 - 简书
Android studio Module依赖 出现Manifest Merge 冲突的详细解决方案
安卓开发使用 Gradle 插件管理依赖包确实非常方便,开发中,你可能还会遇到一种情况,就是项目所引用的 AAR 、Library 等第三方库所包含的 Manifest 清单文件与主 Module (默认名为 app )中定义的 Manifest 内容合并时发生冲突。
比如在项目中引用的某个 Library 或者Module的 AndroidManifest 文件中,application 标签中内容如下:
&application
android:theme="@android:style/Theme.Black"/&
其中的 android:theme 属性在我们的 app module 主工程的 AndroidManifest 文件中也被定义:
&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 控制台查看错误日志和对应的解决方案:
Paste_Image.png
Paste_Image.png
如上图所示,Library 与 主 Module 在合并 Manifest 时发生错误。其中还包含看到具体错误信息,注明了是 android:theme 属性发生冲突。并且给出了建议的解决方案,使用 tools:replace 方式解决冲突。
我们就按照错误提示在主 Module 的 Manifest 文件中添加这行设置试试看:(注意需要声明 tools 命名空间)
&manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.xxx.xxx"&
并且在 app module 中的 Manifest 内容的 tools:replace 属性也做了一些修改
&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"
tools:replace="android:theme"&
如此这样,再次 Build 时便能编译通过。其实原理就是,借助 tools 域名空间设置 Manifest 的合并优先级问题。这里 tools:place 表明合并时移除低优先级 Library 中的相关属性,使用高优先级 app module 中定义的对应属性内容。
有关 Manifest 合并相关的知识,在开发者官网上介绍得非常清楚,大家可以访问如下链接:
像上面这种情况,如果我们脑洞再开大一点,假设这个 Library 也使用了 tools:replace 属性会发生什么情况呢。我们不妨试验一下。修改 Library 的 Manifest 内容:
&application
android:theme="@android:style/Theme.Black"
tools:replace="android:theme"/&
而此时 app module 中的 Manifest 内容的 tools:replace 属性也做了一些修改:
&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"
tools:replace="android:allowBackup, android:theme"&
这里,我故意设置二者的 tools:replace 属性为不同值。Build 一下,看看结果:
Error:Execution failed for task ':app:processDebugManifest'.
& Multiple entries with same key: android:theme=REPLACE and android:theme=REPLACE
如我们所想,合并时发生冲突。然而,痛苦的是这种情况下,编译器也无解,无法给出相应解决方案!
Paste_Image.png
Paste_Image.png
当然,这种情况很极端,但也不是没有出现的可能。第三方库和我们的 App Module 都想使用自己的属性,也在情理之中。那么怎么办呢,如果是本地 Library 依赖方式的话,还可以手动修改 Library 的 Manifest 内容。但是如果是远程依赖的 AAR的话,我们是改不了的啊。
这个时候,我们就得想办法在合并的时候自动删除 Library 的 Manifest 内容。但是很幸运 GitHub网站有一个插件,能够帮助我们实现这个功能。先上地址:
这个插件可以帮助我们做到这些:
1、删除 Application 节点中的指定属性;
2、删除 Application 节点中 tools:replace 属性的指定值。
这里我们还用上面的例子,介绍一下 Seal 插件的使用方式。
首先在项目根目录下的 build.gradle 文件中设置 Seal 插件的地址:
buildscript {
repositories {
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'
接着还是修改这个 build.gradle 文件,配置合并时的删除规则:
def projectRoot = project.getRootProject().rootDir.absolutePath
// Folders may include AndroidManifest.xml files
// 1. For gradle plugin 2.3.0 or higher, build-cache is default choice,
// 2. But we should make sure snapshot-libs will be checked too.
// 3. Free to add your folders for more customization
def manifestPath = [
// for AAR of Release
// see note below
projectRoot + '/build-cache',
projectRoot + '/samplelibrary',
// for AAR of SNAPSHOT
projectRoot + '/app/build/intermediates/exploded-aar'
def removeAttrs = [
'android:theme'
def replaceValues = [
'android:theme'
enabled = true
manifests = manifestPath
appAttrs {
enabled = true
attrsShouldRemove = removeAttrs
appReplaceValues {
enabled = true
valuesShouldRemove = replaceValues
注意,在 manifestPath 配置下添加自己项目引入并发生冲突的 Library 名字,例子中使用的是 samplelibrary。同时在
removeAttrs 和 replaceValues 配置下添加对应冲突的属性名字,例子中冲突的是 android:theme 属性。
还有一点需要注意的是,如果 Gradle 插件开启了 build-cache 功能(Gradle 插件 2.3 版本开始默认开启),还需要在项目根目录下的 gradle.properties 文件中添加如下内容:
android.buildCacheDir=./build-cache
我们再次 Build 工程,就能成功编译通过啦。
当然,真实项目中 Manifest 合并时能遇到 tools 规则冲突的情况并不多见,而更多的是,普通属性的使用冲突。不过,还是值得注意一下,以备不时之需。
就是这么简单,着急的朋友,源码,完整demo直接带走,用起来,有时间的朋友,可以阅读一下,提升自己,别忘了点个赞,关注一下。
安卓开发使用 Gradle 插件管理依赖包确实非常方便,尤其是在解决一些依赖冲突的问题上。比如,重复依赖的问题,具体内容请我之前写的一篇文章: 有关 Android Studio 重复引入包的问题和解决方案 开发中,你可能还会遇到一种情况,就是项目所引用的 AAR 、Lib...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金相信有很多朋友...
用两张图告诉你,为什么你的 App 会卡顿? - Android - 掘金 Cover 有什么料? 从这篇文章中你能获得这些料: 知道setContentView()之后发生了什么? ... Android 获取 View 宽高的常用正确方式,避免为零 - 掘金 相信有很多...
Spring Boot 参考指南 介绍 转载自:https://www.gitbook.com/book/qbgbook/spring-boot-reference-guide-zh/details带目录浏览地址:http://www.maoyupeng.com/sprin...
Gradle是什么? Android Studio 基于 Gradle 构建系统,并通过 Android Gradle 插件提供更多面向 Android 的功能 Gradle 和 Android 插件独立于 Android Studio 运行。这意味着,您可以在 Andro...
天气变幻总是很反常,忽冷忽热,让人无所适从。也就有了街上行人乱穿衣的各类镜头,有怕冷的还穿着棉袄和羽绒服,爱美的小姑娘穿起了薄纱裙子,外面只套件长毛衣,感觉真是乱得可以。 其实看看这样一个场景,还是觉得很有意思的,大家都有想穿什么就穿什么的权利,也有暗笑别人穿多穿少的权利,...
狂飙42天,朋友圈现象级产品分答是怎样做出的?
灵王被斩杀所带来的热潮,一直的在狩猎场中持续着,有人惊叹,有人羡慕,也有人怀疑,不过不管怎么样,谁都知道,那叫做牧尘以及洛璃的两位新生,或许将会成为此次狩猎战中极其耀眼的黑马。 在这黑马层出不穷的狩猎战中,他们显然是走到了最前端的位置,即便是之前风头极盛的赵青衫,在此时都是...
你可以不经过大脑思考就说话么? 我能! 当我无话可说,但是又不得不说时。嘴就开始语无伦次得胡说开来。 今天老师让我解读一首诗歌 我想我可以钻到地洞里去了。 归根结底。是没有方法论。 没有工具,怎么干活? 1、解读诗歌的工具。 2、现代史不熟。 3、说话太少.废话太多。 4、...
是不是他们的手臂都能伸长JQuery插件中设置属性的变量
[问题点数:40分,结帖人wsy87217]
本版专家分:140
结帖率 98.7%
CSDN今日推荐
本版专家分:9395
2011年10月 Web 开发大版内专家分月排行榜第一
2011年11月 Web 开发大版内专家分月排行榜第三
本版专家分:140
结帖率 98.7%
本版专家分:9395
2011年10月 Web 开发大版内专家分月排行榜第一
2011年11月 Web 开发大版内专家分月排行榜第三
本版专家分:0
本版专家分:140
结帖率 98.7%
本版专家分:9395
2011年10月 Web 开发大版内专家分月排行榜第一
2011年11月 Web 开发大版内专家分月排行榜第三
本版专家分:6710
本版专家分:140
结帖率 98.7%
本版专家分:9395
2011年10月 Web 开发大版内专家分月排行榜第一
2011年11月 Web 开发大版内专家分月排行榜第三
本版专家分:140
结帖率 98.7%
匿名用户不能发表回复!|
CSDN今日推荐解决jquery版本冲突的有效方法
转载 &更新时间:日 15:22:27 & 投稿:shichen2014
这篇文章主要介绍了解决jquery版本冲突的有效方法,对于web设计的兼容性调试很有借鉴价值,需要的朋友可以参考下
用过jQuery的朋友都知道jQuery不同版本会引发冲突,本文就此问题提出有效的解决方案如下:
案例:解决jQuery1.3.2和1.4.2的冲突。(本例已测试通过!)
第一步:在1.4.2的源代码的最后加上一句 :
var $j4 = jQuery.noConflict(true);
之所以在源码这里加,而不是像大多数文章提的在要用到的时候加,这是因为很多基于1.4.2的插件都要加,在这里加可以避免过多插件加这句代码导致重复。这一句是将1.4.2的jQuery和$的引用权限全部放弃。也就是基于1.4.2的插件不能再用jQuery和$了。同时给予$j4的新的命名空间,注意它是window的属性。看1.4.2的源代码会发现它其实也就执行了这两句:
window.$=_$;
window.jQuery=_jQ
道理同window.$=_temp$(返还命名空间)只是命名不同而已。
第二步:在基于1.4.2的框架的所有插件的头部加上以下代码:
var _temp$ = window.$,_tempjQuery = window.jQ
将jQuery1.3.2的$和jQuery放到临时的变量空间上:
window.$ = $j4;
这句和下面的那句都是为了给中间的代码能够正确使用jQuery和$用的。后面的$j4是赋予他们正确的引用。
window.jQuery = $j4;
之所以要先放临时变量存储,有三点必须这样做的理由:
①.我们不希望改动大量的jQuery插件源代码,最好是不动,即使改的话,尽量改的少。而在头部尾部加改动代码,中间的原始代码不动也是不错的一种方式。
②.因为1.4.2的已经放弃了jQuery和$的控制权,但是已有的插件代码又用了他们来做引用,因为插件不可能预知冲突,即使有冲突他人开发的插件也一定要用$或者jQuery引用,除非它不是jQuery下的插件。
③.为了防止插件里面直接用window.$和window.jQuery进行引用从而导致引用到1.3.2的jQuery和$,虽然这种情况比较少,但是以防万一。
中间的原始代码不动,尾部加以下代码:
window.$ = _temp$;//将$的引用权限返还给jQuery1.3.
window.jQuery = _tempjQ//将jQuery的引用权限返还给jQuery1.3.
第三步:以后要用基于jQuery1.4.2的选取函数就只能用$j4(element)了。
总结:到目前为止可行方案:jQuery1.4.2完全放弃$和jQuery的控制权限。1.3.2放弃$的控制权限但不放弃jQuery的权限,其实jQuery也可放弃,只不过要给个别名$j3。prototype最好放在jQuery1.3.2后面,它获得$的控制权限。只是以后要用jQuery1.4.2就必须用$j4来引用了。但这样即使有再多的jQuery框架版本冲突问题,也全部解决掉了。假如来了个1.2的jQuery怎么办,参照(2)的执行步骤,只不过第一步改为:
var $j2 = jQuery.noConflict(true);
第三步用$j2(element)罢了。道理都是相同的。
相信本文所述对大家的jQuery程序设计有一定的借鉴价值。
您可能感兴趣的文章:
大家感兴趣的内容
12345678910
最近更新的内容
常用在线小工具您需要通过验证再能继续浏览 3秒后开始验证
丨 粤ICP备号-10 丨 新三板上市公司威锋科技(836555)
增值电信业务经营许可证:
Powered by Discuz!
(C) Joyslink Inc. All rights reserved 保留所有权利温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!&&|&&
我的天地我做主,你们就来吧。没有关系的,呵呵。
LOFTER精选
网易考拉推荐
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
阅读(2033)|
用微信&&“扫一扫”
将文章分享到朋友圈。
用易信&&“扫一扫”
将文章分享到朋友圈。
历史上的今天
loftPermalink:'',
id:'fks_080',
blogTitle:'关于eclipse中组件冲突问题',
blogAbstract:'我的Eclipse 3.3.2 + MyEclipse 6.0.1在打开JSP文件时出现以下错误: \r\nAn internal error occurred during: \"Processing Dirty Regions\". \r\norg/eclipse/wst/sse/ui/internal/reconcile/validator/ValidationHelper \r\nAn internal error occurred during: \"JSP Content Validator\". \r\n',
blogTag:'',
blogUrl:'blog/static/',
isPublished:1,
istop:false,
modifyTime:4,
publishTime:6,
permalink:'blog/static/',
commentCount:0,
mainCommentCount:0,
recommendCount:0,
bsrk:-100,
publisherId:0,
recomBlogHome:false,
currentRecomBlog:false,
attachmentsFileIds:[],
groupInfo:{},
friendstatus:'none',
followstatus:'unFollow',
pubSucc:'',
visitorProvince:'',
visitorCity:'',
visitorNewUser:false,
postAddInfo:{},
mset:'000',
remindgoodnightblog:false,
isBlackVisitor:false,
isShowYodaoAd:false,
hostIntro:'我的天地我做主,你们就来吧。没有关系的,呵呵。',
hmcon:'1',
selfRecomBlogCount:'0',
lofter_single:''
{list a as x}
{if x.moveFrom=='wap'}
{elseif x.moveFrom=='iphone'}
{elseif x.moveFrom=='android'}
{elseif x.moveFrom=='mobile'}
${a.selfIntro|escape}{if great260}${suplement}{/if}
{list a as x}
推荐过这篇日志的人:
{list a as x}
{if !!b&&b.length>0}
他们还推荐了:
{list b as y}
转载记录:
{list d as x}
{list a as x}
{list a as x}
{list a as x}
{list a as x}
{if x_index>4}{break}{/if}
${fn2(x.publishTime,'yyyy-MM-dd HH:mm:ss')}
{list a as x}
{if !!(blogDetail.preBlogPermalink)}
{if !!(blogDetail.nextBlogPermalink)}
{list a as x}
{if defined('newslist')&&newslist.length>0}
{list newslist as x}
{if x_index>7}{break}{/if}
{list a as x}
{var first_option =}
{list x.voteDetailList as voteToOption}
{if voteToOption==1}
{if first_option==false},{/if}&&“${b[voteToOption_index]}”&&
{if (x.role!="-1") },“我是${c[x.role]}”&&{/if}
&&&&&&&&${fn1(x.voteTime)}
{if x.userName==''}{/if}
网易公司版权所有&&
{list x.l as y}
{if defined('wl')}
{list wl as x}{/list}}

我要回帖

更多关于 各网银插件之前的冲突 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信