В режиме отладки все работает отлично.
После публикации или установки подписанной версии приложение немедленно вылетает при запуске с такой ошибкой:
Код: Выделить всё
FATAL EXCEPTION: main
Process: at.tennis4fun.app, PID: 7836
java.lang.RuntimeException: Unable to start activity ComponentInfo{at.tennis4fun.app/at.tennis4fun.app.MainActivity}: java.lang.ClassCastException
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:4454)
...
Caused by: java.lang.ClassCastException
at l4.g.(r8-map-id-063321e793e42ea1b79bba6ca4750500941fb21a16cf1f49fdcc80c93b685877:248)
at i3.n.a(...)
at androidx.lifecycle.y0.c(...)
at e0.q.k(...)
at androidx.lifecycle.a1.a(...)
at at.tennis4fun.app.MainActivity.onCreate(MainActivity.kt:30)
Сбой происходит только в релизной версии, а не при отладке или при запуске из Android Studio.
Отключение R8/ProGuard (minifyEnabled false, ShrinkResources false) приводит к исчезновению сбоя — так что это явно вызвано сжатием или обфускацией кода.
Я использую простую настройку ViewModelProvider.Factory для внедрения контекста приложения:
Код: Выделить всё
class LoginViewModelFactory(private val context: Context) : ViewModelProvider.Factory {
@Suppress("UNCHECKED_CAST")
override fun create(modelClass: Class): T {
return LoginViewModel(context) as T
}
}
Код: Выделить всё
val loginViewModel = ViewModelProvider(
this,
LoginViewModelFactory(applicationContext)
)[LoginViewModel::class.java]
Мой proguard-rules.pro включает в себя:
Конфигурацию ProGuard
Код: Выделить всё
-keep class at.tennis4fun.app.viewmodel.** { *; }
-keep class at.tennis4fun.app.ui.** { *; }
-keep class at.tennis4fun.app.security.** { *; }
-keep class at.tennis4fun.app.util.** { *; }
-keep class * extends android.app.Activity
-keep class * extends androidx.activity.ComponentActivity
-keep class androidx.lifecycle.** { *; }
-dontwarn androidx.lifecycle.**
==> Вопрос
Что может вызвать это исключение ClassCastException после обфускации R8, когда тот же код отлично работает при отладке?
Есть ли что-то особенное в том, как ViewModelProvider или Jetpack Compose обрабатывает общие типы, которые мне нужно сохранить с помощью ProGuard?
/>Будем очень признательны за любую помощь или информацию
==> Среда
Android Studio 2024.1.2 (AGP 8.5.0)
Kotlin 1.9+
Jetpack Compose
Использование пользовательского ViewModelFactory и помощника по ручному шифрованию
Подробнее здесь: https://stackoverflow.com/questions/798 ... ld-after-r
Мобильная версия