Gradle second build не работает после изменения styles.xml

Я перенес проект, чтобы использовать Gradle (используя старую структуру проекта Android). Недавно я обновил Android Studio до версии 2.0, что заставило меня использовать плагин android gradle v0.5. Я могу построить свой проект, используя любой из вариантов, которые я определил, либо в debug / release.

Что-то пошло не так для меня, используя следующий сценарий:

  • Выполнить градирную очистку
  • Выполнить сборку gradlewTestenvDebug
  • Выходная мощность в этой точке:

СТРОИТЬ УСПЕШНО

  • Измените любое значение в файле styles.xml
  • Выполнить градиентную сборку TestenvDebug (снова)
  • Выходная мощность в этой точке:

/Users/myuser/Project/src/com/namespace/project/views/SomeCustomView.java:60: ошибка: не удается найти символ mSize = arr.getInt (R.styleable.SomeCustomView_some_custom_styleable, 0);

Gradle теперь жалуется на каждый пользовательский атрибут xml, который я объявил в attrs.xml. Это сводит меня с ума, так как я должен чистить и перестраивать проект каждый раз, когда изменяю styles.xml

ПОЖАЛУЙСТА, помогите мне.

Благодаря!

Моя структура проекта:

- Project - . AndroidManifest.xml - . assets/ - . build/ - . build.gradle - . gen/ - . gradle/ - . gradle.properties - . gradlew - . libs (includes .jar files) - . modules - . . library_projectA - . . library_projectB - . out - . project.properties - . res - . res_testenv - . . values - . . . strings.xml - . res_prodenv - . . values - . . . strings.xml - . settings.gradle - . src/ - . . com/ - . . . namespace/ - . . . . android/ 

Build.gradle в директории проекта:

 task wrapper(type: Wrapper) { gradleVersion = '1.6' } buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.5.+' } } apply plugin: 'android' dependencies { compile 'com.android.support:support-v4:13.0.0' compile fileTree(dir: 'libs', include: '*.jar') compile project(':modules:libprojectA') compile project(':modules:libprojectB') } android { compileSdkVersion 17 buildToolsVersion "17.0.0" defaultConfig { minSdkVersion 10 targetSdkVersion 17 } signingConfigs { release { } } buildTypes { debug { runProguard false } alphaRelease { runProguard false zipAlign true signingConfig signingConfigs.release } release { runProguard true proguardFile 'proguard-project.txt' signingConfig signingConfigs.release } } productFlavors { testenv {} prodenv {} } sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] res.srcDirs = ['res'] assets.srcDirs = ['assets'] aidl.srcDirs = ['src'] } testenv {} prodenv {} } android.sourceSets.testenv { res.srcDirs = ['res_test'] } android.sourceSets.prodenv { res.srcDirs = ['res_prod'] } } if (project.hasProperty('storeFile') && project.hasProperty('storePassword') && project.hasProperty('keyAlias') && project.hasProperty('keyPassword')) { android.signingConfigs.release.storeFile = file(storeFile) android.signingConfigs.release.storePassword = storePassword android.signingConfigs.release.keyAlias = keyAlias android.signingConfigs.release.keyPassword = keyPassword } 

И build.gradle для каждого из проектов библиотеки:

 buildscript { repositories { mavenCentral() } dependencies { classpath 'com.android.tools.build:gradle:0.5.+' } } apply plugin: 'android-library' dependencies { compile 'com.android.support:support-v4:13.0.0' } android { compileSdkVersion 17 buildToolsVersion "17.0.0" defaultConfig { minSdkVersion 10 targetSdkVersion 17 } sourceSets { main { manifest.srcFile 'AndroidManifest.xml' java.srcDirs = ['src'] resources.srcDirs = ['src'] res.srcDirs = ['res'] } } } 

Прикрепленный stacktrace:

