2017-10-20 208 views
0

在我的發佈版本中使用proguard時,從Dagger 2.5切換到2.12後出現錯誤。Dagger 2.12和proguard問題

DaggerGraph.java:662:error:can not find symbol ReportingService_MembersInjector.injectA(instance,provideDataLayerProvider.get());

我有一個經過編譯和模糊處理的Android庫以及一個包含該庫的Android應用程序。

使用來自兩個模塊的組件生成圖形。

任何提示?

謝謝

PS。隨着匕首2.5它工作沒有問題。 PPS。沒有proguard的調試版本也適用於Dagger 2.12

+0

您是否使用https://github.com/krschultz/android-proguard-snippets/blob/master/libraries/proguard-square-dagger.pro中顯示的設置? –

+0

是的,我有他們至於匕首2.5工作正常。 – Sebastian

回答

1

推測性答案:這可能與Proguard有關,並且與optimizations made specifically in Dagger 2.12有關。因爲您在創建的庫上運行Dagger,然後從不同的Dagger應用程序中使用該庫,Dagger有兩次運行的機會:首先創建您的ReportingService_MembersInjector庫,然後第二個創建ReportingService_MembersInjector這大概會消耗相同的ReportingService。在這些步驟之間,Proguard可以有效地做任何你想要的課程,但你沒有用-keep和相關開關標記。我的直覺是Dagger需要保持你的方法從2.5開始,但2.12優化不再需要你保持這種方法,所以Proguard消除了它。

在您的Android應用程序使用庫時,Dagger檢測到一個名爲ReportingService_MembersInjector的類,因此它不會創建另一個副本,並且錯誤地假定它包含它將生成的所有方法。

我認爲問題的根源在於你的圖書館公開了一個@Inject-annotated類,表明你的外部(app)Dagger圖直接顯式消耗,然後你還保留Dagger提供的Factory和MembersInjector類它。即使您的生成的MembersInjector,Provider和Factory類正確地-keep,您可能會遇到內部混淆庫和Dagger的外部副本之間的版本差異,這些差異會造成各種各樣的麻煩。相反,請提供一個工廠或其他官方的方式,從圖書館外部創建你的圖書館類,所以沒有理由說這兩個Dagger圖書館可能會互相干擾。

+0

謝謝!您指向正確的方向 它看起來像包私有成員在庫中被混淆,並且當Graph生成時使用該名稱並試圖在庫中查找注入方法。 我想在2.12之前(2.11也在工作)注入方法是在流程的早期產生的,並沒有受到成員混淆的影響。 – Sebastian