2013-05-22 30 views
10

我想在Android Studio中使用AndroidAnnotations創建一個項目。當我構建並運行該項目時,一切似乎都可以正常編譯,但除了應用程序的空白活動外,我什麼都沒有得到。另外,AndroidAnnotations不會生成任何內容。AndroidAnnotations Nothing Generated,Empty Activity

我已經加入androidannotations-api-2.7.1.jar爲我的項目的依賴,並啓用標註處理與處理器路徑的路徑androidannotations-2.7.1.jar,這是從androidannotations-api-2.7.1.jar一個單獨的文件夾。我已經檢查商店產生的相對於模塊內容根來源,並嘗試了許多不同的目錄的來源 - 從generated,到gen/aa,到(目前)build/source/aa來匹配它似乎已生成的文件在Android的Studio中創建。沒有任何工作。我已將清單中的活動名稱更改爲Activity_,並將該配置設置爲在項目運行時啓動。

唯一的其他依賴我是Android的支持-V4和ActionBarSherlock。我已經嘗試了這兩個禁用,沒有結果。我最初計劃將Roboguice與AndroidAnnotations結合使用,但暫時禁用它以專注於此問題。

我也使用或試圖使用,搖籃。這是目前我build.gradle

buildscript { 
    repositories { 
    maven { url 'http://repo1.maven.org/maven2' } 
    } 
    dependencies { 
    classpath 'com.android.tools.build:gradle:0.4' 
    } 
} 

apply plugin: 'android' 

dependencies { 
    compile files('libs/android-support-v4.jar') 
    compile files('libs/actionbarsherlock-4.3.1.jar') 
    compile files('libs/androidannotations-api-2.7.1.jar') 
} 

android { 
    compileSdkVersion 17 
    buildToolsVersion "17.0.0" 

    defaultConfig { 
    minSdkVersion 7 
    targetSdkVersion 17 
    } 
} 

不過,我還沒有真正想通了搖籃是如何工作的,所以我大多隻是手動添加的依賴關係,你會一個正常的項目,再放入搖籃編譯線,因此項目會正確編譯。我知道這可能不是使用它的正確方法。

我的活動和它的佈局非常標準,我只是複製他們的官方指南開始使用AndroidAnnotations。

更新:所以,我只是回去的Maven與測試的內部版本,我發現了一些奇怪的。看起來,即使我在Maven中設置了它,也沒有任何東西產生。但是,使用Maven構建,我可以運行項目而不將清單中的活動名稱更改爲Activity_,並且項目將編譯並正確運行。這很奇怪,似乎它可能會進一步混淆問題,或者如果它也可以用Gradle指示某些事情,那麼它可以簡化它。

+1

也許這將幫助 - > [鏈接](http://stackoverflow.com/questions/11375953/how-do-you-integrate-the-java-annotation-processor-into-the-java-插件) –

回答

26

這類似於robotoaster的反應,但它在0.4.1工作以及放置在新目錄中生成的Java源文件(與其他產生源文件夾一致),這使得Android的工作室看到源和停止抱怨。它也適用於更多註釋處理器。只需將您的註釋處理器添加到「apt」配置。

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:0.4.1' 
    } 
} 
apply plugin: 'android' 

repositories { 
    mavenCentral() 
} 

ext.daggerVersion = '1.0.0'; 
ext.androidAnnotationsVersion = '2.7.1'; 

configurations { 
    apt 
} 

dependencies { 
    apt "com.googlecode.androidannotations:androidannotations:${androidAnnotationsVersion}" 
    compile "com.googlecode.androidannotations:androidannotations-api:${androidAnnotationsVersion}" 
    apt "com.squareup.dagger:dagger-compiler:${daggerVersion}" 
    compile "com.squareup.dagger:dagger:${daggerVersion}" 
} 

android { 
    compileSdkVersion 17 
    buildToolsVersion "17.0.0" 

    defaultConfig { 
     minSdkVersion 10 
     targetSdkVersion 17 
    } 
} 

android.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 "****************************" 

    variant.javaCompile.doFirst { 
     println "*** compile doFirst ${variant.name}" 
     aptOutput.mkdirs() 
     variant.javaCompile.options.compilerArgs += [ 
       '-processorpath', configurations.apt.getAsPath(), 
       '-AandroidManifestFile=' + variant.processResources.manifestFile, 
       '-s', aptOutput 
     ] 
    } 
} 

UPDATE:這仍然有效編譯,但與Android工作室0.1.1你可以不再與UI 編輯您的項目結構,所以你不能告訴AS看,新中源夾。我想將文件夾添加到sourceSet,但變體似乎實際上並沒有自己的sourceSets,所以我不知道在哪裏放置它

更新2:你可以得到的Android 0.1.1工作室認識到通過建立/源/ apt_generated /在項目瀏覽器調試右鍵單擊並選擇馬克目錄AS-在apt-生成的源文件>源根

