studio构建错误Element uses-permission#android.permission.ACCESS_NETWORK_STATE at AndroidManifest.xml:38:...

本文介绍了在构建Android项目过程中遇到的权限重复声明问题及解决方法。通过检查AndroidManifest.xml文件,找出并删除重复的权限声明,从而解决了构建错误。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

今天在项目构建的时候遇到了如下报错:

Element uses-permission#android.permission.ACCESS_NETWORK_STATE at AndroidManifest.xml:38:5-79 dupli

没找到好的解决方案,仔细一看是清单文件的权限问题,于是检查,后发现权限声明重复,删除重复的留下一个即可

转载于:https://www.cnblogs.com/lizhanqi/p/6277639.html

<think>我们正在解决Android打包时的manifest合并错误,特别是与quickstep相关的重复权限声明和versionName属性冲突问题。 根据用户上一次的问题,我们知道quickstep是Android系统编译中的一个参数,用于启用手势导航等特性。但在应用打包过程中,可能会因为引入的库(如quickstep)与主项目的manifest存在冲突。 常见错误类型: 1. 重复的<uses-permission>声明:多个模块声明了相同的权限。 2. versionName冲突:主模块和库模块在AndroidManifest.xml中定义了不同的versionName。 解决方案: 一、处理重复权限声明(以QUICKSTEP权限为例) 错误示例: > Manifest merger failed : Attribute application@label value=(@string/app_name) from AndroidManifest.xml:xx > is also present at [com.android.launcher:quickstep] AndroidManifest.xml:yy > Suggestion: add 'tools:replace="android:label"' to <application> element 或者 > Multiple entries with same key: android.permission.xxx 解决方法: 1. 使用tools:node="remove"移除重复权限 在项目的AndroidManifest.xml中,对重复声明的权限使用tools:node="remove"进行移除。 例如,如果quickstep库声明了某个权限(如android.permission.BATTERY_STATS)而你的应用也声明了,导致重复,可以这样处理: ```xml <manifest ... xmlns:tools="http://schemas.android.com/tools"> <!-- 移除库中引入的重复权限 --> <uses-permission android:name="android.permission.BATTERY_STATS" tools:node="remove"/> ... </manifest> ``` 2. 使用tools:replace替换冲突属性 如果冲突发生在<application>标签的属性(如label、icon等),可以在<application>标签中使用tools:replace替换。 ```xml <application ... tools:replace="android:label, android:icon"/> ``` 二、处理versionName冲突 错误示例: > All com.android.launcher3 libraries must use the exact same version specification (mixing versions can lead to runtime crashes) 解决方法: 1. 在项目的build.gradle中统一版本 确保所有引入的com.android.launcher3库(如quickstep)使用相同的版本号。 ```gradle dependencies { implementation 'com.android.launcher3:quickstep:7.1.2' // 其他依赖也使用相同的版本 } ``` 2. 如果主模块和库模块都声明了versionName,可以在主模块的build.gradle中覆盖版本信息: ```gradle android { defaultConfig { versionName "1.0.0" // 统一版本名 versionCode 1 } } ``` 3.AndroidManifest.xml中使用tools:overrideLibrary临时覆盖库的minSdkVersion等(但versionName通常不在此列,所以主要靠gradle解决) 三、针对quickstep库的特殊处理 由于quickstep是系统库,有时可能需要排除传递依赖或强制使用同一版本: ```gradle configurations.all { resolutionStrategy { force 'com.android.launcher3:launcher:7.1.2' force 'com.android.launcher3:quickstep:7.1.2' } } ``` 四、使用manifest merger的日志诊断 在模块的build.gradle中增加以下配置,查看详细合并日志: ```gradle android { applicationVariants.all { variant -> variant.outputs.all { // 输出合并报告 def outputFile = outputFile if (outputFile != null && outputFile.name.endsWith('.apk')) { // 在构建时生成manifest合并报告 task("process${variant.name.capitalize()}Manifest").doLast { def manifestOutputFile = file("${buildDir}/intermediates/merged_manifests/${variant.name}/AndroidManifest.xml") println "Merged manifest written to: ${manifestOutputFile}" // 更详细的日志在build/outputs/logs/manifest-merger-{variant}-report.txt } } } } } ``` 构建后,在build/outputs/logs/目录下查看详细的合并报告。 五、清理和重建 有时简单的清理重建可以解决临时问题: - Clean Project: Build -> Clean Project - Rebuild Project: Build -> Rebuild Project 总结步骤: 1. 检查错误日志,确定冲突的具体权限或属性。 2.AndroidManifest.xml中使用tools:node="remove"移除重复权限,或使用tools:replace替换冲突属性。 3. 在build.gradle中统一依赖版本,特别是quickstep相关库。 4. 使用resolutionStrategy强制依赖版本。 5. 查看详细合并日志进行诊断。 6. 清理并重建项目。 注意:在操作前备份项目,避免误操作。 相关问题: 1. Android Manifest合并规则有哪些? 2. 如何解决多个库之间的资源冲突? 3. Gradle依赖管理中的force和exclude有什么作用? 4. 如何查看Android Manifest合并的详细报告?</think>### 解决 Android Manifest 合并错误:QuickStep 重复权限与 versionName 冲突 #### 问题分析 当 Android 项目引入 QuickStep 库(手势导航相关)时,可能因以下原因导致 Manifest 合并错误: 1. **重复权限声明** QuickStep 库的 Manifest 已声明某些权限(如 `BATTERY_STATS`),与主项目重复声明 2. **versionName 冲突** 主项目的 `versionName` 与 QuickStep 库的版本属性冲突 --- #### 解决方案 ##### 1. 处理重复权限声明(以 `BATTERY_STATS` 为例) 在 **主项目的 AndroidManifest.xml** 中添加合并工具指令: ```xml <manifest xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools"> <!-- 关键:引入 tools 命名空间 --> <!-- 移除库中声明的重复权限 --> <uses-permission android:name="android.permission.BATTERY_STATS" tools:node="remove" /> <!-- 从最终 Manifest 中删除此权限声明 --> <!-- 其他配置 --> </manifest> ``` **原理**:`tools:node="remove"` 指示 Gradle 在合并时移除该权限声明[^2]。 ##### 2. 解决 versionName 冲突 在 **app/build.gradle** 中统一版本控制: ```gradle android { defaultConfig { // 强制覆盖所有库的 versionName manifestPlaceholders = [versionNameOverride: "1.0.0"] } } ``` 在 **AndroidManifest.xml** 中引用该变量: ```xml <manifest ...> <application ...> <!-- 使用占位符统一版本 --> <meta-data android:name="android.app.version" android:value="${versionNameOverride}" tools:replace="android:value"/> <!-- 替换库中的值 --> </application> </manifest> ``` ##### 3. 查看合并日志定位问题 1. 在 **gradle.properties** 中启用详细日志: ```properties android.verbose=true ``` 2. 构建后检查日志文件: ``` /app/build/outputs/logs/manifest-merger-debug-report.txt ``` 其中会明确标注冲突来源: ```log CONFLICT: Duplicate attribute android:versionName - Found in: /app/src/main/AndroidManifest.xml - Also found in: /.gradle/caches/.../quickstep-7.1.2/AndroidManifest.xml ``` --- #### 高级处理技巧 **场景**:需要保留库中的权限但避免冲突 ```xml <uses-permission android:name="android.permission.BATTERY_STATS" tools:remove="android:maxSdkVersion" /> <!-- 仅移除冲突属性 --> ``` **强制使用主项目 Manifest 属性**: ```xml <application tools:replace="android:label,android:icon,android:versionName"> ... </application> ``` --- #### 预防措施 1. **统一依赖版本**:确保所有 QuickStep 相关库版本一致 ```gradle dependencies { implementation 'com.android.launcher3:quickstep:7.1.2' implementation 'com.android.launcher3:launcher:7.1.2' // 必须相同版本 } ``` 2. **检查库的 Manifest**:解压 AAR 文件查看 `AndroidManifest.xml`: ```bash unzip quickstep-7.1.2.aar -d quickstep-manifest ``` --- #### 核心概念回顾 | 操作 | 指令 | 作用 | |-----------------------|--------------------------|----------------------------------| | 删除整个权限节点 | `tools:node="remove"` | 完全移除声明 | | 替换特定属性 | `tools:replace="attr"` | 覆盖库中的属性值 | | 移除特定属性 | `tools:remove="attr"` | 删除冲突属性保留其他 | | 版本占位符 | `manifestPlaceholders` | 动态统一版本信息 | > ⚠️ 注意:所有 `tools` 指令仅在合并时生效,不会影响编译后的 APK[^2]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值