Dagger2는 관련된 MembersInjector 및 Factory 패키지를 올바른 패키지 경로에 생성하게 된다.

다음 그림은 안드로이드 프로젝트의 모듈간 의존성을 보여준다.

만약 안드로이드 프로젝트가 멀티 모듈로 구성되어 있고 모듈별로 Dagger2 어노테이션 프로세싱이 수행된다면, 모듈별로 각자 생성된 클래스를 갖게 되므로 중복된 클래스를 갖게 된다.

이렇게 되면 debug 빌드시에는 이를  괜찮은 듯 보이나, 릴리즈 빌드시 컴파일타임에 R8과 관련되어 중복 클래스가 문제가 되는 듯 보인다. 

나의 경우 core 모듈에 BottomSheetDialogFragment을 확장한 클래스 A가 있다. 이 A클래스에는  @Inject 필드가 있고, 이 클래스를 다시 확장한 클래스 B를 모듈별로 만들어서 참조하는 형태였다. 컴파일타임에 각 모듈별로 MembersInjector 클래스를 생성하다 보니 최종적으로 클래스 A가 같은 패키지에 중복 생성 되는 일이 발생했다. 사실 A 클래스는 실제로 사용되지 않지만, @inject 필드로 인해 MembersInjector 클래스가 생성되어 문제가 되는 것이다. 

다음과 같은 방법중 하나를 시도하여 해결 할 수있다.

  • 클래스  A에 있는 @Inject 필드를 제거 또는 하위 클래스로 이동한다.
  • DFM 모듈내의 Dagger 모듈에서 해당 의존성을 Provide 한다.
  • 클래스 A를 Base 모듈로 옮긴다.

Dagger2와 멀티 모듈 설정에 대한 가이드가 공식문서에는 포함되어 있지 않다보니, 이런 일이 발생하게 되는 것 같다. 다행히 github 이슈에 비슷한 이슈가 있어서 빠르게 해결 할 수 있었다.

 

Buy me a coffeeBuy me a coffee
카테고리: Android

0개의 댓글

답글 남기기

이메일은 공개되지 않습니다. 필수 입력창은 * 로 표시되어 있습니다.