如何在Android Studio的AndroidManifest.xml中添加ARCore依赖类型com.google.ar.core

3
我正在尝试将我的AR应用程序上传到Google Play Console,但每次尝试都会出现错误。该应用程序是使用gradle在Unity中构建的,使用ARCore。我是Android开发的新手,正在尝试编辑我的AndroidManifest.xml,但我认为我做错了什么。
最初,我尝试在Unity中构建具有拆分应用程序二进制文件的APK,但只能导出.gradle文件。因此,我在Android Studio中打开了它,并构建了一个APK和AAB以上传到Google Play Console。
AAB文件上传产生了以下错误:

尽管已指定了meta-data标签com.google.ar.core.min_apk_version,但AndroidManifest.xml文件中缺少ARCore依赖项类型com.google.ar.core。

我尝试将implementation 'com.google.ar:core:1.12.0'添加到AndroidManifest依赖项中,但gradle项目同步失败。
我需要进一步编辑清单吗?
非常感谢您的帮助!
更新: 我已在gradle文件中添加了ARCore依赖项,并在清单中标记了AR Core。
这是.gradle文件:

// GENERATED BY UNITY. REMOVE THIS COMMENT TO PREVENT OVERWRITING WHEN EXPORTING AGAIN

buildscript {
    repositories {
        google()
        jcenter()

    }



    dependencies {
        classpath 'com.android.tools.build:gradle:3.4.2'

    }
}

allprojects {
    repositories {
        google()
        flatDir {
            dirs 'libs'
        }
    }
}

apply plugin: 'com.android.application'

dependencies {
    implementation 'com.google.ar:core:1.12.0'
}


dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation(name: 'UnityARCore', ext:'aar')
    implementation(name: 'UnityChannel', ext:'aar')
    implementation(name: 'arcore_client', ext:'aar')
    implementation(name: 'nativeshare-release', ext:'aar')
    implementation(name: 'unityandroidpermissions', ext:'aar')
    implementation(name: 'unitygar', ext:'aar')
}

android {
    compileSdkVersion 29
    buildToolsVersion '29.0.2'

    defaultConfig {
        minSdkVersion 27
        targetSdkVersion 29
        applicationId 'com.TylerCalkin.OURARhug'
        ndk {
            abiFilters 'armeabi-v7a', 'x86'
        }
        versionCode 1
        versionName '2.4'
    }

    lintOptions {
        abortOnError false
    }

    aaptOptions {
        noCompress '.unity3d', '.ress', '.resource', '.obb'
    }

    buildTypes {
        debug {
            minifyEnabled true
            useProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'
            jniDebuggable true
        }
        release {
            minifyEnabled true
            useProguard false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-unity.txt'
            signingConfig signingConfigs.debug
        }
    }

    packagingOptions {
        doNotStrip '*/armeabi-v7a/*.so'
        doNotStrip '*/x86/*.so'
    }


}

我现在遇到了一个问题:

合并清单失败:属性meta-data#com.google.ar.core.min_apk_version @ value value =(190805000)来自[com.google.ar:core:1.12.0] AndroidManifest.xml:35:13-38 也出现在[: arcore_client:] AndroidManifest.xml:43:13-38 value =(180525000)。 建议:在AndroidManifest.xml的33:9-35:41处添加“tools:replace =”android:value“”元素覆盖。

但我的Merged Manifest选项卡中只列出了一个清单源和一些未贡献任何元素的其他清单文件。我正在尝试添加

tools: replace =“android:value”

