关于 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 我没有看到任何错误:
以下是我的 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
相关讨论
- 你的应用程序中有其他模块吗?
- @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
上为此填写了一个问题
相关讨论
- @sam 您是否尝试过使缓存无效、清理项目、重新启动 AS ?你有什么样的错误?
- 错误是一样的,但我通过更新所有 Gradle 依赖项来解决它
THE END
二维码