У меня есть 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). Так что возьмите это с солью.
Я новичок в системе сборки Gradle, но я думал, что получаю от этого зависание. Я смотрел на script снова и снова, и я не понимаю, почему процессор аннотаций не работает для варианта pro. И помимо запуска оболочки с аргументами -info и -debug, я пока не знаю, как отлаживать эти проблемы.
Я запустил оболочку Gradle с -info и -debug, чтобы получить расширенный вывод, но там ничего нет, что указывает на любую другую ошибку (или отсутствует item), пока не достигнет ошибки, вызванной отсутствующим сгенерированным кодом. Таким образом, это заставляет меня поверить в то, что андроиды не запускаются с этим вариантом, который является основной проблемой. (т.е. я не думаю, что это ошибка, вызванная чем-то вверху и неправильная информация позже). Я мог ошибаться, хотя)
Я действительно в недоумении и застрял с этим в течение 2 дней.