Org.gradle.api.tasks.TaskExecutionException: Выполнение выполнено для задачи ': compileTestenvDebug'. На org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions (ExecuteActionsTaskExecuter.java:69) в org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute (ExecuteActionsTaskExecuter.java:46) на org.gradle .api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute (PostExecutionAnalysisTaskExecuter.java:35) на org.gradle.api.internal.changedetection.state.CacheLockReleasingTaskExecuter $ 1.run (CacheLockReleasingTaskExecuter.java:35) на org.gradle.internal. Заводы $ 1.create (Factories.java:22) в org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation (DefaultCacheAccess.java:179) в org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation (DefaultCacheAccess.java:232) в Org.gradle.cache.internal.DefaultPersistentDirectoryStore.longRunningOperation (DefaultPersistentDirectoryStore.java:142) в org.gradle.api.internal.changedetection.state.DefaultTaskArtifactStateCacheAccess.longRunningOperation (DefaultTaskArtifactState CacheAccess.java:83) в org.gradle.api.internal.changedetection.state.CacheLockReleasingTaskExecuter.execute (CacheLockReleasingTaskExecuter.java:33) в org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute (SkipUpToDateTaskExecuter.java: 58) в org.gradle.api.internal.tasks.execution.ContextualisingTaskExecuter.execute (ContextualisingTaskExecuter.java:34) в org.gradle.api.internal.changedetection.state.CacheLockAcquiringTaskExecuter $ 1.run (CacheLockAcquiringTaskExecuter.java:39) в Org.gradle.internal.Factories $ 1.create (Factories.java:22) в org.gradle.cache.internal.DefaultCacheAccess.useCache (DefaultCacheAccess.java:124) в org.gradle.cache.internal.DefaultCacheAccess.useCache (DefaultCacheAccess .java: 112) at org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache (DefaultPersistentDirectoryStore.java:134) на org.gradle.api.internal.changedetection.state.DefaultTaskArtifactStateCacheAccess.useCache (DefaultTaskArtifactStateCacheAccess.java:79) в org. gradle.a Pi.internal.changedetection.state.CacheLockAcquiringTaskExecuter.execute (CacheLockAcquiringTaskExecuter.java:37) в org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute (ValidatingTaskExecuter.java:57) на org.gradle.api.internal. Tasks.execution.SkipEmptySourceFilesTaskExecuter.execute (SkipEmptySourceFilesTaskExecuter.java:41) в org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute (SkipTaskWithNoActionsExecuter.java:51) в org.gradle.api.internal.tasks.execution. SkipOnlyIfTaskExecuter.execute (SkipOnlyIfTaskExecuter.java:52) в org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute (ExecuteAtMostOnceTaskExecuter.java:42) в org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure (AbstractTask.java: 282) в org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.executeTask (DefaultTaskPlanExecutor.java:48) в org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.processTask (DefaultTaskPlanExecutor.java:34) в org .gradle.execution.taskgraph.DefaultTaskPlanExecutor.process (DefaultTaskPlanExecutor.java:27) в org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute (DefaultTaskGraphExecuter.java:89) в org.gradle.execution.SelectedTaskExecutionAction.execute (SelectedTaskExecutionAction.java : 29) at org.gradle.execution.DefaultBuildExecuter.execute (DefaultBuildExecuter.java:61) в org.gradle.execution.DefaultBuildExecuter.access $ 200 (DefaultBuildExecuter.java:23) в org.gradle.execution.DefaultBuildExecuter $ 2.перейдите ( DefaultBuildExecuter.java:67) на org.gradle.api.internal.changedetection.state.TaskCacheLockHandlingBuildExecuter $ 1.run (TaskCacheLockHandlingBuildExecuter.java:31) на org.gradle.internal.Factories $ 1.create (Factories.java:22) в org .gradle.cache.internal.DefaultCacheAccess.useCache (DefaultCacheAccess.java:124) в org.gradle.cache.internal.DefaultCacheAccess.useCache (DefaultCacheAccess.java:112) в org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache (DefaultPersistentD IrectoryStore.java:134) в org.gradle.api.internal.changedetection.state.DefaultTaskArtifactStateCacheAccess.useCache (DefaultTaskArtifactStateCacheAccess.java:79) в org.gradle.api.internal.changedetection.state.TaskCacheLockHandlingBuildExecuter.execute (TaskCacheLockHandlingBuildExecuter.java: 29) в org.gradle.execution.DefaultBuildExecuter.execute (DefaultBuildExecuter.java:61) в org.gradle.execution.DefaultBuildExecuter.access $ 200 (DefaultBuildExecuter.java:23) в org.gradle.execution.DefaultBuildExecuter $ 2.перейдите (DefaultBuildExecuter .java: 67) at org.gradle.execution.DryRunBuildExecutionAction.execute (DryRunBuildExecutionAction.java:32) в org.gradle.execution.DefaultBuildExecuter.execute (DefaultBuildExecuter.java:61) в org.gradle.execution.DefaultBuildExecuter.execute ( DefaultBuildExecuter.java:54) на org.gradle.initialization.DefaultGradleLauncher.doBuildStages (DefaultGradleLauncher.java:166) на org.gradle.initialization.DefaultGradleLauncher.doBuild (DefaultGradleLauncher.java:113 ) На org.gradle.initialization.DefaultGradleLauncher.run (DefaultGradleLauncher.java:81) на org.gradle.launcher.exec.InProcessBuildActionExecuter $ DefaultBuildController.run (InProcessBuildActionExecuter.java:64) на org.gradle.launcher.cli.ExecuteBuildAction. Запустите (ExecuteBuildAction.java:33) в org.gradle.launcher.cli.ExecuteBuildAction.run (ExecuteBuildAction.java:24) в org.gradle.launcher.exec.InProcessBuildActionExecuter.execute (InProcessBuildActionExecuter.java:35) в org.gradle .launcher.exec.InProcessBuildActionExecuter.execute (InProcessBuildActionExecuter.java:26) на org.gradle.launcher.cli.RunBuildAction.run (RunBuildAction.java:50) на org.gradle.api.internal.Actions $ RunnableActionAdapter.execute (Действия .java: 171) at org.gradle.launcher.cli.CommandLineActionFactory $ ParseAndBuildAction.execute (CommandLineActionFactory.java:201) в org.gradle.launcher.cli.CommandLineActionFactory $ ParseAndBuildAction.execute (CommandLineActionFactory.java:174) в org. gradle.launcher.cli.CommandLineActionF Actory $ WithLogging.execute (CommandLineActionFactory.java:170) в org.gradle.launcher.cli.CommandLineActionFactory $ WithLogging.execute (CommandLineActionFactory.java:139) в org.gradle.launcher.cli.ExceptionReportingAction.execute (ExceptionReportingAction.java: 33) в org.gradle.launcher.cli.ExceptionReportingAction.execute (ExceptionReportingAction.java:22) в org.gradle.launcher.Main.doAction (Main.java:48) на org.gradle.launcher.bootstrap.EntryPoint.run (EntryPoint.java:45) в org.gradle.launcher.Main.main (Main.java:39) в org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit (ProcessBootstrap.java:50) в org.gradle.launcher. Bootstrap.ProcessBootstrap.run (ProcessBootstrap.java:32) на org.gradle.launcher.GradleMain.main (GradleMain.java:26) на org.gradle.wrapper.BootstrapMainStarter.start (BootstrapMainStarter.java:33) на org.gradle .wrapper.WrapperExecutor.execute (WrapperExecutor.java:130) на org.gradle.wrapper.GradleWrapperMain.main (GradleWrapperMain.java:48) Вызвано: org.gradle.api.int Ernal.tasks.compile.CompilationFailedException: Ошибка компиляции; См. Вывод ошибки компилятора. На org.gradle.api.internal.tasks.compile.jdk6.Jdk6JavaCompiler.execute (Jdk6JavaCompiler.java:42) на org.gradle.api.internal.tasks.compile.jdk6.Jdk6JavaCompiler.execute (Jdk6JavaCompiler.java:33) На org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.delegateAndHandleErrors (NormalizingJavaCompiler.java:95) на org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute (NormalizingJavaCompiler.java:48) на org.gradle .api.internal.tasks.compile.NormalizingJavaCompiler.execute (NormalizingJavaCompiler.java:34) на org.gradle.api.internal.tasks.compile.DelegatingJavaCompiler.execute (DelegatingJavaCompiler.java:29) на org.gradle.api.internal .tasks.compile.DelegatingJavaCompiler.execute (DelegatingJavaCompiler.java:20) на org.gradle.api.internal.tasks.compile.IncrementalJavaCompilerSupport.execute (IncrementalJavaCompilerSupport.java:33) на org.gradle.api.internal.tasks.compile .IncrementalJavaCompilerSupport.execute (IncrementalJavaCompilerSupport.java:24) в org.gradle.api.tasks. Compile.Compile.compile (Compile.java:68) на org.gradle.api.internal.BeanDynamicObject $ MetaClassAdapter.invokeMethod (BeanDynamicObject.java:216) на org.gradle.api.internal.BeanDynamicObject.invokeMethod (BeanDynamicObject.java: 122) на org.gradle.api.internal.CompositeDynamicObject.invokeMethod (CompositeDynamicObject.java:147) на org.gradle.api.tasks.compile.JavaCompile_Decorated.invokeMethod (Неизвестный источник) на org.gradle.util.ReflectionUtil.invoke ( ReflectionUtil.groovy: 23) at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory $ StandardTaskAction.doExecute (AnnotationProcessingTaskFactory.java:217) на org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory $ StandardTaskAction.execute ( AnnotationProcessingTaskFactory.java:210) at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory $ StandardTaskAction.execute (AnnotationProcessingTaskFactory.java:199) в org.gradle.api.internal.AbstractTask $ TaskActionWrapper.execute (AbstractTask .java: 526) at org.gradle.api.internal.AbstractTask $ TaskActionWrapper.execute (AbstractTask.java:509) в org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction (ExecuteActionsTaskExecuter.java:80) в Org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions (ExecuteActionsTaskExecuter.java:61) … еще 70

Это зафиксировано в 0.5.4, которое доступно сейчас.

У меня есть теория, но я могу ошибаться.

Глядя на руководство пользователя, я не вижу упоминания о добавлении пользовательских исходных наборов напрямую. Это может означать, что система сборки не обнаруживает изменений в исходных наборах, таких как testenv если это не часть вкуса или типа buildType.

Я бы попытался определить вашу среду как группу вкуса. Не уверен в ваших конкретных требованиях, но может выглядеть примерно так:

 flavorGroups "environment", "flavors" productFlavors { testenv { flavorGroup "environment" } prodenv { flavorGroup "environment" } flavorA { flavorGroup "flavors" ... } flavorB { flavorGroup "flavors" ... } 

Это предполагает, что вам нужна сборка, которая может состоять из этих двух, например app-flavor1-testenv-debug.apk . Но я подумал, что не проверял.

Кроме того, предложение, если вы получите эту работу, я бы рекомендовал перейти на новый макет. Таким образом, вы можете положиться на соглашения src/main/res с src/testenv/res и src/debug/res если они существуют, даже не говоря уже о них в build.gradle .