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
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. –