如果minifyEnabled为true且涉及ViewModel类,则会出现RuntimeException

4
如果minifyEnabledfalse,一切正常。但是当我将minifyEnabled更改为true时,会发生运行时异常:
java.lang.RuntimeException: Unable to start activity ComponentInfo{.ui.main.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class .ui.main.MainViewModel

我的MainActivity类继承了AppCompatActivity,并实现了LifecycleRegistryOwner,然后我声明:

  private val lifecycleRegistry: LifecycleRegistry by lazy { LifecycleRegistry(this) }
  private val viewModel: MainViewModel by lazy { ViewModelProviders.of(this).get(MainViewModel::class.java) }
  override fun getLifecycle(): LifecycleRegistry = lifecycleRegistry
  // and other simple stuff

我应该在我的proguard-rules文件中添加一些内容吗?

完整的异常日志:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: com.appchamp.wordchunks, PID: 32558
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{com.appchamp.wordchunks/com.appchamp.wordchunks.ui.main.MainActivity}: java.lang.RuntimeException: Cannot create an instance of class com.appchamp.wordchunks.ui.main.MainViewModel
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3253)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349)
                      at android.app.ActivityThread.access$1100(ActivityThread.java:221)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      at android.os.Looper.loop(Looper.java:158)
                      at android.app.ActivityThread.main(ActivityThread.java:7224)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
                   Caused by: java.lang.RuntimeException: Cannot create an instance of class com.appchamp.wordchunks.ui.main.MainViewModel
                      at android.arch.lifecycle.ViewModelProviders$DefaultFactory.create(Unknown Source)
                      at android.arch.lifecycle.ViewModelProvider.get(Unknown Source)
                      at android.arch.lifecycle.ViewModelProvider.get(Unknown Source)
                      at com.appchamp.wordchunks.ui.main.l.a(Unknown Source)
                      at a.e.a(Unknown Source)
                      at com.appchamp.wordchunks.ui.main.MainActivity.c(Unknown Source)
                      at com.appchamp.wordchunks.ui.main.MainActivity.onStart(Unknown Source)
                      at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1265)
                      at android.app.Activity.performStart(Activity.java:6915)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3216)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349) 
                      at android.app.ActivityThread.access$1100(ActivityThread.java:221) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:158) 
                      at android.app.ActivityThread.main(ActivityThread.java:7224) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
                   Caused by: java.lang.reflect.InvocationTargetException
                      at java.lang.reflect.Constructor.newInstance(Native Method)
                      at android.arch.lifecycle.ViewModelProviders$DefaultFactory.create(Unknown Source) 
                      at android.arch.lifecycle.ViewModelProvider.get(Unknown Source) 
                      at android.arch.lifecycle.ViewModelProvider.get(Unknown Source) 
                      at com.appchamp.wordchunks.ui.main.l.a(Unknown Source) 
                      at a.e.a(Unknown Source) 
                      at com.appchamp.wordchunks.ui.main.MainActivity.c(Unknown Source) 
                      at com.appchamp.wordchunks.ui.main.MainActivity.onStart(Unknown Source) 
                      at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1265) 
                      at android.app.Activity.performStart(Activity.java:6915) 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3216) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349) 
                      at android.app.ActivityThread.access$1100(ActivityThread.java:221) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:158) 
                      at android.app.ActivityThread.main(ActivityThread.java:7224) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
                   Caused by: java.lang.AssertionError: impossible
                      at java.lang.Enum$1.create(Enum.java:45)
                      at java.lang.Enum$1.create(Enum.java:35)
                      at libcore.util.BasicLruCache.get(BasicLruCache.java:54)
                      at java.lang.Enum.getSharedConstants(Enum.java:211)
                      at java.util.EnumMap.initialization(EnumMap.java:738)
                      at java.util.EnumMap.<init>(EnumMap.java:391)
                      at io.realm.ad.<init>(Unknown Source)
                      at io.realm.ad.a(Unknown Source)
                      at io.realm.ad.a(Unknown Source)
                      at io.realm.aa.l(Unknown Source)
                      at com.appchamp.wordchunks.ui.main.MainViewModel.<init>(Unknown Source)
                      at java.lang.reflect.Constructor.newInstance(Native Method) 
                      at android.arch.lifecycle.ViewModelProviders$DefaultFactory.create(Unknown Source) 
                      at android.arch.lifecycle.ViewModelProvider.get(Unknown Source) 
                      at android.arch.lifecycle.ViewModelProvider.get(Unknown Source) 
                      at com.appchamp.wordchunks.ui.main.l.a(Unknown Source) 
                      at a.e.a(Unknown Source) 
                      at com.appchamp.wordchunks.ui.main.MainActivity.c(Unknown Source) 
                      at com.appchamp.wordchunks.ui.main.MainActivity.onStart(Unknown Source) 
                      at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1265) 
                      at android.app.Activity.performStart(Activity.java:6915) 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3216) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349) 
                      at android.app.ActivityThread.access$1100(ActivityThread.java:221) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:158) 
                      at android.app.ActivityThread.main(ActivityThread.java:7224) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120) 
                   Caused by: java.lang.NoSuchMethodException: values []
                      at java.lang.Class.getMethod(Class.java:630)
                      at java.lang.Class.getDeclaredMethod(Class.java:589)
                      at java.lang.Enum$1.create(Enum.java:41)
                      at java.lang.Enum$1.create(Enum.java:35) 
                      at libcore.util.BasicLruCache.get(BasicLruCache.java:54) 
                      at java.lang.Enum.getSharedConstants(Enum.java:211) 
                      at java.util.EnumMap.initialization(EnumMap.java:738) 
                      at java.util.EnumMap.<init>(EnumMap.java:391) 
                      at io.realm.ad.<init>(Unknown Source) 
                      at io.realm.ad.a(Unknown Source) 
                      at io.realm.ad.a(Unknown Source) 
                      at io.realm.aa.l(Unknown Source) 
                      at com.appchamp.wordchunks.ui.main.MainViewModel.<init>(Unknown Source) 
                      at java.lang.reflect.Constructor.newInstance(Native Method) 
                      at android.arch.lifecycle.ViewModelProviders$DefaultFactory.create(Unknown Source) 
                      at android.arch.lifecycle.ViewModelProvider.get(Unknown Source) 
                      at android.arch.lifecycle.ViewModelProvider.get(Unknown Source) 
                      at com.appchamp.wordchunks.ui.main.l.a(Unknown Source) 
                      at a.e.a(Unknown Source) 
                      at com.appchamp.wordchunks.ui.main.MainActivity.c(Unknown Source) 
                      at com.appchamp.wordchunks.ui.main.MainActivity.onStart(Unknown Source) 
                      at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1265) 
                      at android.app.Activity.performStart(Activity.java:6915) 
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:3216) 
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:3349) 
                      at android.app.ActivityThread.access$1100(ActivityThread.java:221) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1794) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      at android.os.Looper.loop(Looper.java:158) 
                      at android.app.ActivityThread.main(ActivityThread.java:7224) 
                      at java.lang.reflect.Method.invoke(Native Method) 
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230) 
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)  end

