Dagger 2.12和proguard问题

时间:2017-10-20 06:39:14

标签: android proguard dagger-2 android-proguard dagger

在我的发布版本中使用proguard后,从Dagger 2.5切换到2.12后出错。

DaggerGraph.java:662:错误:找不到符号 ReportingService_MembersInjector.injectA(instance,provideDataLayerProvider.get());

我有一个编译和混淆的Android库以及一个包含该库的Android应用程序。

使用两个模块中的组件生成图表。

任何提示?

由于

PS。使用Dagger 2.5它可以正常工作。 PPS。没有proguard的调试版本也适用于Dagger 2.12

1 个答案:

答案 0 :(得分:1)

思辨答案:这可能与Proguard关系不大,而与optimizations made specifically in Dagger 2.12的一些关系更多。

因为你在你创建的库上运行Dagger,然后从不同的Dagger应用程序中使用该库,Dagger有两次机会运行:首先是库,它创建了ReportingService_MembersInjector,以及那么第二个可能会消耗相同的ReportingService。在这些步骤之间,Proguard可以有效地为您没有标记-keep和相关开关的课程做任何事情。我的预感是,Dagger需要保留2.5 injectA方法,但2.12优化不再需要你保留这种方法,所以Proguard将其删除。

在使用该库的Android应用中,Dagger检测到一个名为ReportingService_MembersInjector的类,因此它不会创建另一个副本,并且错误地假设它包含它将生成的所有方法。

我认为问题的根源在于你的库暴露了一个@Inject - 带注释的类,你的外部(app)Dagger图显然直接消耗了,然后你还保留了Factory和MembersInjector类Dagger与它相邻。即使您正确地-keep生成的MembersInjector,Provider和Factory类,您可能会遇到内部混淆库与Dagger外部副本之间的版本差异,这会导致不同类型的麻烦。相反,提供工厂或其他官方方式从库外创建库类,因此两个Dagger运行没有理由相互干扰。