Android AAR的tools:replace冲突解决方案(转载)

大家好,今天推送的这篇文章是来自淘宝童鞋的投稿,也是本公号的第一篇投稿的文章。文章记录了他在对SDK升级时,引入AAR时遇到tools:replace冲突,在Android官网、StackOverflow寻找方案无果的情况下,自己动手落地实现了一套解决方案。好了,话不多说,直接进入正文。

0

问题

最近做一些 SDK 升级时,有些包引入后会有诸如此类的报错:

AndroidManifest.xml:22:9-40 Error:

Attribute [email protected] value=(@style/AppTheme) from AndroidManifest.xml:22:9-40

is also present at [some:libraries:version] AndroidManifest.xml:9:18-62 value=(@style/AnotherTheme).

Suggestion: add ‘tools:replace=”android:theme”‘ to element at AndroidManifest.xml:18:5-65:19 to override.

这是一个很常见的错误了,照着提示做replace就OK了。但是当我加上replace 的代码后,发现依旧报错:

Multiple entries with same key: @android:theme=REPLACE and android:theme=REPLACE.

百思不得其解,查看了一下依赖库的AndroidManifest.xml源码,发现它也设置了tools:replace="android:theme",而Manifest Merger把这个视为冲突抛了出来。

1

思考

如果只是跟着官方的Manifest Merge,这个问题恐怕无解。StackOverflow上也有人问过这个问题,但是没有更多的解法回复。

为什么依赖库会想不开去设置
replace
属性呢?很大的一个可能是:他也碰到了他的依赖库和他的Manifest有冲突的情况。那么我们能做什么?我们始终还是想要把他的某些属性给替换掉的(theme/allowBackup/…),不管他是出于什么样的目的,都不能阻止我想打出包的心!

2

解法

通过简单的观察和源码查看,我们发现merge是发生在process${variant}Manifest这个 Task。那么就得想办法在执行这个任务之前Precheck一下所有依赖的AndroidManifest.xml。

插件地址:https://github.com/2BAB/Seal

我写了一个简易的插件来做这件事,目前支持两个功能:

  • 删除Application节点的某些属性,如debuggable、theme、allowBackup;
  • 删除Application节点中 tools:replace属性的某些值,如android:icon、android:theme、android:allowBackup;

这个插件不仅能解决上述提到的问题,还能顺带修复诸如下面这种 Warning:

Warning:
AndroidManifest.xml already defines debuggable (in
http://schemas.android.com/apk/res/android); using existing value in
manifest.

而我们所需要做的,仅仅是指定我们不需要libraries的那些属性:

需要注意的是,如果开启了build-cache, Seal建议你把build-cache的文件夹放在工程目录内(就是上面配置里的build-cache位置)。

更多关于Seal的信息,请参考Github仓库内的说明,大家可以给他提PR和ISSUE。

时间: 2024-10-10 16:50:01

Android AAR的tools:replace冲突解决方案(转载)的相关文章

Atitit 类库冲突解决方案  httpclient-4.5.2.jar

Atitit 类库冲突解决方案  httpclient-4.5.2.jar 错误提示如下1 版本如下(client and selenium)2 解决流程2 挂载源码 (SSLConnectionSocketFactory.java:1442 原因:SSLConnectionSocketFactory调取AllowAllHostnameVerifier 的时候,调取了另外一个jar里面的allowAhnVer这个class3 解决: 把4.5jar放在前面运行,让它先加载..或者使用代码预先加载

Android Call requires API level 11 解决方案

[原因分析] 不详,可能和Run Android Lint有点关系吧.就是创建项目时,我们设置了最低版本API Level,比如我的是8,因此,Eclipse检查我调用的API后,发现版本号不能向低版本兼容,比如我用的"Notification.Builder"是Level 11 以上才有的,自然超过了8,所以提示错误. [解决方案] 右键点击项目->Android tools ->Clear Link Markers.即可临时解决,但是如果调试用的模拟器是低版本的,则在调

Git冲突解决方案

Git冲突解决方案 1.  在代码提交时,先更新,若有冲突.先解决冲突.若提交之后在review时才发现无法合并代码时有冲突,需要abandon此次提交的代码. 2.  解决冲突的基本做法,保存本地代码到本地仓库 ——>  将本地代码还原至服务器上一次合并成功的代码   ——> 将本地仓库的代码加载到本地  ——>  此时,有冲突的代码会加上 ==============>>>>>>>>>>>>>>>

Eclipse/Android Studio下载SDK过慢解决方案!

启动 Android SDK Manager ,打开主界面,依次选择『Tools』.『Options...』,弹出『Android SDK Manager - Settings』窗口: 在『Android SDK Manager - Settings』窗口中,在『HTTP Proxy Server」和「HTTP Proxy Port』输入框内填入下面镜像服务器地址(不包含http://,如下图)和端口,并且选中『Force https://... sources to be fetched us

下载android sdk更新包离线安装解决方案

本文转载自:http://xljboox.blog.163.com/blog/static/7628448320111159354738/ 第一次安装android sdk后进行开发包的更新,你应该了解到需要的时间会很长,那么是否有办法提升安 装的进度呢?办法自然是有的,这里提供一个取巧的方法,不会太麻烦,又能加快android开发环境的部 署过程.具体请参考如下.1.通过访问和分析android更新列表的xml在线地址 *************************************

Android Gradle 构建工具(Android Gradle Build Tools)是什么?

转载地址:http://mrfu.me/android/2015/07/17/New_Android_Gradle_Build_Tools/ 译者地址:[翻]一览新的 Android Gradle 构建工具:新的 DSL 结构 和 Gradle 2.5 原文:First Look at New Android Gradle Build Tools: The new DSL structure and Gradle 2.5 双语对照地址: [翻-双语]一览新的 Android Gradle 构建工

Android官方ORM数据库Room技术解决方案简介(一)

是时候该忘记Android SQLite了!Android官方ORM数据库Room技术解决方案简介(一) Android的Romm是Android官方整合出来的一揽子ORM数据库解决方案.Android Room和历史上的ORM数据库如Android ORMLite(见附录文章1,2),Android greenDao等等,有诸多相同的设计思想和理念,但Android Room同时吸收众家ORM数据库之长,有自己新的创新和改进.我将分开写若干篇文章,逐点介绍Android官方的ORM数据库技术解

PC端的软件端口和adb 5037端口冲突解决方案

引用https://www.aliyun.com/jiaocheng/32552.html 阿里云 >  教程中心   >  android教程 >  PC端的软件端口和adb 5037端口冲突解决方案 PC端的软件端口和adb 5037端口冲突解决方案 发布时间:2018-01-18 来源:网络 上传者:用户 关键字: 端口 冲突 解决方案 端的 软件 5037 adb 发表文章 摘要:使用adb进行移动终端的调试时,若看到以下的提示:$adbdevicesListofdevicesa

JQuery之JQuery的版本 JQuery入门 属性获取 JQuery就绪函数 JS文档就绪函数和JQuery文档就绪函数的区别 JS对象和JQuery对象的区别 关于$的使用 多个JS库的冲突解决方案

JQuery的版本 JQuery入门 属性获取 JQuery就绪函数 JS文档就绪函数和JQuery文档就绪函数的区别 JS对象和JQuery对象的区别 关于$的使用 多个JS库的冲突解决方案 JQuery的版本 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>jQuery的版本</title> <