React Native Android Crash:java.lang.NoClassDefFoundError

时间:2017-11-15 12:33:05

标签: android react-native

我刚刚将我的React Native Android应用程序投入生产,一群用户遇到了以下崩溃:

java.lang.NoClassDefFoundError

enter image description here

我不确定如何调试这个。我似乎无法在我的任何物理设备上本地再现它,因为它是Java而不是JavaScript,我有点不熟悉。看起来这些用户都在Android 4.x上,可能与它有关吗?

如果你能帮助我指出正确的方向,我真的很感激!

2 个答案:

答案 0 :(得分:1)

我目前在我的项目中遇到此问题。此问题的根本原因是特定API级别的某些类不可用。

就我而言,我使用了RoleManager,仅在API 29以后才可用。甚至我添加了如下的运行时检查:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
  // Use `RoleManager` ...
}

以上代码行在Native Android项目中运行流畅,但是React Native抛出了错误。这实际上是由导入行引起的!

import android.app.role.RoleManager

尽管目前我找不到有关此现象的任何RN官方文档,但我相信RN在运行开发人员代码之前会检查所有导入是否有效!因此,与原生Android编程流程完全不同!

解决方案可能会将您正在使用的所有内容转移到Util.java / Util.kt中,并在另一个类中完善您的逻辑!

答案 1 :(得分:0)

我有一个无法复制的问题,但是在模拟器Android 4.4中遇到以下错误

我不确定是不是仅返回部分错误的android vitals还是实际上不是相同的错误。

java.lang.RuntimeException:
Unable to get provider com.google.firebase.provider.FirebaseInitProvider: java.lang.ClassNotFoundException
E/AndroidRuntime( 3446):    at android.app.ActivityThread.installProvider(ActivityThread.java:4793)
E/AndroidRuntime( 3446):    at android.app.ActivityThread.installContentProviders(ActivityThread.java:4385)
E/AndroidRuntime( 3446):    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4325)
E/AndroidRuntime( 3446):    at android.app.ActivityThread.access$1500(ActivityThread.java:135)
E/AndroidRuntime( 3446):    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
E/AndroidRuntime( 3446):    at android.os.Handler.dispatchMessage(Handler.java:102)
E/AndroidRuntime( 3446):    at android.os.Looper.loop(Looper.java:136)
E/AndroidRuntime( 3446):    at android.app.ActivityThread.main(ActivityThread.java:5017)
E/AndroidRuntime( 3446):    at java.lang.reflect.Method.invokeNative(Native Method)
E/AndroidRuntime( 3446):    at java.lang.reflect.Method.invoke(Method.java:515)
E/AndroidRuntime( 3446):    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
E/AndroidRuntime( 3446):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
E/AndroidRuntime( 3446):    at dalvik.system.NativeStart.main(Native Method)
E/AndroidRuntime( 3446): Caused by: java.lang.ClassNotFoundException: Didn't find class "com.google.firebase.provider.FirebaseInitProvider"
E/AndroidRuntime( 3446):    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
E/AndroidRuntime( 3446):    at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
E/AndroidRuntime( 3446):    at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
E/AndroidRuntime( 3446):    at android.app.ActivityThread.installProvider(ActivityThread.java:4778)
E/AndroidRuntime( 3446):    ... 12 more

此错误使应用程序在启动时崩溃 我可以通过以下答案解决此问题:https://stackoverflow.com/a/37317943/11170097

使用Multidex。

在您的app / build.gradle中

android {
...               
    defaultConfig {
    ....
        multiDexEnabled true
    }
    ...
}

dependencies {
    implementation 'com.android.support:multidex:1.0.3'
    ...
}

在您的app / src / main / java /.../ MainApplication.java

...
import android.support.multidex.MultiDex;
import android.content.Context;

public class MyApplication extends ... {
  ...

  @Override
  protected void attachBaseContext(Context context) {
      super.attachBaseContext(context);
      MultiDex.install(this);
  }
}