更新3:由於gradle這個插件0.5.5的android.applicationVariants.each不工作了。改爲使用android.applicationVariants.all。請參閱更改日誌android.com訪問變體容器不會強制創建任務。 這意味着android。[應用程序|庫|測試]在評估階段,變體將是空的。要使用它,使用的。每個

+0

這是一個很好的解決方案,尤其是因爲它允許多個註釋處理器。我已經改變了這一點,因此被標記爲接受的答案,但是這個和robotoaster的解決方案都很好。感謝所有的幫助。 – NSchock

+1

難道不可能將生成的文件添加到src路徑以及Android Studio中嗎?擺弄項目設置會破壞構建文件的目的...... – botteaap

+0

另外,如果您的gradle構建文件使用'packageNameSuffix'屬性,則需要添加參數'-AresourcePackageName = yourPackage'或者您的R類不會被AA找到處理器(需要最新的AA 3.0) – tbruyelle

4

添加依賴關係不起任何作用。 JavaCompile任務必須通知註釋處理器。這是可能的訪問JavaCompile任務0.3版本:

configurations { 
    compile 
    androidannotations.extendsFrom(compile) 
} 

dependencies { 
    compile 'org.androidannotations:androidannotations-api:3.0-SNAPSHOT' 
    androidannotations 'org.androidannotations:androidannotations:3.0-SNAPSHOT' 
} 

android.buildVariants.each { 
    variant -> 
    variant.javaCompile.options.compilerArgs += [ 
     '-classpath', configurations.compile.asPath, 
     '-processorpath', configurations.androidannotations.asPath, 
     '-processor', 'org.androidannotations.AndroidAnnotationProcessor', 
     '-AandroidManifestFile=' + variant.processResources.manifestFile 
    ] 
} 

對於gradle這個插件0.4起編制任務有不同的方式來追加。在這裏感謝Artiom @ Android Project是整個的build.gradle應該怎麼看起來像

buildscript { 
repositories { 
    maven { url 'http://repo1.maven.org/maven2' } 
} 
dependencies { 
    classpath 'com.android.tools.build:gradle:0.4' 
} 
} 
apply plugin: 'android' 

repositories { 
mavenCentral() 
maven { 
    url 'https://oss.sonatype.org/content/repositories/snapshots/' 
} 
} 

configurations { 
compile 
androidannotations.extendsFrom(compile) 
} 

dependencies { 
compile files('libs/android-support-v4.jar') 
compile 'org.androidannotations:androidannotations-api:3.0-SNAPSHOT' 
androidannotations 'org.androidannotations:androidannotations:3.0-SNAPSHOT' 
} 

android { 
compileSdkVersion 17 
buildToolsVersion "17.0.0" 

defaultConfig { 
    minSdkVersion 7 
    targetSdkVersion 16 
    packageName "org.labaa.aa" 
    testPackageName "org.labaa.aa.test" 
    testInstrumentationRunner "org.labaa.aa.test.Runner" 

} 
} 

afterEvaluate { project -> 
android.applicationVariants.each { variant -> 
    variant.javaCompile.options.compilerArgs += [ 
      '-classpath', configurations.compile.asPath, 
      '-processorpath', configurations.androidannotations.asPath, 
      '-processor', 'org.androidannotations.AndroidAnnotationProcessor', 
      '-AandroidManifestFile=' + variant.processResources.manifestFile 
    ] 
} 
} 

這不會更新Android Studio中的依賴關係。手動添加androidannotations-api。從命令行運行構建 gradle installDebug

從Andoid Studio編譯禁用應用程序啓動時,否則啓動器會抱怨缺少註釋的活動。

+0

它似乎在0.4 android.buildVariants被改爲android.applicationvarariants。使用這個我可以建立項目很好,但我仍然沒有得到任何生成。 – NSchock

+0

是的,請按照http://code.google.com/p/android/issues/detail?id=55764 – robotoaster

+0

啊,是的,謝謝!該代碼工作。 – NSchock

3

。所有這實際上是一個更新,做下面的事情了答案:

  • 作品與Android工作室0.1.9
  • 從IDE刪除語法錯誤(即使在重建)
  • 使用androidannotations而不匕首

爲了實現這一點,我複製的輸出建立/源/ R女巫將保持標記爲源杜環重建。

import groovy.io.FileType 

buildscript { 
} 

apply plugin: 'android' 

repositories { 
    mavenCentral() 
} 

ext.androidAnnotationsVersion = '2.7.1'; 

configurations { 
    apt 
} 

dependencies { 
    apt "com.googlecode.androidannotations:androidannotations:${androidAnnotationsVersion}" 
    compile "com.googlecode.androidannotations:androidannotations-api:${androidAnnotationsVersion}" 
} 

