Обнаружены отсутствующие классы при запуске R8

У меня есть настройка проекта с несколькими модулями следующим образом:

  • модуль приложения

  • презентационный модуль (модуль 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"
2
0
115
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

У меня была такая же ошибка в моем многомодульном проекте после обновления плагина Gradle, и причина была в следующем: https://developer.android.com/build/releases/past-releases/agp-8-4-0-release-notes #библиотека-классы-сжата

Поэтому я установил для minifyEnabled значение true только в моем модуле app и значение false во всех остальных модулях. Другой вариант — добавить android.disableMinifyLocalDependenciesForLibraries=false в файл gradle.properties.

Другие вопросы по теме