アノテーション プロセッサ (Android Annotations) を使用してコードを生成する Gradle ビルド スクリプトがあります。新しいPro Flavorを追加するまで、ビルドは問題ありませんでした。Freeフレーバーをビルドできますが、 Proフレーバーをビルドすると、注釈プロセッサが実行されません。これにより、コードが欠落し、ビルドが失敗します。
これが私のスクリプトです:
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スタジオを見ると、 FreeDebugビルドバリアントが選択されていても、apt(注釈処理ツール)がProバージョンをアクティブとして表示していることがわかります。これが問題を示しているのか、それともベータ android スタジオ (Android Studio バージョン: 0.2.13) の問題なのかはわかりません。だから、一粒の塩でそれを取ってください。
私はgradleビルドシステムは初めてですが、コツをつかんでいると思いました。スクリプトを何度も見直しましたが、Proバリアントで注釈プロセッサが実行されていない理由がわかりません。--info および --debug 引数を指定してラッパーを実行する以外に、これらの問題をデバッグする方法はまだわかりません。
-infoと-debugを指定して gradle ラッパーを実行して拡張出力を取得しましたが、生成されたコードの欠落が原因で発生したエラーに到達するまで、他のエラー (または項目の欠落) を示すものは何もありません。したがって、これは、根本的な問題であるそのバリアントでandroidannotationsが実行されていないという事実に過ぎないと私に信じさせます。(つまり、これは上流の何かによって引き起こされたエラーであり、後で誤って報告されたとは思いません。間違っている可能性もあります)
私は本当に途方に暮れており、これで2日間立ち往生しています。