Кинжал 2 с Android Studio 3.0 Preview (Canary 2) с помощью аннотации Processor вместо android-apt

"A long time ago in a galaxy far, far away...."

Хорошо, короткая короткая история - я решил сделать снимок Android Studio 3.0 Preview (Canary 2) и я не могу заставить его работать с Dagger 2 используя annotationProcessor вместо android-apt.

Сообщение об ошибке, которое я получаю, является простым для переваривания:

Error:(59, 24) error: cannot find symbol variable DaggerAppComponent

Я читал документы (ничего не замечая, я думаю): https://developer.android.com/studio/preview/features/new-android-plugin-migration.html#annotationProcessor_config

И изменил файл build.gradle на:

implementation "com.google.dagger:dagger:$rootProject.ext.daggerVersion"
annotationProcessor "com.google.dagger:dagger-android-processor:$rootProject.ext.daggerVersion"

Где daggerVersion = '2.11'

Кроме того, я убедился, что соответствующие опции отмечены в Android Studio (по умолчанию не были отмечены):

File -> Other Settings -> Default Settings -> 
Build, Execution, Deployment -> Compiler -> Annotation Processors -> 
Enable annotation processors -> IS CHECKED

К сожалению, это не помогает.

Gradle:

distributionUrl=https\://services.gradle.org/distributions/gradle-4.0-milestone-1-all.zip

Плагин Android для Gradle:

dependencies {
    classpath 'com.android.tools.build:gradle:3.0.0-alpha2'
    ...
}

Как мне заставить работать с annotationProcessor вместо android-apt?

EDIT # 1

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

implementation "com.google.dagger:dagger:$rootProject.ext.daggerVersion"
implementation "com.google.dagger:dagger-android:$rootProject.ext.daggerVersion"
implementation "com.google.dagger:dagger-android-support:$rootProject.ext.daggerVersion"
annotationProcessor "com.google.dagger:dagger-android-processor:$rootProject.ext.daggerVersion"
annotationProcessor "com.google.dagger:dagger-compiler:$rootProject.ext.daggerVersion"
compileOnly 'javax.annotation:jsr250-api:1.0'

И теперь я получаю сообщение о конфликтующих областях... Oo

SomeSubComponent has conflicting scopes:
AppComponent also has @Singleton

Я обновил Dagger с 2.6.1 до 2.11, так что теперь я ищу некоторые "взломанные изменения" в примечаниях к выпуску: https://github.com/google/dagger/releases

Редактировать # 2

Хорошей новостью является то, что первое "нарушение" было внесено в 2.9 Моя дикая догадка заключается в том, что это связано с "Новой валидацией". Плохая новость заключается в том, что, скорее всего, проблема уже существует целую вечность. https://github.com/google/dagger/releases/tag/dagger-2.9

Обзор структуры (Sub)Components и Scoped Dependencies.

Редактировать # 3

В настоящее время эта проблема связана с этим: https://github.com/google/dagger/issues/107

Рассмотрим следующий пример:

@Singleton
@Component(modules = {
        AppModule.class
})
public interface AppComponent {
    SomeComponent plus(SomeModule someModule);
}

@Module
public class AppModule {

    @Provides
    @Singleton
    public Integer provideInteger() {
        return 1;
    }
}

@Singleton
@Subcomponent(modules = {
        SomeModule.class
})
public interface SomeComponent {
    void inject(MainActivity activity);
}

@Module
public class SomeModule {

    @Provides
    @Singleton
    public String provideText(Integer number) {
        return number.toString();
    }
}

Это невозможно для Dagger 2.9+. Component должен использовать другой Scope то Subcomponent с. Как это:

    @Scope
    public @interface ApplicationScope {
    }

    @Module
    public class AppModule {

        @Provides
        @ApplicationScope
        public Integer provideInteger() {
            return -1;
        }
    }

    @ApplicationScope
    @Component(modules = {
            AppModule.class
    })
    public interface AppComponent {
        SomeComponent plus(SomeModule someModule);
    }

Ответ 1

  1. Не будьте "умным" и придерживайтесь того, что говорят документы:

    implementation "com.google.dagger:dagger:2.11"
    annotationProcessor "com.google.dagger:dagger-compiler:2.11"
    
  2. При переходе на Dagger 2.9+ используют разные (Custom)Scope для Component и Subcomponent "одиночные".

См. Описание вопроса для более подробного объяснения.

Кроме того, я думаю, что примечания к выпуску для 2.9 могут быть более конкретными в отношении этого изменения, нет? :/https://github.com/google/dagger/releases/tag/dagger-2.9