Gradle + Аннотации + Flavors = не будет запускать обработчик аннотаций

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

Вот мой script:

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" из script.... обработчик аннотаций запускается, и он будет правильно строить. Мне нужно обновить имя пакета для Google Play.

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

Build Folders in Android Studio

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

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

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

Ответы

Ответ 1

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

Ошибка: не найден найденный класс com.MyCompany.MyAppPro.R

Они должны были быть первыми в журнале ошибок, поскольку процессор аннотаций работает до полного этапа компиляции, но по какой-то причине они были глубоко погружены (возможно, проблема с флешем в процессоре androidannotations?)

Во всяком случае, третьей строкой, где он не может найти com.MyCompany.MyAppPro.R, является ключ. Ресурсы на самом деле находятся в com.MyCompany.MyApp.R (нет Pro). После копания я нашел этот пост, который указывает, что это известная проблема с AndroidAnnotations.

Мне удалось решить эту проблему, добавив параметр '-AresourcePackageName=MyBasePackageName', в конструкцию script. ПРИМЕЧАНИЕ: это работает только в том случае, если вы используете моментальный снимок 3.0. Последняя версия AndroidAnnotations не поддерживает параметр -AresourcePackageName.

После добавления параметра все варианты строятся правильно.

Раздел compilerArgs сборки script теперь выглядит следующим образом:

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

Надеюсь, это поможет другим избежать этой проблемы в будущем.