Android Manifest合并 tools:replace替换usesCleartextTraffic无效
Android Manifest清单合并失败:tools:replace配置不生效解决
问题表现
- 合并报错信息:
Attribute application@usesCleartextTraffic value=(true) from AndroidManifest.xml:27:9-45 is also present at AndroidManifest.xml:27:9-45 value=(false),官方提示在<application>节点添加tools:replace="android:usesCleartextTraffic"覆盖冲突配置,但添加后仍报相同错误。 - 已添加的application标签配置:
android:name=".MainApplication" android:largeHeap="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:requestLegacyExternalStorage="true" android:roundIcon="@mipmap/ic_launcher_round" android:theme="@style/AppTheme" android:usesCleartextTraffic="false" tools:replace="android:usesCleartextTraffic" tools:targetApi="28"
解决步骤
1. 补全manifest根节点的tools命名空间声明
tools:前缀的属性必须先在根节点声明命名空间才能生效,这是该类问题最常见的诱因。检查Manifest最外层<manifest>标签,确保存在以下命名空间配置,缺失则直接补上:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" <!-- 保留原有其他属性、命名空间 --> >
2. 定位真实冲突来源
不要只依赖报错提示的行号,直接执行Gradle任务打印完整合并日志,定位冲突来自哪个子模块、第三方依赖:
- Windows环境执行命令:
gradlew app:processDebugManifest --stacktrace - Mac/Linux环境执行命令:
./gradlew app:processDebugManifest --stacktrace
如果定位到冲突来自第三方依赖,除了主模块的replace规则,也可以在依赖引入时做Manifest属性排除;如果冲突来自本地子模块,直接修改子模块Manifest中的对应属性,和主模块配置保持一致即可。
3. 检查构建变体的Manifest覆盖规则
如果项目配置了多渠道、多构建类型(debug/release等),检查对应变体源码目录下的AndroidManifest文件,这类目录下的Manifest优先级高于主Manifest,若其中单独配置了usesCleartextTraffic属性,会直接覆盖主Manifest的配置,导致replace规则失效,找到后修改对应属性保持统一即可。
4. 清理构建缓存后重新构建
以上配置确认无误后,按顺序执行操作清缓存:
- 点击Android Studio菜单栏
File -> Invalidate Caches...,勾选清除缓存选项后重启IDE - 执行构建清理命令:Windows用
gradlew clean,Mac/Linux用./gradlew clean - 重新触发项目构建
内容的提问来源于stack exchange,提问作者K Khan
相关产品推荐
相关产品推荐

