java.lang.NoSuchMethodException for onCreate

2022-09-01 19:14:27

我在Google Play崩溃日志中看到崩溃,这真的让我感到困惑。

java.lang.RuntimeException: 
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3086)
  at android.app.ActivityThread.handleLaunchActivity (ActivityThread.java:3229)
  at android.app.servertransaction.LaunchActivityItem.execute (LaunchActivityItem.java:78)
  at android.app.servertransaction.TransactionExecutor.executeCallbacks (TransactionExecutor.java:108)
  at android.app.servertransaction.TransactionExecutor.execute (TransactionExecutor.java:68)
  at android.app.ActivityThread$H.handleMessage (ActivityThread.java:1926)
  at android.os.Handler.dispatchMessage (Handler.java:106)
  at android.os.Looper.loop (Looper.java:214)
  at android.app.ActivityThread.main (ActivityThread.java:6981)
  at java.lang.reflect.Method.invoke (Native Method)
  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run (RuntimeInit.java:493)
  at com.android.internal.os.ZygoteInit.main (ZygoteInit.java:1445)
Caused by: androidx.fragment.app.Fragment$InstantiationException: 
  at androidx.fragment.app.Fragment.instantiate (Fragment.java:462)
  at androidx.fragment.app.FragmentContainer.instantiate (FragmentContainer.java:50)
  at androidx.fragment.app.FragmentState.instantiate (FragmentState.java:80)
  at androidx.fragment.app.FragmentManagerImpl.restoreAllState (FragmentManager.java:3109)
  at androidx.fragment.app.FragmentController.restoreAllState (FragmentController.java:158)
  at androidx.fragment.app.FragmentActivity.onCreate (FragmentActivity.java:344)
  at androidx.appcompat.app.AppCompatActivity.onCreate (AppCompatActivity.java:85)
  at com.autotask.jbarra.kotlinmvvm.MainActivity.onCreate (MainActivity.kt:102)
  at android.app.Activity.performCreate (Activity.java:7326)
  at android.app.Activity.performCreate (Activity.java:7317)
  at android.app.Instrumentation.callActivityOnCreate (Instrumentation.java:1271)
  at android.app.ActivityThread.performLaunchActivity (ActivityThread.java:3066)

Caused by: java.lang.NoSuchMethodException: 
  at java.lang.Class.getConstructor0 (Class.java:2328)
  at java.lang.Class.getConstructor (Class.java:1725)
  at androidx.fragment.app.Fragment.instantiate (Fragment.java:443)

问题是,主要活动的102行没什么特别的

    override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState) //This is line 102

这是什么原因造成的?为什么 oncreate 抛出没有这样的方法?它发生在一些用户的设备上,我无法重现它。


答案 1

正在从实例状态包还原活动。还原操作的一部分是重新创建其片段。

您的活动有一个片段,而片段类没有框架所需的 0-arg 构造函数。


答案 2

我遇到了同样的问题。其他答案没有帮助。

对我来说,它看起来像是Proguard。这就解释了为什么它只发生在生产/发布版本中,以及为什么我在调试时无法重现它。

如果您遇到 OP 的问题,请尝试以下操作:

  1. 构建混淆.apk。我使用了签名的那个,我发布到应用商店...
  2. 在设备的开发者选项中启用“不保留活动记录”。
  3. 在设备中安装.apk,然后打开崩溃并包含片段的活动记录。
  4. 离开您的应用程序(最小化/主屏幕按钮/ ...),然后从最近的应用程序菜单中重新打开它。

它会崩溃吗?然后尝试使用未混淆的调试版本。如果没有,那么它可能是Proguard。

为了解决这个问题,我做了以下操作:

  1. 在应用模块的根文件夹中创建 proguard-rules.pro 文件。
  2. 添加 -keep 类 * 将 androidx.fragment.app.Fragment{} 扩展到该文件。
  3. 然后,在应用程序的 build.gradle 中,

加:

buildTypes {
    release {
        minifyEnabled true
        proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
    }
}

在这里查看Yaroslav Mytkalyk的答案:Fragment Instantiation崩溃,它帮助我解决了这个问题,尽管它现在有点旧和过时了(例如,“runProguard true”已经过时了)。

至少现在当我执行上述步骤时它不会崩溃。

PS:正如其他答案中提到的,我这样做是将0-arg构造函数添加到我的片段中,因为这是我第一次修复尝试。我相信Proguard本身就是问题所在,没有必要添加上述构造函数,但我现在无法验证该假设。


推荐