android { 
    compileSdkVersion 17 
    buildToolsVersion "17.0.0" 

    defaultConfig { 
     minSdkVersion 10 
     targetSdkVersion 16 
    } 
} 

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

    variant.javaCompile.doFirst { 
     println "*** compile doFirst ${variant.name}" 
     aptOutput.mkdirs() 

     aptOutput.eachFileRecurse FileType.FILES, { 
      if (it.name.equals('R.java')) { 
       return 
      } 
      it.delete() 
     } 

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

還是蠻哈克改進建議歡迎

編輯了android-容易的方式

最近一包叫做Android的易https://bitbucket.org/hvisser/android-apt/overview是釋放,使事情更容易(版本1.1有支持android註釋需求)

只需更新你的build.gradle就可以了:

buildscript { 
    repositories { 
     mavenCentral() 
    } 

    dependencies { 
     classpath "com.neenbedankt.gradle.plugins:android-apt:1.1" 
    } 
} 

apply plugin: 'android-apt' 

apt { 
    arguments { 
     androidManifestFile variant.processResources.manifestFile 
    } 
} 

dependencies { 
    apt 'com.googlecode.androidannotations:androidannotations:2.7.+' 
} 

非常感謝你們去hvisser Android的易

+0

是啊有點哈克,但它的作品。我有一個奇怪的行爲,它建設兩次。 –

+0

@RomainPiel嘗試'gradle clean && gradle build'有時可以幫助 – Calin

0

一個可能的問題的創建者R類是找不到的。 Android Studio不會將R.java默認放置在gen目錄中,如eclipse。解決方案是進入項目設置 - > Facets - >選擇你的項目的Android方面 - >編譯器選項卡,並從「在make之前運行process-resources Maven任務」中將「R.java和Manifest.java文件」更改爲「由IDE生成」。

6

這裏的答案和+Hugo Visser誰在我的Google+ Question回答我的幫助我得到了這個build.grade配置,它允許gradew構建,並且還添加了Android Studio中的apt輸出路徑作爲源directorie。

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     classpath 'com.android.tools.build:gradle:0.5.+' 
    } 
} 
apply plugin: 'android' 

repositories { 
    mavenCentral() 

    maven { 
     url 'https://oss.sonatype.org/content/repositories/snapshots/' 
    } 
} 

ext.androidAnnotationsVersion = '3.0-SNAPSHOT'; 

configurations { 
    apt 
} 

dependencies { 
    compile 'com.android.support:support-v4:13.0.+' 

    apt "org.androidannotations:androidannotations:${androidAnnotationsVersion}" 
    compile "org.androidannotations:androidannotations-api:${androidAnnotationsVersion}" 
} 

android { 
    compileSdkVersion 17 
    buildToolsVersion "17.0.0" 

    defaultConfig { 
     minSdkVersion 10 
     targetSdkVersion 17 
    } 
} 

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

android.applicationVariants.all { variant -> 
    def aptOutputDir = project.file("build/source/apt") 
    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.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()) 
    } 

    variant.javaCompile.doFirst { 
     aptOutput.mkdirs() 
    } 
} 

UPDATE:更新的gradle這個Android插件0.5.5;改變android.applicationVariants.eachandroid.applicationVariants.all

+1

使用此配置的其他人的注意事項(這是我使用的)。如果您決定稍後將Flavors添加到此配置並重命名該包(如com.mycompany.myapp到com.mycompany.myapp.pro),那麼在「pro」中解決R.Java類文件時可能會遇到問題,版。爲了解決這個問題,使用'-AresourcePackageName = MyBasePackageName'參數將androidannotations重定向到正確的R.Java文件。更深入的解釋,請參閱http://stackoverflow.com/questions/19351168/gradle-annotations-flavors-wont-run-annotations-processor –

4

該項目現在有up to date documentation這種情況。 A full example project也存在。

buildscript { 
    repositories { 
     mavenCentral() 
    } 
    dependencies { 
     // replace with the current version of the Android plugin 
     classpath 'com.android.tools.build:gradle:0.7.3+' 
     // the latest version of the android-apt plugin 
     classpath 'com.neenbedankt.gradle.plugins:android-apt:1.2+' 
    } 
} 

apply plugin: 'android' 
apply plugin: 'android-apt' 

repositories { 
    mavenCentral() 
} 

android { 
    compileSdkVersion 19 
    buildToolsVersion "19.0.1" 

    defaultConfig { 
     minSdkVersion 15 
     targetSdkVersion 19 
     versionCode 1 
     versionName "1.0" 
    } 
    buildTypes { 
     release { 
      runProguard false 
      proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.txt' 
     } 
    } 
} 

apt { 
    arguments { 
     androidManifestFile variant.processResources.manifestFile 

     // If you're using Android NBS flavors you should use the following line instead of hard-coded packageName 
     //resourcePackageName android.defaultConfig.packageName 
     resourcePackageName "com.example.your.package.name" 

     // You can set optional annotation processing options here, like these commented options: 
     // logLevel 'INFO' 
     // logFile '/var/log/aa.log' 
    } 
} 

dependencies { 
    apt "org.androidannotations:androidannotations:3.0+" 
    compile "org.androidannotations:androidannotations-api:3.0+" 
} 
+0

他們只是恢復了我的維基變化。我想弄清楚我做錯了什麼。 –

+0

該示例對我無效... – syklon