@Named proveedores con los mismos tipos de retorno terminan dando java.lang.IllegalArgumentException: Duplicar

Aquí está el problema,

Estoy trabajando en un proyecto de LibGDX donde tengo diferentes módulos para diferentes plataformas.

Así es como se ve mi módulo android:

@Module( includes = {BaseModule.class, NetModule.class}, injects = {DummyProjectActivity.class, DummyProject.class}, overrides = true) public class DummyProjectAndroidModule { ... @Provides @Singleton @Named("DummyOne") DummyInterface provideDummyOne() { return new DummyOne(); } @Provides @Singleton @Named("DummyTwo") DummyInterface provideDummyTwo() { return new DummyTwo(); } @Provides @Singleton @Named("DummyConsumer") DummyConsumer provideDummyConsumer(@Named("DummyOne") DummyInterface dummyOne, @Named("DummyTwo") DummyInterface dummyTwo) { return new DummyConsumer(dummyOne, dummyTwo); } } 

.. y aquí cómo se ve mi módulo de escritorio:

 @Module( includes = {BaseModule.class, NetModule.class}, injects = {DummyProjectDesktop.class, DummyProject.class}, overrides = true) public class DummyProjectDesktopModule { 

Así descansar es más o menos lo mismo. Sin embargo, mientras estoy construyendo el proyecto para Desktop todo va bien y dandy donde en Android lado, me sale este error que me deja flabbergasted todavía.

 Process: net.alicanhasirci.mobile.DummyProject.android, PID: 4603 java.lang.RuntimeException: Unable to start activity ComponentInfo{net.alicanhasirci.mobile.DummyProject.android/net.alicanhasirci.mobile.DummyProject.android.DummyProjectActivity}: java.lang.IllegalArgumentException: Duplicate: net.alicanhasirci.mobile.android.image.DummyInterface net.alicanhasirci.mobile.DummyProject.android.DummyProjectAndroidModule.provideDummyOne() net.alicanhasirci.mobile.android.image.DummyInterface net.alicanhasirci.mobile.DummyProject.android.DummyProjectAndroidModule.provideDummyTwo() at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2305) at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2365) at android.app.ActivityThread.access$800(ActivityThread.java:148) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1283) at android.os.Handler.dispatchMessage(Handler.java:102) at android.os.Looper.loop(Looper.java:135) at android.app.ActivityThread.main(ActivityThread.java:5272) at java.lang.reflect.Method.invoke(Native Method) at java.lang.reflect.Method.invoke(Method.java:372) at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:909) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:704) Caused by: java.lang.IllegalArgumentException: Duplicate: net.alicanhasirci.mobile.android.image.DummyInterface net.alicanhasirci.mobile.DummyProject.android.DummyProjectAndroidModule.provideDummyOne() net.alicanhasirci.mobile.android.image.DummyInterface net.alicanhasirci.mobile.DummyProject.android.DummyProjectAndroidModule.provideDummyTwo() at dagger.internal.UniqueMap.put(UniqueMap.java:29) at dagger.internal.plugins.reflect.ReflectiveModuleAdapter.handleBindings(ReflectiveModuleAdapter.java:104) at dagger.internal.plugins.reflect.ReflectiveModuleAdapter.getBindings(ReflectiveModuleAdapter.java:89) at dagger.ObjectGraph$DaggerObjectGraph.makeGraph(ObjectGraph.java:174) at dagger.ObjectGraph$DaggerObjectGraph.access$000(ObjectGraph.java:132) at dagger.ObjectGraph.create(ObjectGraph.java:129) at net.alicanhasirci.mobile.DummyProject.android.DummyProjectActivity.onCreate(DummyProjectActivity.java:137) at android.app.Activity.performCreate(Activity.java:5977) at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1105) at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2258) 

Ahora un rápido vistazo al código fuente de la daga y puedo ver que las anotaciones de calificador se recopilan por reflexión y se utilizan como prefijos para los nombres de enlace que más tarde se utilizarán como claves en UniqueMap. Mi problema parece ocurrir en alguna parte alrededor de esta área donde mi calificador no consigue procesado de alguna manera, con todo mi estructura del escritorio trabaja sin un problema …

Éstos son algunos más adicionales:

 ObjectGraph objectGraph = ObjectGraph.create(new DummyProjectAndroidModule()); objectGraph.inject(this); dp = objectGraph.get(DummyProject.class); 

Es cómo obtengo mi objeto DummyProject , que tiene una inyección de campo de DummyConsumer . Como tal:

 @Inject @Named("DummyConsumer") DummyConsumer consumer; 

He cambiado los tipos de retorno a las clases concretas como una solución, pero a nadie le gusta una solución porque todos sabemos que te persiguen hasta el final.

Por fin he descubierto la razón por la que ocurre este problema. Es Proguard. A menos que diga especificar de lo contrario en el archivo de configuración proguard, se obfuscate el código generado durante la poda de anotaciones y lo que no causará resultados inesperados.

La única manera de hacer que Proguard y Dagger coexistan es básicamente abandonar la mayor parte de la ofuscación o cambiar a Dagger2, como dijo Jake Wharton en https://github.com/square/dagger/issues/202 . Estoy usando proguard sólo para evitar golpear límite de 65k por lo que la configuración necesaria para evitar la ofuscación resuelto mi problema.

  • LibGDX: Implementación en un dispositivo iOS: ApplicationVerificationFailed
  • Libgdx: la aplicación android no encuentra la clase de juego principal
  • Manera correcta de disponer de pantallas en Libgdx
  • Pantalla de grabación a video libgdx android
  • OpenGL 2.0 o superior con la extensión FBO es obligatorio LibGDX Error
  • Android Emulator no inicia el proyecto LibGDX?
  • Cómo detectar cuando el dispositivo está orientado al revés en libGDX
  • ¿Cómo cambiar entre el modo vertical y el modo horizontal con libGDX?
  • Libgdx - IllegalStateException en una ubicación desconocida
  • Libgdx se bloquea en Android
  • Uso de SQLite desde libGDX en Android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.