【问题标题】:React Native Android Crash: java.lang.NoClassDefFoundErrorReact Native Android 崩溃:java.lang.NoClassDefFoundError
【发布时间】:2018-04-28 16:28:53
【问题描述】:

我刚刚将我的 React Native Android 应用程序投入生产,一群用户正在经历以下崩溃:

java.lang.NoClassDefFoundError

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

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

【问题讨论】:

    标签: android react-native


    【解决方案1】:

    我遇到了无法重现的相同问题,但在模拟器中出现以下错误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

    使用多索引。

    在你的 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);
      }
    }
    

    【讨论】:

      【解决方案2】:

      我目前在我的项目中遇到了这个问题。此问题的根本原因是特定 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 在运行开发人员的代码之前会检查所有导入是否有效!所以,和 Native Android 编程流程完全不同!

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

      【讨论】:

      • API 级别 23 怎么样?它应该在那里 developer.android.com/reference/android/telecom/… 如何在 API 级别 23 中做到这一点?
      • 我的案例与代码属于哪个API级别无关,而是由于java文件顶部的import语句。 React Native 在识别导入代码方面有一些奇怪的实现。尝试使用新的 java 文件来实现所有代码并链接到您的桥接模块。这样React Native就可以识别代码了。这很奇怪,但很有效。
      猜你喜欢
      • 1970-01-01
      • 2021-03-04
      • 2019-08-07
      • 1970-01-01
      • 2018-02-04
      • 2019-02-23
      • 1970-01-01
      • 2022-11-08
      • 1970-01-01
      相关资源
      最近更新 更多