5

我有使用Gradle構建將IntelliJ IDEA項目遷移到Android Studio的問題。我建立了AndroidAnnotations庫,就像其他各種文章中推薦的那樣,並且它工作得很好。但是,多次編譯我的項目時之間沒有執行在:clean任務,我收到以下錯誤消息:Gradle + AndroidAnnotations會生成重複的類錯誤 - 需要在每次構建之前清理項目

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

[more errors here...] 

我相信,多建立在一系列的失敗,因爲AndroidAnnotations前:compile任務總是重新創建*_.java文件(不檢查是否有必要),並且:compile任務識別新文件(例如使用時間戳),但已經將這些文件找到爲預編譯的*.class文件,從而引發錯誤。這可能嗎?我怎樣才能防止這種行爲?我可以添加AndroidAnnotations的必要性檢查嗎?或者這是一些其他問題?


更新1:看來,錯誤是來自AndroidAnnotations本身拋出,因爲:compile作品時,我手動刪除apt_generated文件夾內的文件*.java


更新2:

我刪除從我build.gradle以下行:

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

我完全不知道爲什麼它的工作原理沒有這條線。由於我沒有使用Android Studio的Mark Directory as > Sources Root添加文件夾。可能這是緩存的一些結果?或者不知怎的,gradle會自動將我生成的java文件添加到類路徑中?

儘管如此,我仍然很感激任何意見。


UPDATE 3 /溶液

除去線和同步與Android Studio中gradle這個構建文件後,將自動生成的源代碼中除去作爲源根,使IDE顯示的錯誤缺課。

最後,我發現在Android註解GitHub的問題的解決:https://github.com/excilys/androidannotations/issues/676

我重新添加的語句將它添加到源組(允許Android的工作室將它顯示爲源根)。此外,我使用以下方法刪除變體源集合中的文件:

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

現在生成的文件被識別,重複的類錯誤消失。

最好的問候, 大衛

這是我最後的build.gradle。我希望這有助於一些你:

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') 
} 

這裏是我的(初始)build.gradle(我剝離非相關部分):

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') 
} 

我希望得到任何幫助。

謝謝, 大衛

回答

0

最後,我發現在Android註解GitHub的問題的解決:https://github.com/excilys/androidannotations/issues/676

我重新加入該語句將其添加到源組(允許Android Studio中顯示它作爲源根)。此外,我使用以下方法刪除變體源集合中的文件:

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

現在生成的文件被識別,重複的類錯誤消失。

最好的問候,大衛

1

如果您從Eclipse中導出的build.gradle,它包括.apt_generated在gradle這個文件,它不應該。把它拿出來,這些錯誤應該消失。

+0

在我的情況下究竟發生了什麼。順便說一下,您應該刪除的生成文件位於app/src/main/java/your/package/name中。 –

相關問題