Program type already present xx_MembersInjector解决方案

  • 起因
  • 分析
  • 解决方案

起因

换mbp了,下载的最新的Android Studio 3.4.1版本,导入原来的项目,一编译,?编译竟然报错,在之前电脑Android Studio 3.1.3版本中都没有问题的。


Caused by: com.android.tools.r8.utils.AbortException: Error: Program type already present: xxx_MembersInjector
	at com.android.tools.r8.utils.Reporter.failIfPendingErrors(Reporter.java:116)
	at com.android.tools.r8.utils.Reporter.fatalError(Reporter.java:74)
	at com.android.tools.r8.utils.ExceptionUtils.withCompilationHandler(ExceptionUtils.java:59)
	... 10 more


分析

首先,出现xxx_MembersInjector的类,很显然是Dagger2通过注解解析自动生成的类。所以直接去Dagger2的Issue中找很可能有同样遇到这个问题的人,解决方案也很可能会出现。

没错,以下都是遇到相同问题的issue:

https://github.com/google/dagger/issues/1104
https://github.com/google/dagger/issues/1029
https://github.com/google/dagger/issues/955 (这个是重点

截个人家复现Demo的代码的图来解析一下

Program type already present xx_MembersInjector解决方案_第1张图片

其中Middle.java继承了Base.java
然后进行编译
Dagger2会在base module中生成Base_MembersInjector
mine module中生成Middle_MembersInjector、Mine_MembersInjector
user module中生成Middle_MembersInjector、User_MembersInjector

哦豁,那问题来了,系统会发现有2哥Middle_MembersInjector,所以就报出Program type already present xx_MembersInjector

解决方案

根据作者的解释:

      The generated MembersInjector is in the right package, but is generated in multiple modules.
      If I understood it correctly, this happens when your Middle class doesn’t need any injections, so dagger doesn’t generate a MembersInjector for it in base module. When dagger processes the other modules, and doesn’t find that MembersInjector, it generates one, in each module.
      The duplicate generated MembersInjector are actually not used at all, and you’ll only get the error when you assemble the top-level module (app).
      A workaround that seems to work, is adding an unneeded @Inject field to Middle class. This will make dagger generate the MembersInjector in the base module, and it won’t be generated in other modules any more.

以下是重点!!
以下是重点!!
以下是重点!!

在Middle.java中通过@Inject随便添加个变量,这样,Dagger2就会在base module中生成Middle_MembersInjector而不会在其他module中生成了







如果以上还没有解决你的问题,请检查使用到Dagger2中是否正确引入注解解析器annotationProcessor 'com.google.dagger:dagger-compiler:2.x'kapt 'com.google.dagger:dagger-compiler:2.x'

??

以上

你可能感兴趣的:(Android)