React Native Android 崩溃:java.lang.NoClassDefFoundError

4

我最近刚刚将我的React Native Android应用程序投入生产,但许多用户遇到了以下崩溃问题:

java.lang.NoClassDefFoundError

在此输入图片描述

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

如果您能帮助我指明方向,我将不胜感激!

2个回答

2

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

对于我的情况,我使用了RoleManager,它仅在API 29及以上版本中可用。即使我添加了运行时检查:

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

上述代码在原生Android项目中运行顺利,但在React Native中出现了错误。实际上,这是由于导入行引起的!
import android.app.role.RoleManager

尽管我目前无法找到有关这种现象的官方RN文档,但我相信在运行开发者代码之前,RN会检查所有导入是否有效!因此,这与本地Android编程流程完全不同!

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


API级别23怎么样?它应该在这里https://developer.android.com/reference/android/telecom/InCallService?hl=en 如何在API级别23中实现? - user8462556
我的情况与代码所属的API级别无关,而是由于Java文件顶部的导入语句。React Native在识别导入代码方面有一些奇怪的实现。尝试使用一个新的Java文件来实现所有代码并链接到你的桥接模块。这样,React Native就可以识别代码了。虽然很奇怪,但却有效。 - Myrick Chow

2

我遇到了同样的问题,但我无法重现,但在模拟器中出现了以下错误: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://dev59.com/mVoU5IYBdhLWcg3wk3p2#37317943修复了它。

使用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);
  }
}

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