ClassCastException при использовании ViewModelProvider.Factory в сборке выпуска после обфускации R8 (отлично работает прAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 ClassCastException при использовании ViewModelProvider.Factory в сборке выпуска после обфускации R8 (отлично работает пр

Сообщение Anonymous »

Я столкнулся со странной проблемой, которая возникает только в релизной сборке моего приложения для Android (подписанного и загруженного в Google Play).

В режиме отладки все работает отлично.
После публикации или установки подписанной версии приложение немедленно вылетает при запуске с такой ошибкой:

Код: Выделить всё

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
}
}
==> внутри MainActivity.kt:

Код: Выделить всё

val loginViewModel = ViewModelProvider(
this,
LoginViewModelFactory(applicationContext)
)[LoginViewModel::class.java]
==> Конфигурация ProGuard
Мой 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»