任务“: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-androidxcordova-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 被重写时,&lt;meta-data&gt; 元素没有被复制。

【讨论】:

再次遇到此问题,请务必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/> 元素重复的主要内容,如果未能解决你的问题,请参考以下文章

背水一战 Windows 10 (119) - 后台任务: 后台下载任务(任务分组,组完成后触发后台任务)

任务计划程序打开软件的原理

CELERY 定时任务

“异步任务然后等待任务”与“任务然后返回任务”[重复]

宏任务和微任务的执行顺序

宏任务和微任务