Проблемы мультимодульного проекта Android: «Не удается найти символ XXXProvide_XXXFactory» или «DexArchiveMergerException» - PullRequest
0 голосов
/ 19 января 2019

Я работаю над проверкой концепции приложения, как разделить другое приложение на несколько модулей.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) Есть ли обходной путь или я где-то делаю ошибку?

...