【问题标题】:Gradle second build fails after modifying styles.xml修改styles.xml后Gradle第二次构建失败
【发布时间】:2013-07-14 07:26:13
【问题描述】:

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

使用以下场景对我来说出了点问题:

  • 执行 gradlew clean
  • 执行 gradlew assembleTestenvDebug
  • 此时 Gradle 输出:

构建成功

  • 修改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.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.CacheLockReleeasingTaskExecuter$1.run(CacheLockReleeasingTaskExecuter.java:35) 在 org.gradle.internal.Factories$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(DefaultTaskArtifactStateCacheAccess.java:83) 在 org.gradle.api.internal.changedetection.state.CacheLockReleeasingTaskExecuter.execute(CacheLockReleeasingTaskExecuter.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) 在 org.gradle.cache.internal.DefaultPersistentDirectoryStore.useCache(DefaultPersistentDirectoryStore.java:134) 在 org.gradle.api.internal.changedetection.state.DefaultTaskArtifactStateCacheAccess.useCache(DefaultTaskArtifactStateCacheAccess.java:79) 在 org.gradle.api.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) 在 org.gradle.execution.DefaultBuildExecuter.execute(DefaultBuildExecuter.java:61) 在 org.gradle.execution.DefaultBuildExecuter.access $200(DefaultBuildExecuter.java:23) 在 org.gradle.execution.DefaultBuildExecuter$2.proceed(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(DefaultPersistentDirectoryStore.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.proceed(DefaultBuildExecuter.java:67) 在 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.run(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(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) 在 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.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.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) 在 org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.doExecute(AnnotationProcessingTaskFactory.java:217) 在 org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:210) 在 org.gradle.api.internal.project.taskfactory.AnnotationProcessingTaskFactory$StandardTaskAction.execute(AnnotationProcessingTaskFactory.java:199) 在 org.gradle.api.internal.AbstractTask$TaskActionWrapper.execute(AbstractTask.java:526) 在 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 更多

【问题讨论】:

  • 您是在修改res 中的style.xml,还是像res_flavor1 这样的其他文件夹?
  • @Joe - 我正在从主项目目录修改 res/values/styles.xml,而不是任何风格。

标签: android gradle android-studio


【解决方案1】:

这已在 0.5.4 中修复,现在可用。

【讨论】:

  • 确实如此。谢谢=)
【解决方案2】:

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

看着user guide我不 请参阅直接添加自定义源集的任何提及。这可能意味着 构建系统不会检测到诸如 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/ressrc/testenv/ressrc/debug/res 合并的约定(如果存在),甚至不必在 build.gradle 中提及它们。

【讨论】:

  • 啊,明白了。是的,我想知道所有的口味:-)。我们在项目中使用 4,以及用于发布签名构建的 API 密钥与用于调试的不同,因此我们从新布局中受益匪浅。
  • 也就是说,我不确定风味是如何实现的,但testenv.srcDirs 的默认值可能包括sourceSets.main.java.srcDirs,如果它设置为仅['res_test'],它将被覆盖。试试res.srcDirs += 'res_test'
猜你喜欢
  • 2015-09-29
  • 1970-01-01
  • 2022-08-20
  • 1970-01-01
  • 2015-04-11
  • 2015-08-22
  • 2014-03-30
相关资源
最近更新 更多