Я создаю один пример для проверки доставки динамических функций, предоставляемых Android. У меня есть структура проекта следующим образом. Базовый проект приложение и один динамический элемент sample_dynamic_feature . Все настройки, необходимые для доставки динамических функций, выполнены. Проблема возникает, когда я добавляю любой файл макета или XML-файл с тем же именем в базовый модуль, а также в динамический модуль. Я добавил activity_main.xml как в базовом приложении, так и в динамическом модуле. Я получил следующую ошибку:
Что пошло не так:
Execution failed for task ':app:packageReleaseBundle'.
> java.util.concurrent.ExecutionException: com.android.tools.build.bundletool.exceptions.ValidationException: com.android.tools.build.bundletool.exceptions.ValidationException: Modules 'base' and 'sample_dynamic_feature' contain entry 'res/layout/activity_main.xml' with different content.
Хорошо работает с:
Above setup works fine in debug mode.
./gradlew assembleDebug
./gradlew assembleRelease
Сбой:
In case of release mode it gives me above error.
./gradlew bundleDebug
./gradlew bundleRelease
Полная трассировка стека:
Исключение составляют:
org.gradle.api.tasks.TaskExecutionException: не удалось выполнить задачу ': app: packageReleaseBundle'.
в org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions (ExecuteActionsTaskExecuter.java:110)
в org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute (ExecuteActionsTaskExecuter.java:77)
в org.gradle.api.internal.tasks.execution.OutputDirectoryCreatingTaskExecuter.execute (OutputDirectoryCreatingTaskExecuter.java:51)
в org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute (SkipUpToDateTaskExecuter.java:59)
в org.gradle.api.internal.tasks.execution.ResolveTaskOutputCachingStateExecuter.execute (ResolveTaskOutputCachingStateExecuter.java:54)
в org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute (ValidatingTaskExecuter.java:59)
в org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute (SkipEmptySourceFilesTaskExecuter.java:101)
в org.gradle.api.internal.tasks.execution.FinalizeInputFilePropertiesTaskExecuter.execute (FinalizeInputFilePropertiesTaskExecuter.java:44)
в org.gradle.api.internal.tasks.execution.CleanupStaleOutputsExecuter.execute (CleanupStaleOutputsExecuter.java:91)
в org.gradle.api.internal.tasks.execution.ResolveTaskArtifactStateTaskExecuter.execute (ResolveTaskArtifactStateTaskExecuter.java:62)
в org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute (SkipTaskWithNoActionsExecuter.java:59)
в org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute (SkipOnlyIfTaskExecuter.java:54)
в org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute (ExecuteAtMostOnceTaskExecuter.java:43)
в org.gradle.api.internal.tasks.execution.CatchExceptionTaskExecuter.execute (CatchExceptionTaskExecuter.java:34)
в org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter $ 1.run (EventFiringTaskExecuter.java:51)
в org.gradle.internal.operations.DefaultBuildOperationExecutor $ RunnableBuildOperationWorker.execute (DefaultBuildOperationExecutor.java:300)
в org.gradle.internal.operations.DefaultBuildOperationExecutor $ RunnableBuildOperationWorker.execute (DefaultBuildOperationExecutor.java:292)
в org.gradle.internal.operations.DefaultBuildOperationExecutor.execute (DefaultBuildOperationExecutor.java:174)
в org.gradle.internal.operations.DefaultBuildOperationExecutor.run (DefaultBuildOperationExecutor.java:90)
в org.gradle.internal.operations.DelegatingBuildOperationExecutor.run (DelegatingBuildOperationExecutor.java:31)
в org.gradle.api.internal.tasks.execution.EventFiringTaskExecuter.execute (EventFiringTaskExecuter.java:46)
в org.gradle.execution.taskgraph.LocalTaskInfoExecutor.execute (LocalTaskInfoExecutor.java:42)в org.gradle.execution.taskgraph.DefaultTaskExecutionGraph $ BuildOperationAwareWorkItemExecutor.execute (DefaultTaskExecutionGraph.java:277)
в org.gradle.execution.taskgraph.DefaultTaskExecutionGraph $ BuildOperationAwareWorkItemExecutor.execute (DefaultTaskExecutionGraph.java:262)
в org.gradle.execution.taskgraph.DefaultTaskPlanExecutor $ ExecutorWorker $ 1.execute (DefaultTaskPlanExecutor.java:135)
в org.gradle.execution.taskgraph.DefaultTaskPlanExecutor $ ExecutorWorker $ 1.execute (DefaultTaskPlanExecutor.java:130)
в org.gradle.execution.taskgraph.DefaultTaskPlanExecutor $ ExecutorWorker.execute (DefaultTaskPlanExecutor.java:200)
в org.gradle.execution.taskgraph.DefaultTaskPlanExecutor $ ExecutorWorker.executeWithWork (DefaultTaskPlanExecutor.java:191)
в org.gradle.execution.taskgraph.DefaultTaskPlanExecutor $ ExecutorWorker.run (DefaultTaskPlanExecutor.java:130)
в org.gradle.internal.concurrent.ExecutorPolicy $ CatchAndRecordFailures.onExecute (ExecutorPolicy.java:63)
в org.gradle.internal.concurrent.ManagedExecutorImpl $ 1.run (ManagedExecutorImpl.java:46)
в org.gradle.internal.concurrent.ThreadFactoryImpl $ ManagedThreadRunnable.run (ThreadFactoryImpl.java:55)
Вызывается: org.gradle.internal.UncheckedException: java.util.concurrent.ExecutionException: com.android.tools.build.bundletool.exceptions.ValidationException: модули «base» и «sample_dynamic_feature» содержат запись «res / layout / activity_main. XML с различным содержанием.
в org.gradle.internal.UncheckedException.throwAsUncheckedException (UncheckedException.java:63)
в org.gradle.internal.UncheckedException.throwAsUncheckedException (UncheckedException.java:40)
в org.gradle.internal.reflect.JavaMethod.invoke (JavaMethod.java:76)
в org.gradle.api.internal.project.taskfactory.StandardTaskAction.doExecute (StandardTaskAction.java:46)
в org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute (StandardTaskAction.java:39)
в org.gradle.api.internal.project.taskfactory.StandardTaskAction.execute (StandardTaskAction.java:26)
в org.gradle.api.internal.AbstractTask $ TaskActionWrapper.execute (AbstractTask.java:801)
в org.gradle.api.internal.AbstractTask $ TaskActionWrapper.execute (AbstractTask.java:768)
в org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter $ 1.run (ExecuteActionsTaskExecuter.java:131)
в org.gradle.internal.operations.DefaultBuildOperationExecutor $ RunnableBuildOperationWorker.execute (DefaultBuildOperationExecutor.java:300)
в org.gradle.internal.operations.DefaultBuildOperationExecutor $ RunnableBuildOperationWorker.execute (DefaultBuildOperationExecutor.java:292)
в org.gradle.internal.operations.DefaultBuildOperationExecutor.execute (DefaultBuildOperationExecutor.java:174)
в org.gradle.internal.operations.DefaultBuildOperationExecutor.run (DefaultBuildOperationExecutor.java:90)
в org.gradle.internal.operations.DelegatingBuildOperationExecutor.run (DelegatingBuildOperationExecutor.java:31)
в org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction (ExecuteActionsTaskExecuter.java:120)
в org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions (ExecuteActionsTaskExecuter.java:99)
... еще 31
Вызывается: java.util.concurrent.ExecutionException: com.android.tools.build.bundletool.exceptions.ValidationException: модули 'base' и 'sample_dynamic_feature' содержат запись 'res / layout / activity_main.xml' с различным содержимым.на com.android.ide.common.workers.ExecutorServiceAdapter.close (ExecutorServiceAdapter.kt: 56)
at kotlin.io.CloseableKt.closeFinally (Closeable.kt: 53)
в com.android.build.gradle.internal.tasks.PackageBundleTask.bundleModules (PackageBundleTask.kt: 121)
в org.gradle.internal.reflect.JavaMethod.invoke (JavaMethod.java:73)
... еще 44
Вызывается: com.android.tools.build.bundletool.exceptions.ValidationException: модули 'base' и 'sample_dynamic_feature' содержат запись 'res / layout / activity_main.xml' с различным содержанием.
в com.android.tools.build.bundletool.exceptions.ValidationException $ Builder.build (ValidationException.java:49)
в com.android.tools.build.bundletool.exceptions.ValidationException $ Builder.build (ValidationException.java:41)
в com.android.tools.build.bundletool.validation.EntryClashValidator.checkEqualEntries (EntryClashValidator.java:66)
в com.android.tools.build.bundletool.validation.EntryClashValidator.validateAllModules (EntryClashValidator.java:52)
в com.android.tools.build.bundletool.validation.ValidatorRunner.validateBundleModulesUsingSubValidator (ValidatorRunner.java:75)
в com.android.tools.build.bundletool.validation.ValidatorRunner.lambda $ validateBundleModules $ 4 (ValidatorRunner.java:64)
на com.google.common.collect.ImmutableList.forEach (ImmutableList.java:407)
в com.android.tools.build.bundletool.validation.ValidatorRunner.validateBundleModules (ValidatorRunner.java:63)
в com.android.tools.build.bundletool.validation.BundleModulesValidator.validate (BundleModulesValidator.java:101)
на com.android.tools.build.bundletool.commands.BuildBundleCommand.validateInput (BuildBundleCommand.java:244)
на com.android.tools.build.bundletool.commands.BuildBundleCommand.execute (BuildBundleCommand.java:162)
в com.android.build.gradle.internal.tasks.PackageBundleTask $ BundleToolRunnable.run (PackageBundleTask.kt: 200)
на com.android.ide.common.workers.ExecutorServiceAdapter $ submit $ submission $ 1.run (ExecutorServiceAdapter.kt: 39)
... еще 48
Что этот пакет имеет значение?