У меня есть настройка проекта с несколькими модулями следующим образом:
модуль приложения
презентационный модуль (модуль Android)
модуль домена (модуль Kotlin)
модуль данных (модуль Android)
Граф зависимостей
презентация -> домен <- данные
И приложение имеет зависимости во всех модулях.
Код следующий:
модуль домена:
interface RemoteVenuesDataSource {
suspend fun getVenues(): Result<List<Venue>, DataError.Network>
}
class GetVenuesUseCase(
private val remoteVenuesDataSource: RemoteVenuesDataSource,
) {
suspend operator fun invoke() = remoteVenuesDataSource.getVenues()
}
модуль данных:
@Provides
@Singleton
fun provideHttpClient(): HttpClient {
return HttpClientFactory().build()
}
@Provides
@Singleton
fun provideRemoteVenuesDataSource(
httpClient: HttpClient,
): RemoteVenuesDataSource {
return KtorVenuesRemoteDataSource(
httpClient = httpClient
)
}
презентационный модуль:
class GetVenuesUseCase(
private val remoteVenuesDataSource: RemoteVenuesDataSource,
) {
suspend operator fun invoke() = remoteVenuesDataSource.getVenues()
}
@Provides
@ViewModelScoped
fun provideGetVenuesUseCase(
remoteVenuesDataSource: RemoteVenuesDataSource,
): GetVenuesUseCase {
return GetVenuesUseCase(
remoteVenuesDataSource
)
}
и это вводится в модель представления:
@HiltViewModel
class VenuesViewModel @Inject constructor(
private val getVenuesUseCase: GetVenuesUseCase,
)
и эта модель представления используется следующим образом:
@Composable
fun VenuesScreenRoot(
viewModel: VenuesViewModel = hiltViewModel(),
) {
Text(text = "Temp")
viewModel.temp()
}
И в модуле приложения:
@AndroidEntryPoint
class MainActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
setContent {
TempTheme {
Scaffold(modifier = Modifier.fillMaxSize()) { innerPadding ->
Greeting(
name = "Android",
modifier = Modifier.padding(innerPadding)
)
VenuesScreenRoot(
)
}
}
}
}
}
Когда я запускаю сборку в режиме отладки, все работает, но если я переключусь на сборку выпуска (с включенным минимизацией), она сломается.
Модуль приложения генерирует это missing_rules.txt
# Please add these rules to your existing keep rules in order to suppress warnings.
# This is generated automatically by the Android Gradle plugin.
-dontwarn com.temp.data.di.SingletonModule
-dontwarn com.temp.data.di.SingletonModule_ProvideHttpClientFactory
-dontwarn com.temp.data.di.SingletonModule_ProvideRemoteVenuesDataSourceFactory
-dontwarn com.temp.presentation.theme.ThemeKt
-dontwarn com.temp.presentation.venus.VenuesScreenKt
-dontwarn com.temp.presentation.venus.VenuesViewModel
и это сообщение об ошибке:
Missing class com.temp.data.di.SingletonModule (referenced from: com.temp.data.di.SingletonModule com.temp.DaggerHoaxCoffeeApplication_HiltComponents_SingletonC$Builder.singletonModule and 5 other contexts)
Missing class com.temp.data.di.SingletonModule_ProvideHttpClientFactory (referenced from: java.lang.Object com.temp.DaggerHoaxCoffeeApplication_HiltComponents_SingletonC$SingletonCImpl$SwitchingProvider.get())
Missing class com.temp.data.di.SingletonModule_ProvideRemoteVenuesDataSourceFactory (referenced from: java.lang.Object com.temp.DaggerHoaxCoffeeApplication_HiltComponents_SingletonC$SingletonCImpl$SwitchingProvider.get())
Missing class com.temp.data.di.SingletonModule_ProvideTempFactory (referenced from: java.lang.Object com.temp.DaggerHoaxCoffeeApplication_HiltComponents_SingletonC$SingletonCImpl$SwitchingProvider.get())
Missing class com.temp.presentation.theme.ThemeKt (referenced from: void com.temp.ComposableSingletons$MainActivityKt$lambda-3$1.invoke(androidx.compose.runtime.Composer, int))
Missing class com.temp.presentation.venus.VenuesScreenKt (referenced from: void com.hoax.coffee.ComposableSingletons$MainActivityKt$lambda-1$1.invoke(androidx.compose.foundation.layout.PaddingValues, androidx.compose.runtime.Composer, int))
Missing class com.temp.presentation.venus.VenuesViewModel (referenced from: void com.temp.ComposableSingletons$MainActivityKt$lambda-1$1.invoke(androidx.compose.foundation.layout.PaddingValues, androidx.compose.runtime.Composer, int))
и
Caused by: [CIRCULAR REFERENCE: com.android.tools.r8.internal.g: Missing class com.temp.data.di.SingletonModule (referenced from: com.temp.data.di.SingletonModule com.temp.DaggerHoaxCoffeeApplication_HiltComponents_SingletonC$Builder.singletonModule and 5 other contexts)
Но я не хочу добавлять файлы сохранения в модуль приложения, потому что в конечном итоге мне придется добавить так много всего, что я потеряю смысл R8.
Как вы можете видеть, я также создал файл Theme и VenusViewModel в пакете презентации, и R8 также жалуется на это. Если бы мне пришлось добавлять каждую модель представления, которую я создаю, в пакет презентации, тогда R8 просто потерял бы свой смысл.
agp = "8.5.1"
hilt = "2.51.1"
kotlin = "2.0.0"
ksp = "1.8.10-1.0.9"
У меня была такая же ошибка в моем многомодульном проекте после обновления плагина Gradle, и причина была в следующем: https://developer.android.com/build/releases/past-releases/agp-8-4-0-release-notes #библиотека-классы-сжата
Поэтому я установил для minifyEnabled
значение true только в моем модуле app
и значение false во всех остальных модулях. Другой вариант — добавить
android.disableMinifyLocalDependenciesForLibraries=false
в файл gradle.properties.