2017-10-20 18 views
0

내 릴리스 빌드에서 proguard를 사용할 때 Dagger 2.5에서 2.12로 전환 한 후 오류가 있습니다.단검 2.12 및 안내장 문제

DaggerGraph.java:662 : 오류 : 기호를 찾을 수 없습니다. ReportingService_MembersInjector.injectA (instance, provideDataLayerProvider.get());

나는 컴파일되고 난독 화 된 Android 라이브러리와 해당 라이브러리가 포함 된 Android App을 보유하고 있습니다.

그래프는 두 모듈의 구성 요소를 사용하여 생성됩니다.

힌트가 있습니까?

감사합니다.

PS입니다. Dagger 2.5를 사용하면 문제없이 작동합니다. PPS. 프로 가드가없는 디버그 빌드도 대거와 잘 작동합니다. 2.12

+0

https://github.com/krschultz/android-proguard-snippets/blob/master/libraries/proguard-square-dagger.pro에 표시된 설정을 사용하고 있습니까? –

+0

네, Dagger 2.5는 괜찮습니다. – Sebastian

답변

1

추측 적 대답 : 이것은 Proguard와 관련이 없으며 optimizations made specifically in Dagger 2.12과 더 관련이 있습니다.

작성한 라이브러리에서 대거를 실행하고 다른 대거 앱에서 해당 라이브러리를 사용하기 때문에 Dagger가 다음 두 가지 기회를 갖습니다. 먼저 ReportingService_MembersInjector를 만드는 라이브러리의 경우 두 번째 이는 아마도 동일한 ReportingService를 소비하게됩니다. 이러한 단계들 사이에서 Proguard는 -keep 및 관련 스위치로 표시하지 않은 수업을 효과적으로 수행 할 수 있습니다. 제 직감은 대거가 injectA 방법을 2.5로 유지해야하지만 2.12 최적화는 더 이상 해당 방법을 유지할 필요가 없으므로 Proguard가이를 제거합니다.

라이브러리를 사용하는 Android 앱에서 Dagger는 ReportingService_MembersInjector라는 클래스를 감지하므로 다른 사본을 만들지 않으며 생성하는 모든 메소드가 잘못 포함되어 있다고 가정합니다.

나는 문제의 근본 원인은 외부 (앱) 대거 그래프가 명백하게 직접 소비한다는 것을 라이브러리가 @Inject 노노 티드 클래스를 노출하고, 대거가 제공하는 Factory 및 MembersInjector 클래스를 유지한다는 것입니다. 그것. 생성 된 MembersInjector, Provider 및 Factory 클래스를 올바르게 -keep 개로 만들었더라도 내부의 난독 화 라이브러리와 다양한 종류의 문제를 일으키는 단검의 외부 복사본간에 버전 차이가 발생할 수 있습니다. 대신 라이브러리 외부에서 라이브러리 클래스를 만드는 공장이나 기타 공식적인 방법을 제공하십시오. 따라서 두 단검이 서로 간섭 할 이유가 없습니다.

+0

고마워요! 당신이 올바른 방향을 가리켰다 패키지 개인 멤버가 라이브러리에서 난독 화되었고 Graph가 생성되었을 때 그 이름을 사용하고 라이브러리에서 삽입 메소드를 찾으려고하는 것처럼 보입니다. 2.12 (2.11도 작동 했음) 이전에는 주입 메서드가 흐름의 앞 부분에서 생성되어 멤버의 난독 화 (obfuscation)에 영향을받지 않았다고 가정합니다. – Sebastian