13

コードを生成するために注釈プロセッサ(Android注釈)を使用しているGradleビルドスクリプトがあります。新しいPro Flavorを追加するまで、建物はうまくいきました。 フリーフレーバーを構築できますが、Proフレーバーを作成すると、アノテーションプロセッサーは実行されません。これによりコードが失われ、ビルドが失敗します。 を構築する場合Gradle +注釈+ Flavors =注釈プロセッサを実行しません

Note: Starting AndroidAnnotations annotation processing 

:Gradleの出力には、以下で示されるように

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() 
    } 
} 

無料バリアントを構築し、注釈プロセッサが実行されます。ここでは

は私のスクリプトですPro
の亜種の場合、注釈プロセッサは実行されないため、生成されたコードへの参照は失敗します。

これは興味深いことですが、スクリプトからpackageName "com.MyCompany.MyApp.Pro"を削除すると(実際には偶然によって)注釈プロセッサが実行され、正しく構築されることが判明しました。 Google Playのパッケージ名を更新する必要があります。アンドロイドスタジオで見たとき、私は選択FreeDebugビルドバリアントを持っている場合でも

は、あなたが(注釈処理ツール)のaptがアクティブであるとしてプロバージョンを示していることがわかります。私はこれが問題を示唆しているのか、これがベータアンドロイドスタジオ(Androidスタジオバージョン:0.2.13)に問題があるのか​​はわかりません。だから塩の穀物でそれを取る。

Build Folders in Android Studio

私はGradleのビルドシステムへの新たなんだけど、私はは、私はそれのこつを得ていたを考えました。私はスクリプトを何度も見てきましたが、プロの亜種について、なぜ注釈プロセッサが実行されていないのか分かりません。また、--infoと--debugの引数でラッパーを実行する以外にも、これらの問題をデバッグする方法はまだわかりません。

私は、拡張出力を得るために -infoと-debugでのGradleラッパーを実行しましたが、それは行方不明に起因するエラーに達するまで、その他のエラー(または不足している項目)を示しますが、何もありません生成されたコード。だから、これは、アンドロイドのアノテーションが根本的な問題であるその変種で実行されていないということだけを信じるようになります。 (つまり、これは上流の何かによって引き起こされたエラーではなく、後で間違っているかもしれません)

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

答えて

12

私はこの問題を解決できました。グラバーラッパーの出力-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

エラー:Th多分(注釈プロセッサがフルコンパイルステップの前に実行されますが、何らかの理由で、彼らは深く埋められたとして、電子生成com.MyCompany.MyAppPro.Rクラスは、エラー・ログ内の最初にされている必要があります

これらを見つけることができませんandroid annotationsプロセッサのフラッシュ問題?)

いずれにしても、com.MyCompany.MyAppPro.Rが見つからない3行目がキーです。リソースは実際にcom.MyCompany.MyApp.R(Proはありません)にあります。ちょっと掘り出した後、私はthis postが見つかりました。これはAndroidAnnotationsの既知の問題であることを示しています。

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

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

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

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

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

+0

ソリューションを共有していただきありがとうございます。 – ruX

+0

素晴らしい!ありがとうございます!基本的なパッケージ名をプログラムで取得する方法はありますか? –

+0

10月に私はそれをやることができるかどうか簡単に見ました。それは完全に明白なものではありませんでした。私は厳密なタイムラインを持っていたので、それを非常に徹底的に追求しませんでした。理論的にはそれを引っ張ることが可能であるべきですが、私はそれを行う方法を手で知らない。 –