NoClassDefFoundError com.facebook.react.bridge.WritableNativeMap

时间:2017-06-15 13:24:27

标签: android reactjs react-native

我在尝试加载jsbundle(离线反应应用)时随机崩溃

mReactInstanceManager = ReactInstanceManager.builder().setApplication(mActivity.getApplication())
.setJSBundleFile(appPath)
.addPackage(mReactPackage).addPackage(new MyCustomReactPackage())
.setUseDeveloperSupport(false)//For performance use false
.setInitialLifecycleState(LifecycleState.RESUMED)
.setNativeModuleCallExceptionHandler(new NativeModuleCallExceptionHandler() {
       @Override
       public void handleException(Exception e) {
            e.printStackTrace();
            Logger.e(TAG,"Exception while opening app "+ Log.getStackTraceString(e));
       }
       })
.build();
reactRootView.startReactApplication(mReactInstanceManager, launchClassName, initialProps);  

堆栈跟踪:

LOCATION com.facebook.react.JSCConfig$1.a()
EXCEPTION java.lang.NoClassDefFoundError
MESSAGE com.facebook.react.bridge.WritableNativeMap
at com.facebook.react.JSCConfig$1.a()(null:14)
    at com.facebook.react.ReactInstanceManager.k()(null:359)
    at com.facebook.react.ReactInstanceManager.j()(null:353)
    at com.facebook.react.ReactInstanceManager.c()(null:295)
    at com.facebook.react.ReactRootView.a()(null:221)
    at com.example.sdk.uidesign.fragments.AppFragment.b()(null:215)
    at com.example.sdk.uidesign.ActivityV2.a()(null:1265)
    at com.example.sdk.uidesign.adapter.AppsAdapter.a()(null:102)
    at com.example.sdk.uidesign.adapter.AppsAdapter.a()(null:37)
    at com.example.sdk.uidesign.a.e$a$1.onClick()(null:135)
    at android.view.View.performClick()(View.java:4790)
    at android.view.View$PerformClick.run()(View.java:19883)
    at android.os.Handler.handleCallback()(Handler.java:739)
    at android.os.Handler.dispatchMessage()(Handler.java:95)
    at android.os.Looper.loop()(Looper.java:135)
    at android.app.ActivityThread.main()(ActivityThread.java:5268)
    at java.lang.reflect.Method.invoke()(Method.java:-2)
    at java.lang.reflect.Method.invoke()(Method.java:372)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run()(ZygoteInit.java:902)
    at com.android.internal.os.ZygoteInit.main()(ZygoteInit.java:697)

任何帮助都将不胜感激。

1 个答案:

答案 0 :(得分:2)

Android 5.1有一个arbitrary limit of 100 dex files

这是我们在runtime / dex_file.cc

中可以看到的内容
bool DexFile::OpenFromZip(...) {
    ...
    while (i < 100) {
        std::string name = StringPrintf("classes%zu.dex", i)
        ...
    }
    ...
}

因此,如果你有超过100个dex文件,你会得到这个NoClassDefFoundError。

通过禁用pre-dexing

可以避免此错误

一种可能的解决方法是禁用preDexLibraries,这会减少apk中包含的classes.dex文件的数量。

添加

android {
    dexOptions {
        preDexLibraries false
    }
}

到app的build.gradle文件

java.lang.NoClassDefFoundError when running app with Android 5.1 with Android Studio 2.2RC

更新:

似乎真正的问题与使用soloader加载fbjni库有关。 我们最终通过预加载soloader库来解决这个问题

import com.facebook.soloader.SoLoader;

@Override public void onCreate() {

...
...
SoLoader.init(getApplicationContext(), /* native exopackage */ false);
//SoLoader.loadLibrary("fbjni"); //uncomment this line if the issue is not resolved
}