我非常无辜地转而使用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,以满足我的应用图标自定义需求。这个问题仍然存在,所以至少这不是产品风味特定的。
答案 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中更仔细地研究源集和项目结构也可能有所帮助。