但我只能在我的项目中找到一个清单,将其添加会导致构建APK时出现其他错误。
有人能指导我确切地在哪里以及如何解决我的合并冲突吗?
例如,当我像这样将其添加到我的清单中时:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.Name.Appname" xmlns:tools="http://schemas.android.com/tools" android:installLocation="preferExternal">
  <supports-screens android:smallScreens="true" android:normalScreens="true" android:largeScreens="true" android:xlargeScreens="true" android:anyDensity="true" />
  <application android:theme="@style/UnityThemeSelector" android:icon="@mipmap/app_icon" android:label="@string/app_name" android:isGame="true" android:roundIcon="@mipmap/app_icon_round" >
    <activity android:label="@string/app_name" android:screenOrientation="fullSensor" android:launchMode="singleTask" android:configChanges="mcc|mnc|locale|touchscreen|keyboard|keyboardHidden|navigation|orientation|screenLayout|uiMode|screenSize|smallestScreenSize|fontScale|layoutDirection|density" android:hardwareAccelerated="false" android:name="com.Name.Appname.UnityPlayerActivity">
      <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
        <category android:name="android.intent.category.LEANBACK_LAUNCHER" />
      </intent-filter>
      <meta-data android:name="unityplayer.UnityActivity" android:value="true" />
    </activity>
    <meta-data android:name="unity.tango-enable" android:value="True" />
    <meta-data android:name="unityplayer.SkipPermissionsDialog" android:value="true" />
    <meta-data android:name="unity.build-id" android:value="92706e04-4de4-49cc-a450-6e2e2712e07a" />
    <meta-data android:name="unity.splash-mode" android:value="0" />
    <meta-data android:name="unity.splash-enable" android:value="True" />
    <meta-data android:name="com.google.ar.core" android:value="required" />
    <meta-data tools:replace="android:value" />
  </application>
  <uses-feature android:glEsVersion="0x00020000" />
  <uses-permission android:name="android.permission.CAMERA" />
  <uses-permission android:name="android.permission.INTERNET" />
  <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
  <uses-feature android:name="android.hardware.touchscreen" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen.multitouch" android:required="false" />
  <uses-feature android:name="android.hardware.touchscreen.multitouch.distinct" android:required="false" />
</manifest>

我遇到了以下错误:

