Mit zwei Res-Verzeichnissen pro Build-Variante stoppte Gradle die Verfolgung von Änderungen in Ressourcendateien

Ich, ganz unschuldig, wechselte zu verschiedenen App-Icons für jeden Produkt Geschmack in dieser Richtung:

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

Thing ist, danach hat Gradle aufgehört, Änderungen in allen Layout-Dateien , wie res/layout/activity_faq.xml , zu bemerken und erfordert eine saubere Build jedes Mal , wenn ich möchte, dass meine XML-Änderungen in die APK aufgenommen werden.

Ich dachte zuerst, das war ein Android Studio Problem, aber in der Tat kann ich es mit reiner Gradle reproduzieren, auf der Kommandozeile, einfach auf die Dateien, die unter build/res/all/internal/debug/layout .

Wenn ich laufe ./gradlew assembleInternalDebug , es gibt aus:

 :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 

Hier ist processInternalDebugResources gezeigt UP-TO-DATE , während ich denke, es sollte nicht sein, wenn es geänderte Ressource-Dateien sind. Vor dem Icon-per-Aroma-Wechsel wurde in ähnlicher Gradle-Ausgabe processInternalDebugResources nicht aktuell angezeigt.

Frage ist, irgendeine Weise, dieses zu regeln, oder stolperte ich auf einen Bug im Android-Gradle-Plugin?

Mein 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 Plugin 0.7.3.

Bearbeiten : Aus anderen Gründen wechselte ich von Produkt-Aromen zu benutzerdefinierten Build-Typen für meine App-Symbol Anpassung Bedürfnisse. Dieses Problem bleibt noch, also ist das zumindest nicht geschmacksspezifisch.

  • Ist gradle tools: selector for permissions funktioniert überhaupt?
  • Filtern von Ressourcen aus dem Play Services Monolith, um Ihre APK kleiner zu machen
  • Fehler werden "Gradle Version 1.10 ist erforderlich. Aktuelle Version ist 1.12. "Bei der Ausführung" gradle wrapper "?
  • Android-Projekt zu Cordova-Plugin - R.java nicht gefunden / erstellt
  • Android Gradle bauen resultierende apk enthält sowohl verschleierte und nicht verschleierte Klassen
  • Android gradle Lokaler Pfad existiert nicht
  • Wie kann ich ein gradle-Subprojekt dazu zwingen, das buildToolsVersion / compileSdkVersion des Root-Projekts zu verwenden?
  • Appcompat v7 wird nicht ins Projekt gezogen
  • 2 Solutions collect form web for “Mit zwei Res-Verzeichnissen pro Build-Variante stoppte Gradle die Verfolgung von Änderungen in Ressourcendateien”

    Ok, hat das behoben. Es stellte sich heraus, dass ein kleines Problem in meinem build.gradle .

    Was hat mir geholfen, ein Upgrade auf das Gradle Plugin 0.9.0 zu machen, worauf ich anfing, Fehler wie diese zu bekommen:

     * 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 

    Nun, ich habe einfach versucht , res.srcDirs = ['res'] aus main sourceSets zu entfernen , und das war es.

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

    Ich habe den Rest der SourceSets-Definitionen unberührt res.srcDirs = ['res', 'res-beta'] ( res.srcDirs = ['res', 'res-beta'] für sourceSets.beta und so weiter).

    Alles funktioniert wieder: die Build-Typ (oder Produkt-Aromen) spezifische benutzerdefinierte Symbole sind in Gebrauch, und Gradle noch einmal korrekt bemerkt Änderungen an Ressource-Dateien (zB Layouts) in inkrementellen Builds!

    (Ich habe verifiziert, dass das Problem tatsächlich in meiner config durch Testen mit Gradle Plugin Versionen 0.8.1, 0.9.0 und 0.9.3 mit meinem geänderten build.gradle . In der Tat waren Änderungen im Plugin nicht das, was dies behoben, auch wenn 0.9 .0 war die Version, die mir die nützliche Fehlermeldung gab.)

    Möglicherweise war die Grundursache hier "alte Projektstruktur" und build.gradle , die ursprünglich von Eclipse erzeugt wurde. In jedem Fall könnte das Studium von Quellsätzen und Projektstrukturen sorgfältiger im Benutzerhandbuch auch dazu beigetragen haben.

    Ich habe die mehrere bauen Aromen für die gleiche App mit einigen Änderungen, Icons & Splash-Bildschirme. Jeder Geschmack hat einen eigenen Res-Ordner. Wenn ich die apps baue, jeder apk Größen um 50 mb: (.

    Also habe ich das Problem behoben, indem ich die Datei build.gradle mit dem folgenden aktualisiert habe

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

    In der oben genannten, kommentierte ich resources.srcDirs = ['src'] und hinzugefügt

      `prod { manifest.srcFile 'prod/AndroidManifest.xml' resources.srcDirs = ['src/prod/res'] } dev { manifest.srcFile 'dev/AndroidManifest.xml' resources.srcDirs = ['src/dev/res'] }` 
    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.