首页 文章

修改styles.xml后,Gradle第二次构建失败

提问于
浏览
6

我已将我的项目迁移到使用Gradle(使用旧的Android项目结构) . 最近我将Android Studio升级到v0.2,这迫使我使用android gradle插件v0.5 . 我可以使用我定义的任何风格来构建我的项目,无论是在调试/发布上 .

使用以下方案时,我出了点问题:

  • 执行gradlew清理

  • 执行gradlew assembleTestenvDebug

  • 此时Gradle输出:

Build 成功

  • 在styles.xml文件中修改 any

  • 执行gradlew assembleTestenvDebug(再次)

  • 此时Gradle输出:

/Users/myuser/Project/src/com/namespace/project/views/SomeCustomView.java:60:错误:找不到符号mSize = arr.getInt(R.styleable.SomeCustomView_some_custom_styleable,0);

Gradle现在抱怨我在attrs.xml中声明的每个自定义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']
        }
    }
}

附加堆栈跟踪:

org.gradle.api.tasks.TaskExecutionException:任务':compileTestenvDebug'的执行失败 . 在在org.gradle在org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.execute(ExecuteActionsTaskExecuter.java:46)org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:69) .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)at at org.gradle.apdle.apir.api.internal.changedetection.state.DefaultTaskArtifactStateCacheAccess.longRunningOperation(DefaultTaskArtifactState)中的org.gradle.cache.internal.DefaultPersistentDirectoryStore.longRunningOperation(DefaultPersistentDirectoryStore.java:142) 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)atg.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:124)org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess)的.java:112)在org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache(DefaultPersistentDirectoryStore.java:134)在org.gradle.api.internal.changedetection.state.DefaultTaskArtifactStateCacheAccess.useCache(DefaultTaskArtifactStateCacheAccess.java:79)在有机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)atg.gradle.api.internal.tasks.execution.SkipTaskWithNoActionsExecuter.execute(SkipTaskWithNoActionsExecuter.java:51)at org.gradle.api.internal.tasks.execution . 在org.gradle.api.internal.AbstractTask.executeWithoutThrowingTaskFailure(AbstractTask.java)的org.gradle.api.internal.tasks.execution.ExecuteAtMostOnceTaskExecuter.execute(ExecuteAtMostOnceTaskExecuter.java:42)上跳过SkipOnlyIfTaskExecuter.execute(SkipOnlyIfTaskExecuter.java:52): 282)org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.executeTask(DefaultTaskPlanExecutor.java:48)org.gradle.execution.taskgraph.DefaultTaskPlanExecutor.processTask(DefaultTaskPlanExecutor.java:34)at org .gradle.execution.taskgraph.DefaultTaskPlanExecutor.process(DefaultTaskPlanExecutor.java:27)at atorg.gradle.execution.taskgraph.DefaultTaskGraphExecuter.execute(DefaultTaskGraphExecuter.java:89)org.gradle.execution.SelectedTaskExecutionAction.execute(SelectedTaskExecutionAction.java:29)org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java: 61)在在org.gradle.api.internal.changedetection.state org.gradle.execution.DefaultBuildExecuter.access $ 200(DefaultBuildExecuter.java:23)在org.gradle.execution.DefaultBuildExecuter $ 2.proceed(DefaultBuildExecuter.java:67) .taskCacheLockHandlingBuildExecuter $ 1.run(TaskCacheLockHandlingBuildExecuter.java:31)org.gradle.internal.Factories $ 1.create(Factories.java:22)at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:124)at at org.gradle.cache.internal.DefaultCacheAccess.useCache(DefaultCacheAccess.java:112)在org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache(DefaultPersistentDirectoryStore.java:134)在org.gradle.api.internal.changedetection.state . DefaultTaskArtifactStat egacheAccess.useCache(DefaultTaskArtifactStateCacheAccess.java:79)位于org.gradle.execution.DefaultBuildExecuter.exe的org.gradle.api.internal.changedetection.state.TaskCacheLockHandlingBuildExecuter.execute(TaskCacheLockHandlingBuildExecuter.java:29)(DefaultBuildExecuter.java:61) org.gradle.execution.DefaultBuildExecuter.access $ 200(DefaultBuildExecuter.java:23)org.gradle.execution.DefaultBuildExecuter $ 2.proceed(DefaultBuildExecuter.java:67)org.gradle.execution.DryRunBuildExecutionAction.execute(DryRunBuildExecutionAction.java) :32)org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61)atg.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:54)at 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.g radle.launcher.exec.InProcessBuildActionExecuter $ DefaultBuildController.run(InProcessBuildActionExecuter.java:64)org.gradle.launcher.cli.ExecuteBuildAction.run(ExecuteBuildAction.java:33)at org.gradle.launcher.cli.ExecuteBuildAction.run( ExecuteBuildAction.java:24)org.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:35)atg.gradle.launcher.exec.InProcessBuildActionExecuter.execute(InProcessBuildActionExecuter.java:26)atg.gradle.launcher .cli.RunBuildAction.run(RunBuildAction.java:50)org.gradle.api.internal.Actions $ RunnableActionAdapter.execute(Actions.java:171)org.gradle.launcher.cli.CommandLineActionFactory $ ParseAndBuildAction.execute(CommandLineActionFactory) .java:201)org.gradle.launcher.cli.CommandLineActionFactory $ ParseAndBuildAction.execute(CommandLineActionFactory.java:174)org.gradle.launcher.cli.CommandLineActionFactory $ WithLogging.execute(CommandLineActionFactory.java:170)at org . gradle.launcher.cli.Command orA.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:22)中的org.gradle.launcher.cli.ExceptionReportingAction.execute(ExceptionReportingAction.java:33)中的LineActionFactory $ WithLogging.execute(CommandLineActionFactory.java:139) 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.GradleWrapperMain的org.gradle.wrapper.WrapperExecutor.execute(WrapperExecutor.java:130) .main(GradleWrapperMain.java:48)引起:org.gradle.api.internal.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.execute(NormalizingJavaCompiler.java:48)org.gradle.api.internal.tasks.compile.NormalizingJavaCompiler.delegateAndHandleErrors(NormalizingJavaCompiler.java:95)在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 org.gradle.ut中的.tasks.compile.JavaCompile_Decorated.invokeMethod(未知来源) il.ReflectionUtil.invoke(ReflectionUtil.groovy:23)在org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory $ StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:217)在org.gradle.api.internal.project.taskfactory . 在org.gradle.api.internal.AbstractTask $ TaskActionWrapper的org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory $ StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:199)中的AnnotationProcessingTaskFactory $ StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:210) . 在org.gradle.api.internal.AbstractTask $ TaskActionWrapper.execute(AbstractTask.java:509)在org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeAction(ExecuteActionsTaskExecuter.java执行(AbstractTask.java:526): 80)at org.gradle.api.internal.tasks.execution.ExecuteActionsTaskExecuter.executeActions(ExecuteActionsTaskExecuter.java:61)... 70更多

2 回答

  • 2

    这是固定在0.5.4现在可用 .

  • 2

    我有一个理论,但我可能是错的 .

    查看user guide我不会检测源集上的更改,如 testenv ,除非它是flavor或buildType的一部分 .

    我会尝试将您的环境定义为风味组 . 不确定您的具体要求,但它可能看起来像这样:

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

    这假设你需要一个可以由这两个构成的构建,例如 app-flavor1-testenv-debug.apk . 只是想一想,我还没有测试过 .

    另外,一个建议,如果你使这个工作,我会建议迁移到新的布局 . 这样你可以依赖 src/main/ressrc/testenv/ressrc/debug/res 合并的约定(如果它们存在),甚至不必在 build.gradle 中提及它们 .

相关问题