java.lang.RuntimeException: Manifest merger failed with multiple errors, see logs
 at com.android.builder.core.AndroidBuilder.mergeManifestsForApplication(AndroidBuilder.java:558)
 at com.android.build.gradle.tasks.ProcessApplicationManifest.doFullTaskAction(ProcessApplicationManifest.java:208)
 at com.android.build.gradle.internal.tasks.IncrementalTask.taskAction(IncrementalTask.java:106)
 at sun.reflect.GeneratedMethodAccessor516.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
 at java.lang.reflect.Method.invoke(Method.java:498)
 at org.gradle.internal.reflect.JavaMethod.invoke(JavaMethod.java:103)
 at org.gradle.api.internal.project.taskfactory.IncrementalTaskInputsTaskAction.doExecute(IncrementalTaskInputsTaskAction.java:46)
 at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:41)
 at org.gradle.api.internal.project.taskfactory.AbstractIncrementalTaskAction.execute(AbstractIncrementalTaskAction.java:25)
 at org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute(StandardTaskAction.java:28)
 at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$5.run(ExecuteActionsTaskExecuter.java:404)
 at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:402)
 at org.gradle.internal.operations.DefaultBuildOperationExecutor$RunnableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:394)
 at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
 at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
 at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
 at org.gradle.internal.operations.DefaultBuildOperationExecutor.run(DefaultBuildOperationExecutor.java:92)
 at org.gradle.internal.operations.DelegatingBuildOperationExecutor.run(DelegatingBuildOperationExecutor.java:31)
 at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:393)
 at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:376)
 at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.access$200(ExecuteActionsTaskExecuter.java:80)
 at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter$TaskExecution.execute(ExecuteActionsTaskExecuter.java:213)
 at org.gradle.internal.execution.steps.ExecuteStep.lambda$execute$0(ExecuteStep.java:32)
 at java.util.Optional.map(Optional.java:215)
 at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:32)
 at org.gradle.internal.execution.steps.ExecuteStep.execute(ExecuteStep.java:26)
 at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:58)
 at org.gradle.internal.execution.steps.CleanupOutputsStep.execute(CleanupOutputsStep.java:35)
 at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:48)
 at org.gradle.internal.execution.steps.ResolveInputChangesStep.execute(ResolveInputChangesStep.java:33)
 at org.gradle.internal.execution.steps.CancelExecutionStep.execute(CancelExecutionStep.java:39)
 at org.gradle.internal.execution.steps.TimeoutStep.executeWithoutTimeout(TimeoutStep.java:73)
 at org.gradle.internal.execution.steps.TimeoutStep.execute(TimeoutStep.java:54)
 at org.gradle.internal.execution.steps.CatchExceptionStep.execute(CatchExceptionStep.java:35)
 at org.gradle.internal.execution.steps.CreateOutputsStep.execute(CreateOutputsStep.java:51)
 at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:45)
 at org.gradle.internal.execution.steps.SnapshotOutputsStep.execute(SnapshotOutputsStep.java:31)
 at org.gradle.internal.execution.steps.CacheStep.executeWithoutCache(CacheStep.java:201)
 at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:70)
 at org.gradle.internal.execution.steps.CacheStep.execute(CacheStep.java:45)
 at org.gradle.internal.execution.steps.BroadcastChangingOutputsStep.execute(BroadcastChangingOutputsStep.java:49)
 at org.gradle.internal.execution.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:43)
 at org.gradle.internal.execution.steps.StoreSnapshotsStep.execute(StoreSnapshotsStep.java:32)
 at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:38)
 at org.gradle.internal.execution.steps.RecordOutputsStep.execute(RecordOutputsStep.java:24)
 at org.gradle.internal.execution.steps.SkipUpToDateStep.executeBecause(SkipUpToDateStep.java:96)
 at org.gradle.internal.execution.steps.SkipUpToDateStep.lambda$execute$0(SkipUpToDateStep.java:89)
 at java.util.Optional.map(Optional.java:215)
 at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:54)
 at org.gradle.internal.execution.steps.SkipUpToDateStep.execute(SkipUpToDateStep.java:38)
 at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:77)
 at org.gradle.internal.execution.steps.ResolveChangesStep.execute(ResolveChangesStep.java:37)
 at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:36)
 at org.gradle.internal.execution.steps.legacy.MarkSnapshottingInputsFinishedStep.execute(MarkSnapshottingInputsFinishedStep.java:26)
 at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:90)
 at org.gradle.internal.execution.steps.ResolveCachingStateStep.execute(ResolveCachingStateStep.java:48)
 at org.gradle.internal.execution.impl.DefaultWorkExecutor.execute(DefaultWorkExecutor.java:33)
 at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:120)
 at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionStateTaskExecuter.execute(ResolveBeforeExecutionStateTaskExecuter.java:75)
 at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:62)
 at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:108)
 at org.gradle.api.internal.tasks.execution.ResolveBeforeExecutionOutputsTaskExecuter.execute(ResolveBeforeExecutionOutputsTaskExecuter.java:67)
 at org.gradle.api.internal.tasks.execution.ResolveAfterPreviousExecutionStateTaskExecuter.execute(ResolveAfterPreviousExecutionStateTaskExecuter.java:46)
 at org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute(CleanupStaleOutputsExecuter.java:94)
 at org.gradle.api.internal.tasks.execution.FinalizePropertiesTaskExecuter.execute(FinalizePropertiesTaskExecuter.java:46)
 at org.gradle.api.internal.tasks.execution.ResolveTaskExecutionModeExecuter.execute(ResolveTaskExecutionModeExecuter.java:95)
 at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:57)
 at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:56)
 at org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute(CatchExceptionTaskExecuter.java:36)
 at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.executeTask(EventFiringTaskExecuter.java:73)
 at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:52)
 at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter$1.call(EventFiringTaskExecuter.java:49)
 at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:416)
 at org.gradle.internal.operations.DefaultBuildOperationExecutor$CallableBuildOperationWorker.execute(DefaultBuildOperationExecutor.java:406)
 at org.gradle.internal.operations.DefaultBuildOperationExecutor$1.execute(DefaultBuildOperationExecutor.java:165)
 at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:250)
 at org.gradle.internal.operations.DefaultBuildOperationExecutor.execute(DefaultBuildOperationExecutor.java:158)
 at org.gradle.internal.operations.DefaultBuildOperationExecutor.call(DefaultBuildOperationExecutor.java:102)
 at org.gradle.internal.operations.DelegatingBuildOperationExecutor.call(DelegatingBuildOperationExecutor.java:36)
 at org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute(EventFiringTaskExecuter.java:49)
 at org.gradle.execution.plan.LocalTaskNodeExecutor.execute(LocalTaskNodeExecutor.java:43)
 at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:355)
 at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$InvokeNodeExecutorsAction.execute(DefaultTaskExecutionGraph.java:343)
 at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:336)
 at org.gradle.execution.taskgraph.DefaultTaskExecutionGraph$BuildOperationAwareExecutionAction.execute(DefaultTaskExecutionGraph.java:322)
 at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:134)
 at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker$1.execute(DefaultPlanExecutor.java:129)
 at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.execute(DefaultPlanExecutor.java:202)
 at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.executeNextNode(DefaultPlanExecutor.java:193)
 at org.gradle.execution.plan.DefaultPlanExecutor$ExecutorWorker.run(DefaultPlanExecutor.java:129)
 at org.gradle.internal.concurrent.ExecutorPolicy$CatchAndRecordFailures.onExecute(ExecutorPolicy.java:63)
 at org.gradle.internal.concurrent.ManagedExecutorImpl$1.run(ManagedExecutorImpl.java:46)
 at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
 at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
 at org.gradle.internal.concurrent.ThreadFactoryImpl$ManagedThreadRunnable.run(ThreadFactoryImpl.java:55)
 at java.lang.Thread.run(Thread.java:748)

