最近我写了一个简单的Android应用程序。
该应用程序有一个简单的MainActivity和一个ViewModel。在编写代码时,我确实声明了ViewModel类是公共的。
就在我完成应用程序之前,我查看了警告并看到一个警告说ViewModel类的访问修饰符可以成为包而不是公共。
当时我没有多想,删除了public修饰语。
我测试了该应用程序,一切正常。
然后,我创建了一个发布版本,应用程序在启动时崩溃了。我没有联系到为什么会发生这种情况,但通过快速查看堆栈跟踪,我得到了它。我将公共修饰符添加回ViewModel类,一切都正常工作。
由于ViewModel实际上是由我的包之外的提供者实例化的,因此ViewModel必须有一个公共修饰符。
我的问题是为什么我的应用程序在调试编译配置中正常工作,因为我希望它也会在那里崩溃……
我的视图模型:
import android.app.Application;
import android.util.Log;
import androidx.lifecycle.AndroidViewModel;
import java.util.ArrayList;
import java.util.Random;
public class TilesViewModel extends AndroidViewModel {
我创建的ViewModel:
mViewModel = ViewModelProviders.of(this).get(TilesViewModel.class);
崩溃:
Caused by: java.lang.RuntimeException: Cannot create an instance of class il.co.woo.karuba.TilesViewModel
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:234)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:164)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:130)
at il.co.woo.karuba.MainActivity.onCreate(MainActivity.java:70)
at android.app.Activity.performCreate(Activity.java:6679)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
Caused by: java.lang.IllegalAccessException: java.lang.Class<il.co.woo.karuba.TilesViewModel> is not accessible from java.lang.Class<androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory>
at java.lang.reflect.Constructor.newInstance0(Native Method)
at java.lang.reflect.Constructor.newInstance(Constructor.java:430)
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:230)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:164)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:130)
at il.co.woo.karuba.MainActivity.onCreate(MainActivity.java:70)
at android.app.Activity.performCreate(Activity.java:6679)
at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
at android.app.ActivityThread.-wrap12(ActivityThread.java)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:154)
at android.app.ActivityThread.main(ActivityThread.java:6119)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
例如,与ViewModel创建相关的原因有很多。
但是在您的情况下,在Debug中而不是在Release中工作可能是由于ProGuard可能正在截断未使用的访问修饰符或构造函数,这可能会导致此问题。
参考讨论