每个构建变体有两个res目录,Gradle停止跟踪资源文件中的更改

时间:2014-01-07 14:44:14

标签: android gradle android-gradle

我非常无辜地转而使用different app icons for each product flavour沿着这些方向:

sourceSets.production {
    res.srcDirs = ['res', 'res-production']
}

sourceSets.beta {
    res.srcDirs = ['res', 'res-beta']
}

sourceSets.internal {
    res.srcDirs = ['res', 'res-internal']
}

之后, Gradle停止注意到任何布局文件中的更改,例如res/layout/activity_faq.xml每次需要一个干净的构建,如果我希望我的XML更改包含在APK中。

我首先认为这是一个Android Studio问题,但实际上我可以在命令行上使用纯Gradle重现它,只需查看build/res/all/internal/debug/layout下显示的文件。

当我运行./gradlew assembleInternalDebug时,它输出:

:compileInternalDebugNdk UP-TO-DATE
:preBuild UP-TO-DATE
:preInternalDebugBuild UP-TO-DATE
:prepareInternalDebugDependencies
:compileInternalDebugAidl UP-TO-DATE
:compileInternalDebugRenderscript UP-TO-DATE
:generateInternalDebugBuildConfig UP-TO-DATE
:mergeInternalDebugAssets UP-TO-DATE
:mergeInternalDebugResources
:processInternalDebugManifest UP-TO-DATE
:processInternalDebugResources UP-TO-DATE
:generateInternalDebugSources UP-TO-DATE
:compileInternalDebugJava UP-TO-DATE
:preDexInternalDebug UP-TO-DATE
:dexInternalDebug UP-TO-DATE
:processInternalDebugJavaRes UP-TO-DATE
:validateDebugSigning
:packageInternalDebug UP-TO-DATE
:assembleInternalDebug UP-TO-DATE

BUILD SUCCESSFUL

此处,processInternalDebugResources显示为UP-TO-DATE,而我认为当资源文件发生更改时,。在逐个图标更改之前,在类似的Gradle输出中,processInternalDebugResources 显示为最新。

问题是,有什么方法可以解决这个问题,还是我偶然发现了Android Gradle插件中的错误?

我的build.gradle

buildscript {
    repositories {
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:0.7.3'
    }
}
apply plugin: 'android'

repositories {
    mavenCentral()
}
dependencies {
    compile 'com.google.code.gson:gson:2.2.4'
    compile 'com.google.guava:guava:15.0'
    compile 'com.netflix.rxjava:rxjava-core:0.14.2'
    compile 'com.netflix.rxjava:rxjava-android:0.14.2'
    compile 'com.squareup.okhttp:okhttp:1.2.1'

    compile 'com.android.support:support-v4:13.0.0'
    compile 'com.android.support:support-v13:13.0.0'
}

android {
    compileSdkVersion 19
    buildToolsVersion "19"

    defaultConfig {
        minSdkVersion 14
        targetSdkVersion 19
    }

    productFlavors {
        production {
            packageName "fi.company.app"
        }
        beta {
            packageName "fi.company.app.beta"
        }
        internal {
            packageName "fi.company.app.internal"
        }
    }

    sourceSets {
        main {
            manifest.srcFile 'AndroidManifest.xml'
            java.srcDirs = ['src']
            resources.srcDirs = ['src']
            aidl.srcDirs = ['src']
            renderscript.srcDirs = ['src']
            res.srcDirs = ['res']
            assets.srcDirs = ['assets']
        }

        // Move the tests to tests/java, tests/res, etc...
        instrumentTest.setRoot('tests')

        debug.setRoot('build-types/debug')
        release.setRoot('build-types/release')
    }

    // Custom res directories for different flavors; used for 
    // setting different app icon.

    sourceSets.production {
        res.srcDirs = ['res', 'res-production']
    }

    sourceSets.beta {
        res.srcDirs = ['res', 'res-beta']
    }

    sourceSets.internal {
        res.srcDirs = ['res', 'res-internal']
    }

    signingConfigs {
        release {
            // ...
        }
    }
    buildTypes {
        release {
            signingConfig signingConfigs.release
            // ...
        }
    }
}

Gradle 1.9; Android Gradle插件0.7.3。

修改:出于其他原因,我将产品口味改为custom build types,以满足我的应用图标自定义需求。这个问题仍然存在,所以至少这不是产品风味特定的。

1 个答案:

答案 0 :(得分:4)

好的,修好了。事实证明,这是我build.gradle中的一个小问题。

有什么帮助我尝试升级到Gradle插件0.9.0,之后我开始收到这样的错误:

* What went wrong:
A problem occurred configuring root project 'MyProject'.
> SourceSets 'debug' and 'main' use the same file/folder for 'res': /path/to/MyProject/res

好吧,我只是尝试从主要的sourceSets中删除res.srcDirs = ['res'] ,就是这样。

sourceSets {
    main {
        manifest.srcFile 'AndroidManifest.xml'
        java.srcDirs = ['src']
        resources.srcDirs = ['src']
        aidl.srcDirs = ['src']
        renderscript.srcDirs = ['src']
        // res.srcDirs = ['res']
        assets.srcDirs = ['assets']
    }
    // ...
}

我保留了其他源设置定义不变(res.srcDirs = ['res', 'res-beta'] sourceSets.beta等等。)

一切都有效:构建类型(或产品风味)特定的自定义图标正在使用中,Gradle再次正确地注意到增量构建中对资源文件(例如布局)的更改!

(我通过使用我更改的build.gradle测试Gradle插件版本0.8.1,0.9.0和0.9.3来验证问题确实在我的配置中。确实,插件中的更改是不是解决了这个问题,即使0.9.0是开始给我有用的错误信息的版本。)

这里的根本原因可能是使用"旧的项目结构"和最初由Eclipse生成的build.gradle。无论如何,在User Guide中更仔细地研究源集和项目结构也可能有所帮助。