5

Tôi gặp sự cố khi di chuyển dự án IntelliJ IDEA của mình sang Android Studio bằng cách sử dụng công cụ xây dựng gradle. Tôi đã thiết lập thư viện AndroidAnnotations như được đề xuất trong nhiều bài đăng khác và nó hoạt động tốt. Tuy nhiên, khi soạn thảo dự án của tôi nhiều lần mà không cần thực hiện các nhiệm vụ :clean ở giữa, tôi nhận được thông báo lỗi sau:Gradle + AndroidAnnotations tạo lỗi lớp trùng lặp - cần dọn dẹp dự án trước mỗi lần tạo

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

[more errors here...] 

Tôi tin rằng nhiều xây dựng trong loạt thất bại vì AndroidAnnotations tạo lại *_.java file luôn trước khi :compile nhiệm vụ (mà không kiểm tra xem nó là cần thiết hay không) và nhiệm vụ :compile nhận ra các tệp mới (ví dụ: sử dụng dấu thời gian) nhưng đã tìm thấy những tệp đó như được biên dịch trước *.class tệp, do đó, ném lỗi. Điều này có thể không? Làm thế nào tôi có thể ngăn chặn hành vi này? Tôi có thể thêm kiểm tra cần thiết cho AndroidAnnotations không? Hay đây là một số vấn đề khác?


UPDATE 1: Dường như các lỗi được ném từ AndroidAnnotations bản thân, vì :compile công trình khi tôi xóa *.java file bên trong thư mục apt_generated bằng tay.


UPDATE 2:

Tôi đã gỡ bỏ dòng sau từ build.gradle tôi:

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

Tôi không biết chính xác lý do tại sao nó hoạt động mà không cần dòng này. Vì tôi không thêm thư mục bằng cách sử dụng Mark Directory as > Sources Root của Android Studio. Có lẽ đây là một số kết quả của bộ nhớ đệm? Hoặc không gradle bằng cách nào đó thêm các tập tin java tạo ra của tôi tự động để classpath?

Tôi sẽ biết ơn bất kỳ nhận xét nào.


CẬP NHẬT 3/SOLUTION

Sau khi loại bỏ dòng và đồng bộ hóa các tập tin build gradle với Android Studio, mã nguồn tự động tạo ra đã được gỡ bỏ như nguồn gốc, gây IDE để hiển thị lỗi của thiếu các lớp.

Cuối cùng, tôi thấy các giải pháp về các vấn đề Android Chú thích github: https://github.com/excilys/androidannotations/issues/676

Tôi đang gia tăng báo cáo kết quả để thêm nó vào bộ nguồn (cho phép Android Studio để hiển thị nó như là người chủ nguồn). Hơn nữa, tôi đã xóa các tệp khỏi bộ sưu tập nguồn biến thể bằng cách sử dụng:

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

Bây giờ các tệp được tạo sẽ được nhận dạng và lỗi lớp trùng lặp sẽ biến mất.

Trân trọng, David

Đây là build.gradle cuối cùng của tôi.Tôi hy vọng điều này sẽ giúp một số bạn:

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

Đây là của tôi (ban đầu) build.gradle (Tôi lột bộ phận không liên quan):

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

tôi sẽ đánh giá cao sự giúp đỡ nào.

Cảm ơn, David

Trả lời

0

Cuối cùng, tôi thấy các giải pháp về các vấn đề github Android Chú thích: https://github.com/excilys/androidannotations/issues/676

Tôi đang gia tăng báo cáo kết quả để thêm nó vào bộ nguồn (cho phép Android Studio để hiển thị nó như là nguồn gốc). Hơn nữa, tôi đã xóa các tệp khỏi bộ sưu tập nguồn biến thể bằng cách sử dụng:

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

Bây giờ các tệp được tạo sẽ được nhận dạng và lỗi lớp trùng lặp sẽ biến mất.

Trân trọng, David

1

Nếu bạn xuất build.gradle từ Eclipse, nó bao gồm .apt_generated trong file gradle và nó không nên. Lấy cái này ra và những lỗi này sẽ biến mất.

+0

Chính xác những gì đã xảy ra trong trường hợp của tôi. Bằng cách này, các tập tin được tạo ra bạn nên loại bỏ là trong app/src/main/java/your/package/name. –

Các vấn đề liên quan