2013-07-16 18 views
6

Mam migrowany mój projekt, aby używać Gradle (używając starej struktury projektu Android). Niedawno uaktualniłem system Android Studio do wersji v0.2, co zmusiło mnie do użycia wtyczki gradle androida v0.5. Jestem w stanie zbudować mój projekt przy użyciu dowolnego z podanych przeze mnie smaków, albo w debugowaniu/wydaniu.Druga kompilacja Gradle kończy się niepowodzeniem po zmodyfikowaniu styles.xml

Coś idzie nie tak dla mnie za pomocą następującego scenariusza:

  • Execute gradlew czysty
  • Execute gradlew assembleTestenvDebug
  • wyjście Gradle w tym momencie:

BUILD SUCCESSFUL

  • Modyfikuj an y wartość w pliku styles.xml
  • Execute gradlew assembleTestenvDebug (znowu)
  • wyjście Gradle w tym momencie:

/Users/myuser/Project/src/com/namespace/project/views/SomeCustomView.java:60: error: cannot find symbol mSize = arr.getInt(R.styleable.SomeCustomView_some_custom_styleable, 0);

Gradle teraz narzeka na każdym niestandardowym atrybut xml I zadeklarowały w attrs.xml . To doprowadza mnie do szału, ponieważ muszę oczyścić & odbudować mój projekt za każdym razem, gdy modyfikuję style.xml

PROSZĘ, pomóż mi.

Dzięki!

Moja struktura projektu:

- 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 w projekcie reż:

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 
} 

i build.gradle plik dla każdego z projektów bibliotecznych:

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'] 
     } 
    } 
} 

Dołączone StackTrace :

org.gradle.api.tasks.TaskExecutionException: Execution failed for task ':compileTestenvDebug'. at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46) at org.gradle.api.internal.tasks.execution.PostExecutionAnalysisTaskExecuter.execute(PostExecutionAnalysisTaskExecuter.java:35) at org.gradle.api.internal.changedetection.state.CacheLockReleasingTaskExecuter$1.run(CacheLockReleasingTaskExecuter.java:35) at org.gradle.internal.Factories$1.create(Factories.java:22) at org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation(DefaultCacheAccess.java:179) at org.gradle.cache.internal.DefaultCacheAccess.longRunningOperation(DefaultCacheAccess.java:232) at org.gradle.cache.internal.DefaultPersistentDirectoryStore.longRunningOperation(DefaultPersistentDirectoryStore.java:142) at org.gradle.api.internal.changedetection.state.DefaultTaskArtifactStateCacheAccess.longRunningOperation(DefaultTaskArtifactStateCacheAccess.java:83) at org.gradle.api.internal.changedetection.state.CacheLockReleasingTaskExecuter.execute(CacheLockReleasingTaskExecuter.java:33) at org.gradle.api.internal.tasks.execution.SkipUpToDateTaskExecuter.execute(SkipUpToDateTaskExecuter.java:58) at org.gradle.api.internal.tasks.execution.ContextualisingTaskExecuter.execute(ContextualisingTaskExecuter.java:34) at org.gradle.api.internal.changedetection.state.CacheLockAcquiringTaskExecuter$1.run(CacheLockAcquiringTaskExecuter.java:39) at org.gradle.internal.Factories$1.create(Factories.java:22) at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:124) at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:112) at org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache(DefaultPersistentDirectoryStore.java:134) at org.gradle.api.internal.changedetection.state.DefaultTaskArtifactStateCacheAccess.useCache(DefaultTaskArtifactStateCacheAccess.java:79) at org.gradle.api.internal.changedetection.state.CacheLockAcquiringTaskExecuter.execute(CacheLockAcquiringTaskExecuter.java:37) at org.gradle.api.internal.tasks.execution.ValidatingTaskExecuter.execute(ValidatingTaskExecuter.java:57) at org.gradle.api.internal.tasks.execution.SkipEmptySourceFilesTaskExecuter.execute(SkipEmptySourceFilesTaskExecuter.java:41) at org.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:51) at org.gradle.api.internal.tasks.execution.SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:52) at org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:42) at org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java:282) at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.executeTask(DefaultTaskPlanExecutor.java:48) at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.processTask(DefaultTaskPlanExecutor.java:34) at org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:27) at org.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:89) at org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:29) at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61) at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23) at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:67) at org.gradle.api.internal.changedetection.state.TaskCacheLockHandlingBuildExecuter$1.run(TaskCacheLockHandlingBuildExecuter.java:31) at org.gradle.internal.Factories$1.create(Factories.java:22) at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:124) at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:112) at org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache(DefaultPersistentDirectoryStore.java:134) at org.gradle.api.internal.changedetection.state.DefaultTaskArtifactStateCacheAccess.useCache(DefaultTaskArtifactStateCacheAccess.java:79) at org.gradle.api.internal.changedetection.state.TaskCacheLockHandlingBuildExecuter.execute(TaskCacheLockHandlingBuildExecuter.java:29) at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61) at org.gradle.execution.DefaultBuildExecuter.access$200(DefaultBuildExecuter.java:23) at org.gradle.execution.DefaultBuildExecuter$2.proceed(DefaultBuildExecuter.java:67) at org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java:32) at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61) at org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:54) at org.gradle.initialization.DefaultGradleLauncher.doBuildStages(DefaultGradleLauncher.java:166) at org.gradle.initialization.DefaultGradleLauncher.doBuild(DefaultGradleLauncher.java:113) at org.gradle.initialization.DefaultGradleLauncher.run(DefaultGradleLauncher.java:81) at org.gradle.launcher.exec.InProcessBuildActionExecuter$DefaultBuildController.run(InProcessBuildActionExecuter.java:64) at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:33) at org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:24) at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:35) at org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26) at org.gradle.launcher.cli.RunBuildAction.run(RunBuildAction.java:50) at org.gradle.api.internal.Actions$RunnableActionAdapter.execute(Actions.java:171) at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:201) at org.gradle.launcher.cli.CommandLineActionFactory$ParseAndBuildAction.execute(CommandLineActionFactory.java:174) at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:170) at org.gradle.launcher.cli.CommandLineActionFactory$WithLogging.execute(CommandLineActionFactory.java:139) at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33) at org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22) at org.gradle.launcher.Main.doAction(Main.java:48) at org.gradle.launcher.bootstrap.EntryPoint.run(EntryPoint.java:45) at org.gradle.launcher.Main.main(Main.java:39) at org.gradle.launcher.bootstrap.ProcessBootstrap.runNoExit(ProcessBootstrap.java:50) at org.gradle.launcher.bootstrap.ProcessBootstrap.run(ProcessBootstrap.java:32) at org.gradle.launcher.GradleMain.main(GradleMain.java:26) at org.gradle.wrapper.BootstrapMainStarter.start(BootstrapMainStarter.java:33) at org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:130) at org.gradle.wrapper.GradleWrapperMain.main(GradleWrapperMain.java:48) Caused by: org.gradle.api.internal.tasks.compile.CompilationFailedException: Compilation failed; see the compiler error output for details. at org.gradle.api.internal.tasks.compile.jdk6.Jdk6JavaCompiler.execute(Jdk6JavaCompiler.java:42) at org.gradle.api.internal.tasks.compile.jdk6.Jdk6JavaCompiler.execute(Jdk6JavaCompiler.java:33) at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.delegateAndHandleErrors(NormalizingJavaCompiler.java:95) at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:48) at org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.execute(NormalizingJavaCompiler.java:34) at org.gradle.api.internal.tasks.compile.DelegatingJavaCompiler.execute(DelegatingJavaCompiler.java:29) at org.gradle.api.internal.tasks.compile.DelegatingJavaCompiler.execute(DelegatingJavaCompiler.java:20) at org.gradle.api.internal.tasks.compile.IncrementalJavaCompilerSupport.execute(IncrementalJavaCompilerSupport.java:33) at org.gradle.api.internal.tasks.compile.IncrementalJavaCompilerSupport.execute(IncrementalJavaCompilerSupport.java:24) at org.gradle.api.tasks.compile.Compile.compile(Compile.java:68) at org.gradle.api.internal.BeanDynamicObject$MetaClassAdapter.invokeMethod(BeanDynamicObject.java:216) at org.gradle.api.internal.BeanDynamicObject.invokeMethod(BeanDynamicObject.java:122) at org.gradle.api.internal.CompositeDynamicObject.invokeMethod(CompositeDynamicObject.java:147) at org.gradle.api.tasks.compile.JavaCompile_Decorated.invokeMethod(Unknown Source) at org.gradle.util.ReflectionUtil.invoke(ReflectionUtil.groovy:23) at org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:217) at 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) at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:526) at org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:509) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java:80) at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61) ... 70 more

