Сборка динамической версии не удалась с дублирующимися ресурсами - PullRequest
0 голосов
/ 18 апреля 2019

Я создаю один пример для проверки доставки динамических функций, предоставляемых 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

Что этот пакет имеет значение?

1 Ответ

0 голосов
/ 18 апреля 2019

При создании APK с использованием ассемблера, выпуска или ассемблера, система сборки генерирует разные apk для разных динамических функций. Один для базы и один для каждой динамической функции. Таким образом, нет конфликта ресурсов.

В случае генерации пакета приложения система сборки может столкнуться с конфликтом, поскольку генерируемый артефакт является одним единственным артефактом, который является файлом aab.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...