我只是在minifyEnabled为true时才会收到错误(即使使用-dontobfuscate)
java.lang.RuntimeException: Cannot create an instance of class com.myapps.app.TracksVM
at androidx.lifecycle.ViewModelProvider$AndroidViewModelFactory.create(ViewModelProvider.java:202)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:135)
at androidx.lifecycle.ViewModelProvider.get(ViewModelProvider.java:103)
at com.myapps.app.MyFragment.onCreateView(MyFragment.kt:72)
支持库源中的ViewModelProvider.java:202指的是:
try {
return modelClass.getConstructor(Application.class).newInstance(mApplication);
} catch (NoSuchMethodException e) {
throw new RuntimeException("Cannot create an instance of " + modelClass, e);
}
Proguard可能删除了一个方法或构造函数?
这是我的proguard.pro:
-dontwarn okhttp3.**
-dontwarn okio.**
-dontwarn javax.annotation.**
-dontwarn org.conscrypt.**
-keepnames class okhttp3.internal.publicsuffix.PublicSuffixDatabase
-dontobfuscate
ViewModel:
class TracksVM(application: Application) : AndroidViewModel(application) {
...
}
碎片:
class MyFragment : Fragment() {
private lateinit var viewModel: TracksVM
override fun onCreateView(inflater: LayoutInflater, container: ViewGroup?, savedInstanceState: Bundle?): View {
return inflater.inflate(R.layout.content_recents, container, false)
}
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
viewModel = ViewModelProviders.of(this).get(TracksVM::class.java)
}
}
你没有传递viewModelProvider工厂 -
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
viewModel = ViewModelProviders.of(this,viewModelProvidersFactory).get(TracksVM::class.java)
}
我希望这能帮到您。
android生命周期aar的消费者Proguard规则中缺少以下规则:
-keepclassmembers,allowshrinking,allowobfuscation class * extends android.arch.lifecycle.AndroidViewModel {
<init>(android.app.Application);
}
当使用最新版本(androidx?)时,它应该是afaik修复。