5

Mam problem z migracją projektu IntelliJ IDEA do systemu Android Studio przy użyciu kompilacji gradle. Skonfigurowałem bibliotekę AndroidAnnotations, tak jak zalecano w różnych innych postach, i działa dobrze. Jednak podczas kompilowania mojego projektu wiele razy bez wykonywania zadania :clean pomiędzy, otrzymuję następujące komunikaty o błędach:Gradle + AndroidAnnotations generuje duplikaty błędów klas - należy wyczyścić projekt przed każdym kompilacji

/project-dir/build/source/apt_generated/flavor1/release/com/example/app/MyActivity_.java:15: error: duplicate class: com.example.app.MyActivity_ 

[more errors here...] 

Uważam, że wielokrotne buduje w serii nie dlatego AndroidAnnotations ponownie tworzy *_.java plików zawsze przed :compile zadań (bez sprawdzania, czy jest to konieczne, czy nie) i zadanie :compile rozpoznaje nowe pliki (np. używając znacznika czasu), ale już znajduje je jako wstępnie skompilowane pliki *.class, powodując w ten sposób błąd. czy to możliwe? Jak mogę zapobiec temu zachowaniu? Czy mogę dodać sprawdzenie konieczności dla AndroidAnnotations? Czy to jakiś inny problem?


UPDATE 1: Wydaje się, że błąd został wyrzucony z samego AndroidAnnotations, ponieważ :compile prac kiedy usunąć *.java plików wewnątrz folderu apt_generated ręcznie.


UPDATE 2:

usunąłem następujący wiersz z mojego build.gradle:

// Automatically add the generated source code to the source set 
android.sourceSets[getSourceSetName(variant)].java.srcDirs += aptOutput 

ja nie wiem dokładnie, dlaczego to działa bez tej linii. Ponieważ nie dodałem folderu przy użyciu aplikacji Android Studio: Mark Directory as > Sources Root. Prawdopodobnie jest to wynik buforowania? A może gradle w jakiś sposób automatycznie doda moje wygenerowane pliki java do ścieżki klas?

Byłbym wdzięczny za wszelkie uwagi.


UPDATE 3/ROZWIĄZANIE

Po usunięciu linii i synchronizacji Gradle plik budować z Android Studio, kod wygenerowany automatycznie źródło zostało usunięte jako źródło korzenia, powodując IDE pokazać błędy brakujące klasy.

końcu znalazłem rozwiązanie w kwestiach Android Adnotacje GitHub: https://github.com/excilys/androidannotations/issues/676

I ponownie dodany oświadczenie o dodanie go do zbiorów źródłowych (pozwalających Android Studio, aby pokazać je jako root źródło). Ponadto usunąłem pliki z kolekcji źródłowej warianty korzystając w ten sposób:

variant.javaCompile.source = variant.javaCompile.source.filter { p -> 
    return !p.getPath().startsWith(aptOutputDir.getPath()) 
} 

Teraz wygenerowane pliki są rozpoznawane, a duplikat błędu klasa znika.

poważaniem, David

Oto moja ostateczna build.gradle.Mam nadzieję, że to pomoże niektórzy z was:

buildscript { 
    repositories { 
     mavenCentral() 
    } 

    dependencies { 
     classpath 'com.android.tools.build:gradle:0.5.+' 
    } 
} 

apply plugin: 'android' 

repositories { 
    mavenCentral() 
} 

configurations { 
    // This is the annotations processor dependency configuration. 
    apt 
} 

def getSourceSetName(variant) { 
    return new File(variant.dirName).getName(); 
} 

