【问题标题】:Dagger 2.12 and proguard issueDagger 2.12 和 proguard 问题
【发布时间】:2017-10-20 06:39:13
【问题描述】:

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

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

我有一个经过编译和混淆处理的 Android 库和一个包含该库的 Android 应用。

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

有什么提示吗?

谢谢

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

【问题讨论】:

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


【解决方案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-annotated 类,您的外部(应用程序)Dagger 图显然正在直接使用,然后您还保持 Dagger 提供的 Factory 和 MembersInjector 类相邻给它。即使您要正确地-keep 生成的 MembersInjector、Provider 和 Factory 类,您也可能会遇到内部混淆库和 Dagger 外部副本之间的版本差异,这会带来不同类型的麻烦。相反,提供一种工厂或其他官方方式从库外部创建您的库类,因此两次 Dagger 运行没有理由相互干扰。

【讨论】:

  • 谢谢!您指出了正确的方向看起来包私有成员在库中被混淆了,当生成 Graph 时使用该名称并试图在库中查找注入方法。我想在 2.12 之前(2.11 也在工作)注入方法是在流程的早期生成的,并且不受成员混淆的影响。
猜你喜欢
  • 1970-01-01
  • 2016-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-05
  • 2010-10-27
  • 2016-02-11
  • 1970-01-01
相关资源
最近更新 更多