+0

czy modyfikujesz 'style.xml' w' res', czy też w innym folderze jak 'res_flavor1'? – Joe

+0

@Joe - Modyfikuję res/values ​​/ styles.xml z głównego katalogu projektu, a nie jakikolwiek smak. – woot

Odpowiedz

2

Naprawiono to w wersji 0.5.4, która jest już dostępna.

+0

Rzeczywiście tak. Dzięki =) – woot

+0

Problem: http://code.google.com/p/android/issues/detail?id=57569 – woot

2

Mam teorię, ale mogę się mylić.

Patrząc na user guide, nie widzę żadnej wzmianki o dodawaniu niestandardowych zestawów źródłowych bezpośrednio. Może to oznaczać, że system kompilacji nie wykrywa zmian w zestawach źródłowych, takich jak testenv, chyba że jest to część składnika smakowego lub typu buildType.

Chciałbym zdefiniować twoje środowisko jako grupę smakową. Nie jestem pewien specyficznych wymagań, ale może to wyglądać mniej więcej tak:

flavorGroups "environment", "flavors" 
productFlavors { 
    testenv { 
     flavorGroup "environment" 
    } 

    prodenv { 
     flavorGroup "environment" 
    } 

    flavorA { 
     flavorGroup "flavors" 
     ... 
    } 

    flavorB { 
     flavorGroup "flavors" 
     ... 
    } 

to zakładając, trzeba budować, który może być złożony z tych dwóch, tak jak app-flavor1-testenv-debug.apk. Tylko myśl, nie testowałem tego.

Sugerujemy także, że jeśli to działa, polecam migrację do nowego układu. W ten sposób można polegać na konwencjach łączenia się z src/testenv/res i src/testenv/res z src/testenv/res i src/debug/res, jeśli istnieją, nawet bez konieczności ich wymieniania w build.gradle.

+0

również, proszę przejrzeć to: http://stackoverflow.com/questions/16737006/using-build-flavors-structuring-source-folders-and-build-gradle-corly – woot

+0

ah, mam to. Tak, zastanawiałem się nad wszystkimi smakami :-). Używamy 4 w naszym projekcie, razem z kluczem API, który różni się dla budowanych sygnatur z sygnaturami, tak jak w przypadku debugowania, więc bardzo skorzystaliśmy na nowym layoucie. – Joe

+3

Powiedział, że nie jestem pewien, jak są zaimplementowane smaki, ale domyślna wartość 'testenv.srcDirs' może zawierać' sourceSets.main.java.srcDirs', która zostanie nadpisana, jeśli jest ustawiona tylko na '['res_test'] '. Wypróbuj go za pomocą 'res.srcDirs + = 'res_test''. – Joe

Powiązane problemy