Подтвердить что ты не робот

@Named провайдеры с одинаковыми типами возврата в конечном итоге дают java.lang.IllegalArgumentException: Duplicate

Вот проблема,

Я работаю над проектом LibGDX, где у меня разные модули для разных платформ.

Вот как выглядит мой 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);
    }
}

.. и вот как выглядит мой рабочий стол:

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

хорошо отдыхают почти то же самое. Тем не менее, пока я строю проект для Рабочего стола, все идет хорошо и dandy, где на стороне Android, я получаю эту ошибку, которая оставляет меня еще более ошеломляющим.

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)

теперь быстро взгляните на исходный код кинжала, и я вижу, что аннотации квалификатора собираются путем отражения и используются как префиксы для привязки имен, которые позже будут использоваться в качестве ключей в UniqueMap. Моя проблема, похоже, происходит где-то в этой области, где мой классификатор не обрабатывается каким-то образом, но моя настольная сборка работает без проблем...

Вот еще несколько:

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

заключается в том, как я получаю свой объект DummyProject, который имеет инъекцию поля DummyConsumer. Таким образом:

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

Я изменил типы возвращаемости на конкретные классы в качестве обходного пути, но никто не любит обходной путь, потому что мы все знаем, что они преследуют вас до конца.

4b9b3361

Ответ 1

Я наконец выяснил причину возникновения этой проблемы. Это Proguard. Если вы не укажете иначе в файле конфигурации proguard, он будет запутывать сгенерированный код при обрезке аннотаций и что не приведет к неожиданным результатам.

Только способ совместного использования Proguard и Dagger состоит в том, чтобы в основном отказаться от большей части обфускации или переключиться на Dagger2, как сказал Джейк Уортон на https://github.com/square/dagger/issues/202. Я использую proguard только для того, чтобы избежать достижения предела 65k, поэтому создание необходимых конфигураций, чтобы избежать обфускации, разрешило мою проблему.