更新#2:我尝试在清单、应用和元数据标签的各个位置添加tools:replace,但它们都不起作用。我看到了其他问题的解决方案,但我找到的答案都没有解决我的错误。


嗨,恭喜你的第一个SO问题!:) 我并不是一个Unity专家,但你是否尝试过按照这个指南进行操作:https://library.vuforia.com/content/vuforia-library/en/articles/Solution/arcore-with-vuforia.html? - tehcpu
谢谢你提供的链接!虽然我没有使用Vuforia,但这篇文章非常有帮助。我仍然遇到了一个错误,不过这是一个很好的参考资料 :) - Tyler
2个回答

6

ARCore的依赖项写在 gradle 文件中,您可以通过以下方式请求该依赖项:

dependencies {
    implementation 'com.google.ar:core:1.11.0'
}

你的清单文件中是否有ARCore标签?

<application>
    <meta-data android:name="com.google.ar.core" android:value="optional" />
</application>

谢谢回复!gradle文件中已经有2个依赖引用:dependencies { classpath 'com.android.tools.build:gradle:3.4.2'} .... 还有一个带有多个实现的。它应该放在其中一个里面,还是我应该使用第三个? - Tyler
当我将ARCore标签添加到清单中时,出现了以下错误:清单合并失败:属性meta-data#com.google.ar.core.min_apk_version@value的值(190805000)来自[com.google.ar:core:1.12.0] AndroidManifest.xml:35:13-38,在[:arcore_client:] AndroidManifest.xml:43:13-38中也存在值(180525000)。 建议:在AndroidManifest.xml:33:9-35:41的<meta-data>元素中添加'tools:replace="android:value"'以覆盖。 - Tyler
问题出在你的清单文件中。你是否使用了多个库?你的应用程序中是否使用了多个模块?你是否熟悉清单合并?基本上,你项目中的模块和库也都有一个清单文件。当你尝试构建应用程序时,这些清单文件会被合并。你需要仔细查看合并的内容,以修复 ARCore 应用程序的清单问题。https://developer.android.com/studio/build/manifest-merge - Chrystian
谢谢你提供的链接。我只有一个模块,所以可能在不知情的情况下使用了多个库。我的合并清单选项卡只列出了一个清单源和一些其他的清单文件,它们没有贡献任何元素,然后就出现了合并错误。我现在陷入困境,试图找到这个其他的清单文件或库。 - Tyler
你能贴出你的Gradle文件吗? - Chrystian
是的,我已经将gradle文件添加到问题中。谢谢! - Tyler

0

遇到了同样的问题!由于合并冲突导致构建失败。通过以下两个步骤解决:

步骤1:

将 AndroidManifest.xml 文件从 {ProjectPath}\Temp\gradleOut\src\main 复制到 {ProjectPath}\Assets\Plugins\Android

步骤2:

在应用程序标签中与其他 meta-data 标签一起复制以下行

<meta-data android:name="com.google.ar.core" android:value="required" tools:replace="android:value" />

步骤3:

尝试再次构建和运行它!希望这次能够成功。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接