2017-10-20 141 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