任务“:app:processDebugManifest”执行失败:AndroidManifest.xml 中的 <meta-data/> 元素重复
Posted
技术标签:
【中文标题】任务“:app:processDebugManifest”执行失败:AndroidManifest.xml 中的 <meta-data/> 元素重复【英文标题】:Execution failed for task ':app:processDebugManifest': Dupicate <meta-data/> element in AndroidManifest.xml 【发布时间】:2020-10-30 04:10:57 【问题描述】:我一直在尝试运行 ionic cordova build android
命令,但它一直失败,在堆栈跟踪中返回 Execution failed for task ':app:processDebugManifest'.
。我正在寻找在 Android 设备上运行的 .apk。
运行命令ionic cordova build android --debug
时,它通知我AndroidManifest.xml 中有一个重复元素:Error: Element meta-data#com.google.firebase.messaging.default_notification_icon at AndroidManifest.xml:27:9-132 duplicated with element declared at AndroidManifest.xml:12:9-140
。我无法对此文件进行更改,因为它会被每次构建覆盖。
像其他用户收到Execution failed for task ':app:processDebugManifest'.
错误一样,我安装了 cordova-plugin-androidx 和 cordova-plugin-androidx-adapter,但这无济于事。
我也尝试过多次运行cordova clean android
,或者ionic cordova platform rm android
,然后是ionic cordova platform add android
,以及删除插件文件夹,然后是一个新版本,但这没有奏效。
我的 Android Studio SDK Manager 安装了 Android 8.1 (Oreo) 和 Android 8.0 (Oreo)。
堆栈跟踪:
C:\Work\ODA\myhaz-app\platforms\android\app\src\main\AndroidManifest.xml:27:9-132 Error:
Element meta-data#com.google.firebase.messaging.default_notification_icon at AndroidManifest.xml:27:9-132 duplicated with element declared at AndroidManifest.xml:12:9-140
C:\Work\ODA\myhaz-app\platforms\android\app\src\main\AndroidManifest.xml Error:
Validation failed, exiting
> Task :app:processDebugManifest FAILED
See http://g.co/androidstudio/manifest-merger for more information about the manifest merger.
23 actionable tasks: 21 executed, 2 up-to-date
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:processDebugManifest'.
> Manifest merger failed with multiple errors, see logs
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 28s
C:\Work\ODA\myhaz-app\platforms\android\gradlew: Command failed with exit code 1 Error output:
C:\Work\ODA\myhaz-app\platforms\android\app\src\main\AndroidManifest.xml:27:9-132 Error:
Element meta-data#com.google.firebase.messaging.default_notification_icon at AndroidManifest.xml:27:9-132 duplicated with element declared at AndroidManifest.xml:12:9-140
C:\Work\ODA\myhaz-app\platforms\android\app\src\main\AndroidManifest.xml Error:
Validation failed, exiting
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:processDebugManifest'.
> Manifest merger failed with multiple errors, see logs
* Try:
Run with --stacktrace option to get the stack trace. Run with --info or --debug option to get more log output. Run with --scan to get full insights.
* Get more help at https://help.gradle.org
BUILD FAILED in 28s
[ERROR] An error occurred while running subprocess cordova.
cordova.cmd build android --debug exited with exit code 1.
Re-running this command with the --verbose flag may provide more information.
运行ionic info
命令后的堆栈跟踪:
Ionic:
Ionic CLI : 6.10.1 (C:\Users\danwar\AppData\Roaming\npm\node_modules\@ionic\cli)
Ionic Framework : @ionic/angular 5.2.3
@angular-devkit/build-angular : 0.803.28
@angular-devkit/schematics : 8.3.28
@angular/cli : 8.3.28
@ionic/angular-toolkit : 2.2.0
Cordova:
Cordova CLI : 9.0.0 (cordova-lib@9.0.1)
Cordova Platforms : android 8.1.0
Cordova Plugins : cordova-plugin-ionic-keyboard 2.2.0, cordova-plugin-ionic-webview 3.1.2, (and 20 other plugins)
Utility:
cordova-res : 0.9.0
native-run : 0.3.0
System:
Android SDK Tools : 26.1.1 (C:\Users\danwar\AppData\Local\Android\Sdk)
NodeJS : v10.16.3 (C:\Program Files\nodejs\node.exe)
npm : 6.9.0
OS : Windows 10
AndroidManifest.xml:
<?xml version='1.0' encoding='utf-8'?>
<manifest android:hardwareAccelerated="true" android:versionCode="100" android:versionName="0.1.0" package="app.myhaz.vct" xmlns:android="http://schemas.android.com/apk/res/android">
<supports-screens android:anyDensity="true" android:largeScreens="true" android:normalScreens="true" android:resizeable="true" android:smallScreens="true" android:xlargeScreens="true" />
<uses-permission android:name="android.permission.INTERNET" />
<application android:hardwareAccelerated="true" android:icon="@mipmap/ic_launcher" android:label="@string/app_name" android:roundIcon="@mipmap/ic_launcher_round" android:supportsRtl="true" android:usesCleartextTraffic="true">
<activity android:configChanges="orientation|keyboardHidden|keyboard|screenSize|locale|smallestScreenSize|screenLayout|uiMode" android:label="@string/activity_name" android:launchMode="singleTop" android:name="MainActivity" android:theme="@android:style/Theme.DeviceDefault.NoActionBar" android:windowSoftInputMode="adjustResize">
<intent-filter android:label="@string/launcher_name">
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/notification_icon" />
<provider android:authorities="$applicationId.provider" android:exported="false" android:grantUriPermissions="true" android:name="org.apache.cordova.camera.FileProvider">
<meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/camera_provider_paths" />
</provider>
<activity android:exported="true" android:launchMode="singleTop" android:name="com.gae.scaffolder.plugin.FCMPluginActivity">
<intent-filter>
<action android:name="FCM_PLUGIN_ACTIVITY" />
<category android:name="android.intent.category.DEFAULT" />
</intent-filter>
</activity>
<service android:name="com.gae.scaffolder.plugin.MyFirebaseMessagingService" android:stopWithTask="false">
<intent-filter>
<action android:name="com.google.firebase.MESSAGING_EVENT" />
</intent-filter>
</service>
<meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@mipmap/ic_launcher" />
</application>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:name="android.hardware.location.gps" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.BLUETOOTH" />
</manifest>
build.gradle 文件:
/*
Licensed to the Apache Software Foundation (ASF) under one
or more contributor license agreements. See the NOTICE file
distributed with this work for additional information
regarding copyright ownership. The ASF licenses this file
to you under the Apache License, Version 2.0 (the
"License"); you may not use this file except in compliance
with the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing,
software distributed under the License is distributed on an
"AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
KIND, either express or implied. See the License for the
specific language governing permissions and limitations
under the License.
*/
apply plugin: 'com.android.application'
buildscript
repositories
mavenCentral()
google()
jcenter()
dependencies
classpath 'com.android.tools.build:gradle:3.3.0'
// Allow plugins to declare Maven dependencies via build-extras.gradle.
allprojects
repositories
mavenCentral()
jcenter()
task wrapper(type: Wrapper)
gradleVersion = '4.10.3'
// Configuration properties. Set these via environment variables, build-extras.gradle, or gradle.properties.
// Refer to: http://www.gradle.org/docs/current/userguide/tutorial_this_and_that.html
ext
apply from: '../CordovaLib/cordova.gradle'
// The value for android.compileSdkVersion.
if (!project.hasProperty('cdvCompileSdkVersion'))
cdvCompileSdkVersion = null;
// The value for android.buildToolsVersion.
if (!project.hasProperty('cdvBuildToolsVersion'))
cdvBuildToolsVersion = null;
// Sets the versionCode to the given value.
if (!project.hasProperty('cdvVersionCode'))
cdvVersionCode = null
// Sets the minSdkVersion to the given value.
if (!project.hasProperty('cdvMinSdkVersion'))
cdvMinSdkVersion = null
// Sets the maxSdkVersion to the given value.
if (!project.hasProperty('cdvMaxSdkVersion'))
cdvMaxSdkVersion = null
// The value for android.targetSdkVersion.
if (!project.hasProperty('cdvTargetSdkVersion'))
cdvTargetSdkVersion = null;
// Whether to build architecture-specific APKs.
if (!project.hasProperty('cdvBuildMultipleApks'))
cdvBuildMultipleApks = null
// Whether to append a 0 "abi digit" to versionCode when only a single APK is build
if (!project.hasProperty('cdvVersionCodeForceAbiDigit'))
cdvVersionCodeForceAbiDigit = null
// .properties files to use for release signing.
if (!project.hasProperty('cdvReleaseSigningPropertiesFile'))
cdvReleaseSigningPropertiesFile = null
// .properties files to use for debug signing.
if (!project.hasProperty('cdvDebugSigningPropertiesFile'))
cdvDebugSigningPropertiesFile = null
// Set by build.js script.
if (!project.hasProperty('cdvBuildArch'))
cdvBuildArch = null
// Plugin gradle extensions can append to this to have code run at the end.
cdvPluginPostBuildExtras = []
// PLUGIN GRADLE EXTENSIONS START
apply from: "../cordova-android-support-gradle-release/vct-cordova-android-support-gradle-release.gradle"
apply from: "../cordova-plugin-badge/vct-badge.gradle"
apply from: "../cordova-plugin-fcm-with-dependecy-updated/vct-FCMPlugin.gradle"
// PLUGIN GRADLE EXTENSIONS END
def hasBuildExtras1 = file('build-extras.gradle').exists()
if (hasBuildExtras1)
apply from: 'build-extras.gradle'
def hasBuildExtras2 = file('../build-extras.gradle').exists()
if (hasBuildExtras2)
apply from: '../build-extras.gradle'
// Set property defaults after extension .gradle files.
ext.cdvCompileSdkVersion = cdvCompileSdkVersion == null ? (
defaultCompileSdkVersion == null
? privateHelpers.getProjectTarget()
: defaultCompileSdkVersion
) : Integer.parseInt('' + cdvCompileSdkVersion);
if (ext.cdvBuildToolsVersion == null)
ext.cdvBuildToolsVersion = privateHelpers.findLatestInstalledBuildTools()
//ext.cdvBuildToolsVersion = project.ext.defaultBuildToolsVersion
if (ext.cdvDebugSigningPropertiesFile == null && file('../debug-signing.properties').exists())
ext.cdvDebugSigningPropertiesFile = '../debug-signing.properties'
if (ext.cdvReleaseSigningPropertiesFile == null && file('../release-signing.properties').exists())
ext.cdvReleaseSigningPropertiesFile = '../release-signing.properties'
// Cast to appropriate types.
ext.cdvBuildMultipleApks = cdvBuildMultipleApks == null ? false : cdvBuildMultipleApks.toBoolean();
ext.cdvVersionCodeForceAbiDigit = cdvVersionCodeForceAbiDigit == null ? false : cdvVersionCodeForceAbiDigit.toBoolean();
// minSdkVersion, maxSdkVersion and targetSdkVersion
ext.cdvMinSdkVersion = cdvMinSdkVersion == null ? defaultMinSdkVersion : Integer.parseInt('' + cdvMinSdkVersion)
if (cdvMaxSdkVersion != null)
ext.cdvMaxSdkVersion = Integer.parseInt('' + cdvMaxSdkVersion)
ext.cdvTargetSdkVersion = cdvTargetSdkVersion == null ? defaultTargetSdkVersion : Integer.parseInt('' + cdvTargetSdkVersion)
ext.cdvVersionCode = cdvVersionCode == null ? null : Integer.parseInt('' + cdvVersionCode)
def computeBuildTargetName(debugBuild)
def ret = 'assemble'
if (cdvBuildMultipleApks && cdvBuildArch)
def arch = cdvBuildArch == 'arm' ? 'armv7' : cdvBuildArch
ret += '' + arch.toUpperCase().charAt(0) + arch.substring(1);
return ret + (debugBuild ? 'Debug' : 'Release')
// Make cdvBuild a task that depends on the debug/arch-sepecific task.
task cdvBuildDebug
cdvBuildDebug.dependsOn
return computeBuildTargetName(true)
task cdvBuildRelease
cdvBuildRelease.dependsOn
return computeBuildTargetName(false)
task cdvPrintProps
doLast
println('cdvCompileSdkVersion=' + cdvCompileSdkVersion)
println('cdvBuildToolsVersion=' + cdvBuildToolsVersion)
println('cdvVersionCode=' + cdvVersionCode)
println('cdvVersionCodeForceAbiDigit=' + cdvVersionCodeForceAbiDigit)
println('cdvMinSdkVersion=' + cdvMinSdkVersion)
println('cdvMaxSdkVersion=' + cdvMaxSdkVersion)
println('cdvTargetSdkVersion=' + cdvTargetSdkVersion)
println('cdvBuildMultipleApks=' + cdvBuildMultipleApks)
println('cdvReleaseSigningPropertiesFile=' + cdvReleaseSigningPropertiesFile)
println('cdvDebugSigningPropertiesFile=' + cdvDebugSigningPropertiesFile)
println('cdvBuildArch=' + cdvBuildArch)
println('computedVersionCode=' + android.defaultConfig.versionCode)
android.productFlavors.each flavor ->
println('computed' + flavor.name.capitalize() + 'VersionCode=' + flavor.versionCode)
android
defaultConfig
versionCode cdvVersionCode ?: new BigInteger("" + privateHelpers.extractIntFromManifest("versionCode"))
applicationId privateHelpers.extractStringFromManifest("package")
if (cdvMinSdkVersion != null)
minSdkVersion cdvMinSdkVersion
if (cdvMaxSdkVersion != null)
maxSdkVersion cdvMaxSdkVersion
if(cdvTargetSdkVersion != null)
targetSdkVersion cdvTargetSdkVersion
lintOptions
abortOnError false;
compileSdkVersion cdvCompileSdkVersion
buildToolsVersion cdvBuildToolsVersion
// This code exists for Crosswalk and other Native APIs.
// By default, we multiply the existing version code in the
// Android Manifest by 10 and add a number for each architecture.
// If you are not using Crosswalk or SQLite, you can
// ignore this chunk of code, and your version codes will be respected.
if (Boolean.valueOf(cdvBuildMultipleApks))
flavorDimensions "default"
productFlavors
armeabi
versionCode defaultConfig.versionCode*10 + 1
ndk
abiFilters = ["armeabi"]
armv7
versionCode defaultConfig.versionCode*10 + 2
ndk
abiFilters = ["armeabi-v7a"]
arm64
versionCode defaultConfig.versionCode*10 + 3
ndk
abiFilters = ["arm64-v8a"]
x86
versionCode defaultConfig.versionCode*10 + 4
ndk
abiFilters = ["x86"]
x86_64
versionCode defaultConfig.versionCode*10 + 5
ndk
abiFilters = ["x86_64"]
else if (Boolean.valueOf(cdvVersionCodeForceAbiDigit))
// This provides compatibility to the default logic for versionCode before cordova-android 5.2.0
defaultConfig
versionCode defaultConfig.versionCode*10
compileOptions
sourceCompatibility JavaVersion.VERSION_1_8
targetCompatibility JavaVersion.VERSION_1_8
if (cdvReleaseSigningPropertiesFile)
signingConfigs
release
// These must be set or Gradle will complain (even if they are overridden).
keyAlias = ""
keyPassword = "__unset" // And these must be set to non-empty in order to have the signing step added to the task graph.
storeFile = null
storePassword = "__unset"
buildTypes
release
signingConfig signingConfigs.release
addSigningProps(cdvReleaseSigningPropertiesFile, signingConfigs.release)
if (cdvDebugSigningPropertiesFile)
addSigningProps(cdvDebugSigningPropertiesFile, signingConfigs.debug)
/*
* WARNING: Cordova Lib and platform scripts do management inside of this code here,
* if you are adding the dependencies manually, do so outside the comments, otherwise
* the Cordova tools will overwrite them
*/
dependencies
implementation fileTree(dir: 'libs', include: '*.jar')
// SUB-PROJECT DEPENDENCIES START
implementation(project(path: ":CordovaLib"))
implementation "androidx.legacy:legacy-support-v4:1.0.0"
implementation "com.google.firebase:firebase-messaging:18.0.0"
implementation "androidx.annotation:annotation:1.0.0"
implementation "androidx.appcompat:appcompat:1.0.0"
// SUB-PROJECT DEPENDENCIES END
def promptForReleaseKeyPassword()
if (!cdvReleaseSigningPropertiesFile)
return;
if ('__unset'.equals(android.signingConfigs.release.storePassword))
android.signingConfigs.release.storePassword = privateHelpers.promptForPassword('Enter key store password: ')
if ('__unset'.equals(android.signingConfigs.release.keyPassword))
android.signingConfigs.release.keyPassword = privateHelpers.promptForPassword('Enter key password: ');
gradle.taskGraph.whenReady taskGraph ->
taskGraph.getAllTasks().each() task ->
if(['validateReleaseSigning', 'validateSigningRelease', 'validateSigningArmv7Release', 'validateSigningX76Release'].contains(task.name))
promptForReleaseKeyPassword()
def addSigningProps(propsFilePath, signingConfig)
def propsFile = file(propsFilePath)
def props = new Properties()
propsFile.withReader reader ->
props.load(reader)
def storeFile = new File(props.get('key.store') ?: privateHelpers.ensureValueExists(propsFilePath, props, 'storeFile'))
if (!storeFile.isAbsolute())
storeFile = RelativePath.parse(true, storeFile.toString()).getFile(propsFile.getParentFile())
if (!storeFile.exists())
throw new FileNotFoundException('Keystore file does not exist: ' + storeFile.getAbsolutePath())
signingConfig.keyAlias = props.get('key.alias') ?: privateHelpers.ensureValueExists(propsFilePath, props, 'keyAlias')
signingConfig.keyPassword = props.get('keyPassword', props.get('key.alias.password', signingConfig.keyPassword))
signingConfig.storeFile = storeFile
signingConfig.storePassword = props.get('storePassword', props.get('key.store.password', signingConfig.storePassword))
def storeType = props.get('storeType', props.get('key.store.type', ''))
if (!storeType)
def filename = storeFile.getName().toLowerCase();
if (filename.endsWith('.p12') || filename.endsWith('.pfx'))
storeType = 'pkcs12'
else
storeType = signingConfig.storeType // "jks"
signingConfig.storeType = storeType
for (def func : cdvPluginPostBuildExtras)
func()
// This can be defined within build-extras.gradle as:
// ext.postBuildExtras = ... code here ...
if (hasProperty('postBuildExtras'))
postBuildExtras()
感谢您提前提供的任何帮助!
丹
【问题讨论】:
【参考方案1】:我有一个类似的错误,检查你的 config.xml,我有下面的 harcoded,导致你有同样的错误。
<config-file parent="/manifest/application/" target="app/src/main/AndroidManifest.xml">
<meta-data android:name="com.google.firebase.messaging.default_notification_icon android:resource="@drawable/icon" />
</config-file>
另外,请检查installation instructions for cordova-plugin-fcm-with-dependecy-updated 它明确指出您可以覆盖 ANDROID_DEFAULT_NOTIFICATION_ICON。 将其设置为空字符串应该可以解决您的问题。
【讨论】:
【参考方案2】:我发现我安装了更新版本的插件cordova-plugin-fcm-with-dependecy-updated
(7.0.3)。通过安装较早的版本(4.1.1),它删除了 android.json 文件中的 "ANDROID_DEFAULT_NOTIFICATION_ICON": "@mipmap/ic_launcher"
键值对。
在构建期间,当 AndroidManifest.xml 被重写时,<meta-data>
元素没有被复制。
【讨论】:
再次遇到此问题,请务必rm -rf plugins/
。运行ionic cordova platform remove android
,然后尝试新的构建。【参考方案3】:
您的清单中有两次 "meta-data android:name="com.google.firebase.messaging.default_notification_icon" android:resource="@drawable/notification_icon" /"。 第 12 和 27 行。删除一个。
【讨论】:
遗憾的是,每次运行构建命令时都会重写 AndroidManifest.xml。以上是关于任务“:app:processDebugManifest”执行失败:AndroidManifest.xml 中的 <meta-data/> 元素重复的主要内容,如果未能解决你的问题,请参考以下文章