13

У меня есть скрипт сборки Gradle, который использует обработчик аннотаций (аннотации Android) для генерации кода. Здание было прекрасным, пока я не добавил новый Pro Вкус. Я могу создать Ароматизм, но когда я создаю аромат, то обработчик аннотаций не запускается. Это приводит к отсутствию кода и сбою сборки.Gradle + Annotations + Flavors = не запускает обработчик аннотаций

Вот мой сценарий:

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 выход:

Note: Starting AndroidAnnotations annotation processing 

При построении Pro, процессор аннотаций не запускается, поэтому ссылки на сгенерированный код не выполняются.

Любопытная вещь в этом, я нашел (поистине случайно), что если я удалю packageName "com.MyCompany.MyApp.Pro" из сценария .... процессор аннотаций работает, и он будет строить правильно. Мне нужно обновить имя пакета для Google Play.

При поиске в Android Studio, вы можете увидеть, что склонный (аннотация Processing Tool) показ Pro версии как быть активным, даже когда у меня есть FreeDebug вариант сборки выбран. Я не уверен, что это свидетельствует о проблеме, или если это просто проблема с бета-версией Android-студии (версия Android Studio: 0.2.13). Так что возьмите это с солью.

Build Folders in Android Studio

Я новичок в Gradle систему сборки, но я думал, что я получал повесить его. Я просматривал сценарий снова и снова, и я не понимаю, почему процессор аннотаций не работает для варианта pro. И помимо запуска оболочки с аргументами -info и -debug, я пока не знаю, как отлаживать эти проблемы.

Я запустить Gradle обертку с -info и -debug, чтобы получить расширенный выход, но нет ничего, что указывает на любую другую ошибку (или отсутствующий элемент), пока он не достигнет ошибки, вызванной недостающее сгенерированный код. Таким образом, это заставляет меня поверить, что это просто факт, что андроиды не запускаются с этим вариантом, который является основной проблемой. (т. е. я не думаю, что это ошибка, вызванная чем-то вверх по течению и некорректная информация позже). Я мог ошибаться, хотя)

Я действительно в недоумении и застрял с этим в течение 2 дней.

ответ

12

Я смог решить проблему. Посмотрев немного ближе к выводу -info градиента, я обнаружил, что пытались запустить 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 \ manifestests \ pro \ debug \ AndroidManifest.xml

ошибка: Th е сгенерированный класс com.MyCompany.MyAppPro.R не может быть найден

These должен был первым в журнале ошибок, как процессор аннотаций работает до полного шага компиляции, но по какой-то причине они были захоронены глубоко (возможно проблема с промывкой в ​​процессоре 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

Еще в октябре я кратко посмотрел, могу ли я это сделать. Это были не совсем очевидные вещи, и я не преследовал его очень тщательно, так как у меня была ограниченная временная шкала. Теоретически это должно быть возможно втянуть, но я не знаю, как это сделать. –

Смежные вопросы