Cordova构建失败:AndroidManifest.xml中camera uses-feature元素重复
解决Cordova构建时AndroidManifest.xml重复camera uses-feature的问题
我来帮你搞定这个烦人的重复标签问题!手动删除后又自动生成,是因为phonegap-plugin-barcodescanner插件或者Cordova的构建流程在每次编译时都会自动插入这个标签,咱们得从根源上阻止它重复添加。下面是几个靠谱的解决方案:
方法1:通过config.xml强制移除重复条目
你可以在项目根目录的config.xml里添加edit-config指令,让Cordova在构建时自动清理重复的uses-feature标签:
<platform name="android"> <!-- 移除重复的不带required属性的camera uses-feature --> <edit-config file="AndroidManifest.xml" target="/manifest/uses-feature[@android:name='android.hardware.camera']" mode="delete" /> <!-- 保留带required=true的那一条(如果需要的话) --> <uses-feature android:name="android.hardware.camera" android:required="true" /> </platform>
添加完之后,重新执行构建命令cordova build android,这样Cordova会在构建过程中自动删除重复的条目,只保留你指定的那一条。
方法2:修改插件的plugin.xml文件
如果方法1没生效,可能是插件本身的配置问题。你可以直接修改插件的配置文件,让它只添加一次uses-feature:
- 找到项目里的插件目录:
plugins/phonegap-plugin-barcodescanner - 打开里面的
plugin.xml文件 - 搜索
<uses-feature android:name="android.hardware.camera" />这一行,把它删掉(因为插件已经添加了带required="true"的那一条) - 保存文件后,执行
cordova clean android清理旧构建文件,再重新构建
这样插件在安装或构建时就只会添加一次camera的权限声明了。
方法3:用构建钩子脚本自动清理
如果上面两种方法都不行,咱们可以写一个简单的Node.js钩子脚本,在构建前自动处理AndroidManifest.xml:
- 在项目根目录创建
hooks/before_build/remove_duplicate_camera_feature.js文件 - 写入以下代码:
const fs = require('fs'); const path = require('path'); module.exports = function(context) { const manifestPath = path.join(context.opts.projectRoot, 'platforms/android/app/src/main/AndroidManifest.xml'); let content = fs.readFileSync(manifestPath, 'utf8'); // 移除重复的不带required属性的camera uses-feature content = content.replace(/<uses-feature android:name="android.hardware.camera" \/>/g, ''); fs.writeFileSync(manifestPath, content, 'utf8'); };
- 给脚本添加执行权限(Linux/macOS下):
chmod +x hooks/before_build/remove_duplicate_camera_feature.js - 重新执行构建,脚本会在每次构建前自动清理重复的标签
注意事项
- 执行任何修改前,最好先备份你的
config.xml和插件文件,避免意外问题 - 如果修改插件后,后续更新插件可能会覆盖你的修改,所以方法1或方法3更适合长期解决
内容的提问来源于stack exchange,提问作者Dario Corbelli
相关产品推荐
相关产品推荐

