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

Jon*_*nik 6 android gradle android-gradle-plugin

我非常无辜地转而使用不同的应用程序图标来表示每种产品的味道:

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

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

sourceSets.internal {
    res.srcDirs = ['res', 'res-internal']
}
Run Code Online (Sandbox Code Playgroud)

事情是,在这之后,摇篮停止注意到任何布局文件的变化,比如res/layout/activity_faq.xml,和需要一个干净的构建每次,如果我想包括在APK我的XML的变化.

我首先想到这是一个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
Run Code Online (Sandbox Code Playgroud)

在这里,processInternalDebugResources被证明是UP-TO-DATE,虽然我觉得应该不会是,当有改变资源文件.图标每味改变之前,类似的摇篮输出,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
            // ...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

Gradle 1.9; Android Gradle插件0.7.3.

编辑:出于其他原因,我从产品风格切换到自定义构建类型,以满足我的应用程序图标自定义需求.这个问题仍然存在,因此至少这不是特定产品风味.

Jon*_*nik 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
Run Code Online (Sandbox Code Playgroud)

好吧,我只是尝试从主 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']
    }
    // ...
}
Run Code Online (Sandbox Code Playgroud)

我保留了其余的 sourceSets 定义不变(res.srcDirs = ['res', 'res-beta']对于sourceSets.beta等)。

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

(我通过使用 Gradle 插件版本 0.8.1、0.9.0 和 0.9.3 进行测试,验证了问题确实出在我的配置中build.gradle。事实上,插件中的更改并没有解决这个问题,即使 0.9.0 是开始给我提供有用的错误消息的版本。)

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