16

ファクトリ クラスとMETA-INF/services/factory.interface.classリソースを生成するカスタム アノテーション プロセッサがあります。

アノテーション プロセッサはライブラリ プロジェクトで使用され、生成されたすべてのファイルは AAR に正しくパッケージ化されます。

ライブラリが依存関係として追加されたアプリケーションプロジェクトで注釈プロセッサを使用すると、ライブラリのクラスのみMETA-INF/services/factory.interface.classが存在しますAPK/META-INF/services/factory.interface.class

いくつかの調査の後MergeJavaResourcesTransform、android-gradle-plugin-1.5.0 (および 2.0.0-alpha3) では、すべてexploded-aarの s、jars、およびintermediates/sourceFolderJavaResources

META-INFからマージする方法はありますかintermediates/classes(注釈プロセッサのリソースファイルが作成される場所です)、または注釈プロセッサにファイルを作成させる方法はありますsourceFolderJavaResourcesか?

これまでに見つけた唯一の回避策はCopyTask、アプリケーションのビルドスクリプトを追加することです

android.applicationVariants.all { variant ->
  def variantName = variant.name
  def variantNameCapitalized = variantName.capitalize()
  def copyMetaInf = tasks.create "copyMetaInf$variantNameCapitalized", Copy
  copyMetaInf.from project.fileTree(javaCompile.destinationDir)
  copyMetaInf.include "META-INF/**"
  copyMetaInf.into "build/intermediates/sourceFolderJavaResources/$variantName"
  tasks.findByName("transformResourcesWithMergeJavaResFor$variantNameCapitalized").dependsOn copyMetaInf
}

しかし、ライブラリのユーザーが依存関係を追加する以上のことをコンパイラに強制するつもりはありません。

4

1 に答える 1

1

この問題は META-INF フォルダーに関連しているようです。Service Loader および META-INFについて報告されたバグは次のとおりです。

ちなみに、確認済みの解決策があります:

  • /src/main (/java および /res フォルダーがある場所) を右クリックし、
  • [新規] > [フォルダー] > [Java リソース フォルダー] を選択します。
  • [完了] をクリックします (フォルダーの場所は変更しないでください)。
  • 新しい /resources フォルダーを右クリックし、
  • [新規] > [ディレクトリ] を選択します
  • 「META-INF」と入力します (引用符なし)。
  • /resources/META-INF フォルダーを右クリックし、
  • [新規] > [ディレクトリ] を選択します
  • 「サービス」と入力してください (引用符なし)
  • 必要なファイルを /resources/META-INF/services にコピーします

また、SO に関する次の質問を確認することもできます。


最初の答え:

ライブラリ ソース セットresources属性 (META-INF/services の場所を使用)を構成してみてください。

javaResources 出力ディレクトリにコピーされる Java リソース。

以下に例を示します。

android {
    ...
    sourceSets {
        main {
            resources.srcDirs = ['/src/META_INF_generated']
        }
    }
    ...
}
于 2015-12-29T14:25:01.647 に答える