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