关于 android:ERROR: Manifest merge failed with multiple errors,见日志 |但日志中没有错误

ERROR: Manifest merger failed with multiple errors, see logs | BUT NO ERRORS IN LOG

当我为 Android 构建 React Native 应用程序时出现以下错误(在 iOS 上没有问题)。

ERROR: Manifest merger failed with multiple errors, see logs

当我在发布模式下构建时,这会导致一个真正的问题(调试中的应用程序没有问题),因为它会为我的发布版本生成以下清单文件:

AndroidManifest.xml (在 app/src/release/)

1
2
3
4
5
6
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.myAppName"
    xmlns:tools="http://schemas.android.com/tools">

    <uses-permission tools:node="remove" android:name="android.permission.SYSTEM_ALERT_WINDOW" />
</manifest>

我知道对此有很多问题,但它们对我的情况并没有真正的帮助,因为如果我按照这个答案 (https://stackoverflow.com/a/42023614/1432355) 和转到我的 AndroidManifest.xml 文件上的 Merged Manfiest tab 我没有看到任何错误:

enter

以下是我的 manfiest 和 gradle 文件:

AndroidManifest.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
 <manifest xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
package="com.example.myApp">

<!-- Optional - Add the necessary permissions (Choose one of those) -->

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/> <!-- Approximate location - If you want to use promptLocation for letting OneSignal know the user location. -->

<!-- End optional permissions -->

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.DOWNLOAD_WITHOUT_NOTIFICATION" />
<uses-feature android:name="android.hardware.camera"/>
<uses-feature android:name="android.hardware.camera.autofocus"/>

<application
    tools:ignore="GoogleAppIndexingWarning"
    android:name=".MainApplication"
    android:label="@string/app_name"
    android:icon="@mipmap/ic_launcher"
    android:allowBackup="false"
    android:usesCleartextTraffic="true"
    android:networkSecurityConfig="@xml/network_security_config">

        <provider
            tools:replace="android:authorities"
            android:name="androidx.core.content.FileProvider"
            android:authorities="${applicationId}.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                tools:replace="android:resource"
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths"/>
        </provider>

        <activity
            android:name=".SplashActivity"
            android:label="@string/app_name"
            android:launchMode="singleTop">
            <intent-filter>
               
               
                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity
            android:name=".MainActivity"
            android:label="@string/app_name"
            android:configChanges="keyboard|keyboardHidden|orientation|screenSize"
            android:windowSoftInputMode="adjustResize|stateAlwaysHidden"
            android:exported="true">
        </activity>
   
</application>

build.gradle(项目:MyAppName)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
// Top-level build file where you can add configuration options common to all sub-projects/modules.

buildscript {
    ext {
        buildToolsVersion ="28.0.3"
        minSdkVersion = 19
        compileSdkVersion = 28
        targetSdkVersion = 28
        supportLibVersion ="28.0.0"
    }
    repositories {
        google()
        jcenter()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.1'

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        mavenLocal()
        google()
        jcenter()
        maven {
            // All of React Native (JS, Obj-C sources, Android binaries) is installed from npm
            url"$rootDir/../node_modules/react-native/android"
        }
    }
}

wrapper {
    gradleVersion = '5.4'
    distributionUrl = distributionUrl.replace("bin","all")
}

build.gradle(模块:app)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
apply plugin: 'com.onesignal.androidsdk.onesignal-gradle-plugin'
apply plugin:"com.android.application"

import com.android.build.OutputFile

buildscript {
    repositories {
        maven { url 'https://plugins.gradle.org/m2/' } // Gradle Plugin Portal
    }
    dependencies {
        // OneSignal-Gradle-Plugin
        classpath 'gradle.plugin.com.onesignal:onesignal-gradle-plugin:[0.12.2, 0.99.99]'
    }
}

project.ext.react = [
    entryFile:"index.js",
]

apply from:"../../node_modules/react-native/react.gradle"
apply from:"../../node_modules/react-native-vector-icons/fonts.gradle"

/**
 * Set this to true to create two separate APKs instead of one:
 *   - An APK that only works on ARM devices
 *   - An APK that only works on x86 devices
 * The advantage is the size of the APK is reduced by about 4MB.
 * Upload all the APKs to the Play Store and people will download
 * the correct one based on the CPU architecture of their device.
 */
def enableSeparateBuildPerCPUArchitecture = false

/**
 * Run Proguard to shrink the Java bytecode in release builds.
 */
def enableProguardInReleaseBuilds = false

android {
    compileSdkVersion rootProject.ext.compileSdkVersion

    defaultConfig {
        applicationId"com.example.myApp"
        minSdkVersion rootProject.ext.minSdkVersion
        targetSdkVersion rootProject.ext.targetSdkVersion
        versionCode 18
        versionName"0.6.3"
//        ndk {
//            abiFilters.clear()
//        }
        ndk {
            abiFilters"armeabi-v7a","arm64-v8a","x86","x86_64"
// ...
        }
    }
    signingConfigs {
        release {
            if (project.hasProperty('MYAPP_RELEASE_STORE_FILE')) {
                storeFile file(MYAPP_RELEASE_STORE_FILE)
                storePassword MYAPP_RELEASE_STORE_PASSWORD
                keyAlias MYAPP_RELEASE_KEY_ALIAS
                keyPassword MYAPP_RELEASE_KEY_PASSWORD
            }
        }
    }
//    splits {
//        abi {
//            enable true //enables the ABIs split mechanism
//            reset() //reset the list of ABIs to be included to an empty string
//            include 'arm64-v8a', 'armeabi-v7a', 'x86'
//            universalApk false
//        }
//    }
    splits {
        abi {
            reset()
            enable enableSeparateBuildPerCPUArchitecture
            universalApk false  // If true, also generate a universal APK
            include"armeabi-v7a","x86"
        }
    }
    buildTypes {
        release {
            minifyEnabled enableProguardInReleaseBuilds
            proguardFiles getDefaultProguardFile("proguard-android.txt"),"proguard-rules.pro"
            signingConfig signingConfigs.release
        }
    }
    // applicationVariants are e.g. debug, release
    applicationVariants.all { variant ->
        variant.outputs.each { output ->
            // For each separate APK per architecture, set a unique version code as described here:
            // http://tools.android.com/tech-docs/new-build-system/user-guide/apk-splits
            def versionCodes = ["armeabi-v7a":1,"x86":2]
            def abi = output.getFilter(OutputFile.ABI)
            if (abi != null) {  // null for the universal-debug, universal-release variants
                output.versionCodeOverride =
                        versionCodes.get(abi) * 1048576 + defaultConfig.versionCode
            }
        }
    }
    buildToolsVersion '28.0.3'

    packagingOptions {
        pickFirst '**/libc++_shared.so'
        doNotStrip '*/mips/*.so'
        doNotStrip '*/mips64/*.so'
    }
}

dependencies {
    implementation project(':react-native-reanimated')
    implementation project(':react-native-image-resizer')
    implementation project(':react-native-pdf')
    implementation project(':react-native-vector-icons')
    implementation project(':react-native-gesture-handler')
    implementation project(':rn-fetch-blob')
    implementation project(':react-native-image-picker')
    implementation project(':react-native-onesignal')
    implementation 'androidx.appcompat:appcompat:1.0.2'
    implementation"com.facebook.react:react-native:0.59.9" // From node_modules
    implementation('org.conscrypt:conscrypt-android:2.0.0')
////    implementation fileTree(dir:"libs", include: ["*.jar"])
}

// Run this once to be able to run the application with BUCK
// puts all compile dependencies into folder libs for BUCK to use
task copyDownloadableDepsToLibs(type: Copy) {
    from configurations.compile
    into 'libs'
}

更新 1

enter

相关讨论
  • 你的应用程序中有其他模块吗?
  • @PrachiSingh 查看更新 1
  • 确保所有模块 gradle 中相同的依赖项具有相同的版本
  • @PrachiSingh 唯一的区别是我有 implementation"com.facebook.react:react-native:0.59.9" 和模块 implementation"com.facebook.react:react-native:+"。不幸的是,将它们设置为相同的版本并没有改变任何东西
  • @Moucheg 我正在使用类似的库,并且与 rn-fetch-blob 和 image-picker 发生冲突。您是否尝试过像这样使用提供者的元数据标签? <meta-data tools:replace="android:resource" android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" />
  • @ZassX 是的,我试过了,但我有同样的错误。如果我评论 rn-fetch-blob 和 image-picker 依赖项,我会在 Merged Manifest 选项卡中收到此错误:Merging Errors: Warning provider#android.support.v4.content.FileProvider@android:aut??horities was tagged at AndroidManifest.xml:29 to replace other declarations but no other declaration present app main manifest (this file), line 28 Warning meta-data#android.support.FILE_PROVIDER_PATHS@android:resour??ce was tagged at AndroidManifest.xml:35 to replace other declarations but no other declaration present app main manifest (this file), line 34
  • @Moucheg 只是为了测试:保留依赖项注释并插入元数据工具:替换属性。还是同样的错误?
  • @ZassX 注释所有依赖项时出现相同错误
  • @Moucheg 对不起,我没有想法。在将 Android Studio 更新到新版本后,我遇到了同样的问题,但必须通过使用旧版本的 Studio 来临时解决一个关键的修复问题,以便构建一个运行良好的构建。 Ofc 我正计划解决这个问题,所以会密切关注这个问题,如果我发现任何问题,我会报告。祝你好运!
  • @ZassX 我找到了导致此错误的原因,请参阅下面的答案

我的问题实际上与我的代码或 gradle 设置无关,而是与 Android Studio 本身有关。

我发现(在很多帮助下)在 Preferences (cmd) 中有一个名为 Experimental 的部分,其中有一个名为 Only sync the active variant 的选项已被选中。一旦我取消选中它,错误就消失了。

我在 b.android.com

上为此填写了一个问题

enter

相关讨论
  • @sam 您是否尝试过使缓存无效、清理项目、重新启动 AS ?你有什么样的错误?
  • 错误是一样的,但我通过更新所有 Gradle 依赖项来解决它

以上是关于 android:ERROR: Manifest merge failed with multiple errors,见日志 |但日志中没有错误的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>