1
你需要配置proguard-rules以保留类成员。请查看以下链接:https://gist.github.com/Jackgris/c4a71328b1ae346cba04#file-proguard-rules - Stanislav Bondar
3个回答

3
我能通过在我的proguard-rules.pro文件中添加以下行来解决问题。
-keep class * extends androidx.lifecycle.ViewModel { *; }

在我的情况下,我使用了一个自定义的ViewModelProvider,这意味着我的init()语句包含了许多参数。如果您没有使用自定义的ViewModelProvider,则可以按照Android ViewModel ProGuard示例文件中所述的以下方式进行操作:

-keep class * extends androidx.lifecycle.ViewModel {
    <init>();
}

-2

当你将minifyEnabled设置为true时,Proguard会缩小和混淆你的模型类,导致Activity无法识别它。请在你的proguard-rules.pro文件中添加以下行:

-keep class com.appchamp.wordchunks.ui.main.MainViewModel;

这不是解决方案。 - JuliaKo
@JuliaKo,你可以试着把 "ViewModelProviders.of(this)" 改为 "ViewModelProviders.of(this, viewModelFactory)"。 - Girish H

-4
要使用ProGuard进行代码缩减,请在build.gradle文件中的适当构建类型中添加minifyEnabled true。
以下代码片段从build.gradle文件中启用发布版本的代码缩减:
android {
    buildTypes {
        release {
            minifyEnabled true
            proguardFiles getDefaultProguardFile('proguard-android.txt'),
                    'proguard-rules.pro'
        }
    }
    ...
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接