0

私のリリースビルドでproguardを使用しているときにDagger 2.5から2.12に切り替えた後にエラーが発生しました。ダガー2.12とプロガードの問題

DaggerGraph.java:662:エラー:シンボルが見つかりません ReportingService_MembersInjector.injectA(instance、provideDataLayerProvider.get());

私はコンパイルされた難読化されたAndroidライブラリと、そのライブラリを含むAndroid Appを持っています。

グラフは、両方のモジュールのコンポーネントを使用して生成されます。

ヒント

ありがとう

PS。 Dagger 2.5では問題なく動作します。 PPS。プロガードのないデバッグビルドもDaggerと連動しています。2.12

+0

https://github.com/krschultz/android-proguard-snippets/blob/master/libraries/proguard-square-dagger.proに示されている設定を使用していますか? –

+0

はい、Dagger 2.5は正常に動作しています。 – Sebastian

答えて

1

投機的回答:これはProguardとの関係が弱く、optimizations made specifically in Dagger 2.12の一部と関係があります。

あなたが作成したライブラリでDaggerを実行していて、別のDaggerアプリケーションからそのライブラリを使用しているため、Daggerには2つのチャンスがあります。まず、ReportingService_MembersInjectorを作成するライブラリおそらく同じReportingServiceを消費します。これらのステップの間で、Proguardは、-keepとそれに関連するスイッチでマークしていないクラスを、効果的に実行できます。 DaggerはinjectAメソッドを2.5のままにしておく必要がありましたが、2.12の最適化ではそのメソッドを保持する必要がなくなり、Proguardはそれを削除します。

ライブラリを使用するAndroidアプリでは、DaggerがReportingService_MembersInjectorという名前のクラスを検出するため、別のコピーを作成せず、誤って生成するすべてのメソッドが含まれていると仮定します。

私は、あなたのライブラリが外部(アプリ)ダガーグラフが明らかに直接消費していることを示す@Injectノーティフィケーションクラスを公開していて、ダガーが提供しているFactoryおよびMembersInjectorクラスを保持しているということです。それ。あなたが生成したMembersInjector、Provider、Factoryクラスを正しく-keepにしていたとしても、内部の難読化されたライブラリとDaggerの外側のコピーのバージョンの違いによって、さまざまな種類の問題が発生する可能性があります。代わりに、ライブラリの外部からライブラリクラスを作成するための工場またはその他の正式な方法を提供してください.2つのダガーランが互いに干渉することはありません。

+0

ありがとう!あなたは正しい方向を指しています パッケージのプライベートメンバーが図書館で難読化されていて、Graphが生成されたときに、その名前を使用してライブラリの注入メソッドを見つけようとしていたようです。 2.12(2.11も機能していました)以前は、注入メソッドがフローの初期に生成され、メンバーの難読化の影響を受けていないと仮定します。 – Sebastian

関連する問題