14

アノテーション プロセッサ (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) の問題なのかはわかりません。だから、一粒の塩でそれを取ってください。

Android Studio でフォルダーを作成する

私はgradleビルドシステムは初めてですが、コツをつかんでいると思いました。スクリプトを何度も見直しましたが、Proバリアントで注釈プロセッサが実行されていない理由がわかりません。--info および --debug 引数を指定してラッパーを実行する以外に、これらの問題をデバッグする方法はまだわかりません。

-info-debugを指定して gradle ラッパーを実行して拡張出力を取得しましたが、生成されたコードの欠落が原因で発生したエラーに到達するまで、他のエラー (または項目の欠落) を示すものは何もありません。したがって、これは、根本的な問題であるそのバリアントでandroidannotationsが実行されていないという事実に過ぎないと私に信じさせます。(つまり、これは上流の何かによって引き起こされたエラーであり、後で誤って報告されたとは思いません。間違っている可能性もあります)

私は本当に途方に暮れており、これで2日間立ち往生しています。

4

1 に答える 1

13

問題を解決できました。gradle ラッパーの-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\manifests\pro\debug\AndroidManifest.xml

エラー: 生成された com.MyCompany.MyAppPro.R クラスが見つかりません

注釈プロセッサは完全なコンパイル手順の前に実行されるため、これらはエラー ログの最初にあるはずですが、何らかの理由で深く埋もれていました (androidannotations プロセッサのフラッシュの問題でしょうか??)。

いずれにせよ、 が見つからない 3 行目がcom.MyCompany.MyAppPro.R鍵です。リソースは実際にcom.MyCompany.MyApp.R(プロではありません)にあります。少し掘り下げた後、これが AndroidAnnotations の既知の問題であることを示すこの 投稿を見つけました。

'-AresourcePackageName=MyBasePackageName',パラメータをビルドスクリプトに 追加することで、その問題を解決できました。注:これは、3.0 スナップショットを使用している場合にのみ機能します。AndroidAnnotations の最新リリース バージョンは、 -AresourcePackageNameオプション をサポートしていません。

パラメータを追加すると、すべてのバリアントが正しくビルドされます。

ビルド スクリプトの compilerArgs セクションは次のようになります。

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

うまくいけば、これは他の人が将来この問題を回避するのに役立ちます.

于 2013-10-14T04:30:42.093 に答える