android { 
    compileSdkVersion 18 

    defaultConfig { 
     versionCode 10 
     versionName "1.0.2" 
     targetSdkVersion 17 
     minSdkVersion 10 
    } 

    buildToolsVersion "18.0.1" 

    buildTypes { 
     release { 
      zipAlign true 
     } 
    } 

    productFlavors { 
     flavor1 {} 
     flavor2 {} 
    } 

    // This has to go after the productFlavors command (otherwise moving the flavor source set root fails). 
    sourceSets { 
     main { 
      manifest.srcFile 'AndroidManifest.xml' 
      java.srcDirs = ['src'] 
      resources.srcDirs = ['src'] 
      aidl.srcDirs = ['src'] 
      renderscript.srcDirs = ['src'] 
      res.srcDirs = ['res'] 
      assets.srcDirs = ['assets'] 
     } 

     // We move the root of our flavors to support our legacy structure. 
     flavor1.setRoot('flavors/flavor1') 
     flavor2.setRoot('flavors/flavor2') 
    } 

    applicationVariants.all { variant -> 
     def aptOutputDir = project.file("${project.buildDir}/source/apt_generated") 
     def aptOutput = new File(aptOutputDir, variant.dirName) 

     println "****************************" 
     println "variant: ${variant.name}" 
     println "manifest: ${variant.processResources.manifestFile}" 
     println "aptOutput: ${aptOutput}" 
     println "****************************" 

     android.sourceSets[getSourceSetName(variant)].java.srcDirs+= aptOutput.getPath() 

     variant.javaCompile.doFirst { 
      println "*** Running AndroidAnnotations for ${variant.name}" 
      aptOutput.mkdirs() 


      variant.javaCompile.options.compilerArgs += [ 
        '-processorpath', configurations.apt.getAsPath(), 
        '-AandroidManifestFile=' + variant.processResources.manifestFile, 
        '-s', aptOutput 
      ] 
     } 

     variant.javaCompile.source = variant.javaCompile.source.filter { p -> 
      return !p.getPath().startsWith(aptOutputDir.getPath()) 
     } 
} 

dependencies { 
    // Android-Annotations 
    apt 'com.googlecode.androidannotations:androidannotations:2.7.1' 
    compile 'com.googlecode.androidannotations:androidannotations-api:2.7.1' 

    // Include libraries only in flavor1 
    flavor1Compile fileTree(dir: 'libs', include: '*.jar') 
} 

Oto moje (początkowy) build.gradle (I pozbawiono niezarejestrowanych odpowiednich części):

buildscript { 
    repositories { 
     mavenCentral() 
    } 

    dependencies { 
     classpath 'com.android.tools.build:gradle:0.5.+' 
    } 
} 

apply plugin: 'android' 

repositories { 
    mavenCentral() 
} 

configurations { 
    // This is the annotations processor dependency configuration. 
    apt 
} 

def getSourceSetName(variant) { 
    return new File(variant.dirName).getName(); 
} 

android { 
    compileSdkVersion 18 

    defaultConfig { 
     versionCode 10 
     versionName "1.0.2" 
     targetSdkVersion 17 
     minSdkVersion 10 
    } 

    buildToolsVersion "18.0.1" 

    buildTypes { 
     release { 
      zipAlign true 
     } 
    } 

    productFlavors { 
     flavor1 {} 
    } 

    // This has to go after the productFlavors command (otherwise moving the flavor source set root fails). 
    sourceSets { 
     main { 
      manifest.srcFile 'AndroidManifest.xml' 
      java.srcDirs = ['src'] 
      resources.srcDirs = ['src'] 
      aidl.srcDirs = ['src'] 
      renderscript.srcDirs = ['src'] 
      res.srcDirs = ['res'] 
      assets.srcDirs = ['assets'] 
     } 

     // We move the root of our flavor to support our legacy structure. 
     flavor1.setRoot('flavors/flavor1') 
    } 

    applicationVariants.all { variant -> 
     aptOutput = file("${project.buildDir}/source/apt_generated/${variant.dirName}") 
     println "****************************" 
     println "variant: ${variant.name}" 
     println "manifest: ${variant.processResources.manifestFile}" 
     println "aptOutput: ${aptOutput}" 
     println "****************************" 

     // Automatically add the generated source code to the source set 
     android.sourceSets[getSourceSetName(variant)].java.srcDirs += aptOutput 

     variant.javaCompile.doFirst { 
      println "*** Running AndroidAnnotations for ${variant.name}" 
      aptOutput.mkdirs() 

      variant.javaCompile.options.compilerArgs += [ 
        '-processorpath', configurations.apt.getAsPath(), 
        '-AandroidManifestFile=' + variant.processResources.manifestFile, 
        '-s', aptOutput 
      ] 
     } 
    } 
} 

dependencies { 
    // Android-Annotations 
    apt 'com.googlecode.androidannotations:androidannotations:2.7.1' 
    compile 'com.googlecode.androidannotations:androidannotations-api:2.7.1' 

    // Include libraries only in flavor1 
    flavor1Compile fileTree(dir: 'libs', include: '*.jar') 
} 

Będę wdzięczny za każdą pomoc.

Dzięki David

Odpowiedz

0

końcu znalazłem rozwiązanie w kwestiach GitHub Android Objaśnienia: https://github.com/excilys/androidannotations/issues/676

I ponownie dodany oświadczenie o dodanie go do zbiorów źródłowych (pozwalając Android Studio to pokazać jako źródło root). Ponadto usunąłem pliki z kolekcji źródłowej warianty korzystając w ten sposób:

variant.javaCompile.source = variant.javaCompile.source.filter { p -> 
    return !p.getPath().startsWith(aptOutputDir.getPath()) 
} 

Teraz wygenerowane pliki są rozpoznawane, a duplikat błędu klasa znika.

poważaniem, David

1

Jeśli wyeksportować build.gradle z Eclipse, zawiera .apt_generated w pliku Gradle i nie powinno. Rozwiąż to i te błędy powinny zniknąć.

+0

Dokładnie to, co wydarzyło się w mojej sytuacji. Nawiasem mówiąc, wygenerowane pliki, które należy usunąć, znajdują się w app/src/main/java/your/package/name. –