Я работаю над проверкой концепции приложения, как разделить другое приложение на несколько модулей.https://github.com/jbruchanov/ModulesAppSample/tree/failing
Использование AS3.3 и Dagger2.21
DI Tree:
AppComponent (@Component)
- SessionComponent (@Subcomponent)
-- BaseActivityComponent (@Subcomponent)
--- FeatureModuleComponent1 (@Subcomponent)
--- FeatureModuleComponent2 (@Subcomponent)
В настоящее время у меня есть 2 типа FeatureModuleComponents - безмодульный, выглядит каки нет никаких проблем, пока что https://github.com/jbruchanov/ModulesAppSample/blob/failing/ui-login/src/main/java/com/example/login/LoginComponent.kt
@ActivityScope
@Subcomponent
interface LoginComponent : IComponent {
fun inject(loginFragment: LoginFragment)
}
@Subcomponent(modules = [HomeModule::class])
@ActivityScope
interface HomeComponent :
SettingsComponent,
IComponent {
fun inject(homeFragment: HomeFragment)
}
Теперь оошибки.Если я использую dagger-compiler только в app
project-module https://github.com/jbruchanov/ModulesAppSample/blob/failing/app/build.gradle#L36, я получаю следующую проблему
\ModulesApp\app\build\generated\source\kapt\debug\com\example\modulesapp\di\DaggerAppComponent.java:13: error: cannot find symbol
import com.example.home.HomeModule_ProvideHomeNavigationFactory;
^
symbol: class HomeModule_ProvideHomeNavigationFactory
location: package com.example.home
Поэтому я добавил dagger-compiler также в ui-home
project-module https://github.com/jbruchanov/ModulesAppSample/blob/failing/ui-home/build.gradle#L46 И помогает в этом конкретном случае.
Затем я добавил еще один проект-модуль ui-reg
, снова используя компонент с использованием модуля https://github.com/jbruchanov/ModulesAppSample/blob/failing/ui-reg/src/main/java/com/example/reg/RegistrationComponent.kt https://github.com/jbruchanov/ModulesAppSample/blob/failing/ui-reg/build.gradle#L40 и теперьЯ сталкиваюсь со следующей проблемой.(не добавление dagger-compiler означает 1-ю ошибку о не сгенерированной фабрике)
java.lang.RuntimeException: com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives:
com.android.builder.dexing.DexArchiveMergerException: Error while merging dex archives:
com.android.tools.r8.CompilationFailedException: Compilation failed to complete
com.android.tools.r8.utils.AbortException: Error: Program type already present: com.example.coreui.BasePresentationFragment_MembersInjector
Поскольку оба модуля проекта генерируют один и тот же код для родительского класса BasePresentationFragment
Быстрый обзор проекта
app
- Модуль прикладного проекта (поколение apk)ui-home
- модуль проекта библиотеки Android, использующий компонент кинжала в зависимости от модуляfailing
- модуль проекта библиотеки Android, использующий компонент кинжала в зависимости от модуляui-*
- Модули проекта библиотеки Android с использованием компонента кинжала не в зависимости от модуля
Я пробовал разные версии кинжала (2.16, 2.20, 2.21) или только appmodule, функциональный модульбез областей и т. д., но у него точно такая же проблема.
1) Правильно ли использовать dagger-compiler только в модуле app
?2) Есть ли обходной путь или я где-то делаю ошибку?