13

我有一个使用注释处理器(Android Annotations)生成代码的Gradle构建脚本。建筑很好,直到我添加了一个新的Pro风味。我可以构建风味,但是当我构建风味时,注释处理器不运行。这会导致缺少代码并且构建失败。Gradle + Annotations + Flavors =不会运行注释处理器

这里是我的脚本:

Note: Starting AndroidAnnotations annotation processing 

在构建

buildscript { 
    repositories { 
     maven { url 'http://repo1.maven.org/maven2' } 
    } 
    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 files('libs/android-support-v13.jar') 
    compile fileTree(dir: 'libs', include: '*.jar') 
    apt "org.androidannotations:androidannotations:${androidAnnotationsVersion}" 
    compile "org.androidannotations:androidannotations-api:${androidAnnotationsVersion}" 
} 

android { 
    compileSdkVersion 17 
    buildToolsVersion "17.0.0" 


    defaultConfig { 
     minSdkVersion 7 
     targetSdkVersion 17 

     versionCode 29 
     versionName "2.0.3" 
     packageName "com.MyCompany.MyApp" 

    } 

    productFlavors { 
     free { 
      buildConfig "final public static boolean PRO_VERSION = false;" 
     } 
     pro { 
      packageName "com.MyCompany.MyApp.Pro" 
      versionName (versionName + ".Pro") 
      buildConfig "final public static boolean PRO_VERSION = true;" 
     } 
    } 

    buildTypes { 
     release { 
      buildConfig "final public static String BASE_URL = \"http://data.MyCompany.com/\";", \ 
         "final public static String APP_NAME = \"com.MyCompany.MyApp\";" 
     } 
     debug { 
      buildConfig "final public static String BASE_URL = \"http://192.168.1.15/GDM/\";", \ 
         "final public static String APP_NAME = \"com.MyCompany.MyApp\";" 
     } 
    } 

} 

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

在构建免费变种,由gradle这个输出以下指示注释处理器运行Pro变体,注释处理器不运行,因此对生成的代码的引用失败。

对此的好奇是,我发现(真的是偶然),如果我从脚本中删除packageName "com.MyCompany.MyApp.Pro" ....注释处理器运行并且它将正确地构建。我需要更新Google Play的软件包名称。

当机器人工作室寻找,你可以看到,APT(注释处理工具)正显示出版本为活动状态,即使我选择了FreeDebug构建变量。我不确定这是否是问题的指示,或者如果这只是测试版android studio的问题(Android Studio版本:0.2.13)。所以,用一粒盐吧。

Build Folders in Android Studio

我是新来的gradle这个构建系统,但我认为得到了它的窍门。我一遍又一遍地查看脚本,我不明白为什么注释处理器没有运行于pro变体。除了使用--info和--debug参数运行封装外,我还不知道如何调试这些问题。

我已经运行与-info-debug得到扩展输出gradle这个包装,但有什么也没有表示任何其他错误(或缺少项),直到达到所造成的失踪错误生成的代码。所以这让我相信这只是一个事实,即androidannotations没有被运行,这是根本问题。 (也就是说,我认为这不是上游造成的错误,后来被误报,我可能错了)

我真的很茫然,现在已经坚持了两天。

回答

12

我能解决问题。在仔细查看Gradle包装的输出后,我发现androidAnnotations正在尝试运行。错误输出的顺序不正确,因为注释处理消息是在引用不存在的代码(因为注释处理失败而不存在的错误)之后产生的。

这里是日志:

:MyCompany:compileProDebug 
....\src\main\java\com\MyCompany\MyApp\Activities\activityMain.java:14: error: cannot find symbol 
import com.MyCompany.MyApp.Notifications.NotificationSetupActivity_; 
               ^
    symbol: class NotificationSetupActivity_ 
    location: package com.MyCompany.MyApp.Notifications 
....\src\main\java\com\MyCompany\MyApp\Activities\activityMain.java:24: error: cannot find symbol 
import com.MyCompany.MyApp.FantasyScores.ActivityScores_; 
               ^
    symbol: class ActivityScores_ 
    location: package com.MyCompany.MyApp.Scores 
....\src\main\java\com\MyCompany\MyApp\Activities\activityMain.java:32: error: cannot find symbol 
import com.MyCompany.MyApp.Team.activityTeamSelect_; 
            ^
    symbol: class activityTeamSelect_ 
    location: package com.MyCompany.MyApp.Team 
Note: Starting AndroidAnnotations annotation processing 
Note: AndroidManifest.xml file found: ....\build\manifests\pro\debug\AndroidManifest.xml 
error: The generated com.MyCompany.MyAppPro.R class cannot be found 
Note: Time measurements: [Whole Processing = 190 ms], [Extract Manifest = 129 ms], [Extract Annotations = 49 ms], 
....\src\main\java\com\MyCompany\MyApp\Activities\activityMain.java:14: error: cannot find symbol 
import com.MyCompany.MyApp.Notifications.NotificationSetupActivity_; 

重要的线是这些:

注:启动AndroidAnnotations注释处理

注:AndroidManifest.xml文件中找到:.... \ build \ manifest \ pro \ debug \ AndroidManifest.xml

错误:Th Ë产生com.MyCompany.MyAppPro.R类不能被发现

这些本来应该在错误日志中第一作为注解处理器的全编译步骤之前运行,但由于某种原因,他们被深埋(也许androidannotations处理器中的刷新问题??)

无论如何,第三行找不到com.MyCompany.MyAppPro.R是关键。资源实际上在com.MyCompany.MyApp.R(没有Pro)。挖了一下后,我发现this post这表明这是AndroidAnnotations的一个已知问题。

我能够通过将'-AresourcePackageName=MyBasePackageName',参数添加到构建脚本来解决该问题。 注意:这只适用于使用3.0快照的情况。 AndroidAnnotations的最新发布版本不支持-AresourcePackageName选项。

添加参数后,所有变体都可正确构建。

的compilerArgs构建脚本的部分现在看起来是这样的:

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

希望这将帮助其他人避免在将来出现此问题。

+0

感谢您分享解决方案。 – ruX

+0

太棒了!谢谢!有没有办法以编程方式提取基本包名称? –

+0

回到十月,我简短地看了一下,看看我能不能做到。这不是一个完全明显的事情,我没有非常彻底地追求它,因为我的时间表很紧。从理论上讲,它应该可以拉入,但我不知道如何去做。 –

相关问题