2017-06-15 3 views
4

ich zufällig einen Absturz bekommen, wenn ein jsbundle zu laden versuchen (offline reagieren app)NoClassDefFoundError com.facebook.react.bridge.WritableNativeMap

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); 

Stacktrace:

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) 

Beliebig Hilfe wäre willkommen.

+0

Nach dem Absturz ist das Problem beim nächsten Lauf verschwunden. – HimalayanCoder

Antwort

2

Android 5.1 hat eine arbitrary limit of 100 dex files

Hier ist, was wir in runtime/dex_file.cc

bool DexFile::OpenFromZip(...) { 
    ... 
    while (i < 100) { 
     std::string name = StringPrintf("classes%zu.dex", i) 
     ... 
    } 
    ... 
} 

So sehen können, wenn Sie mehr als 100 dex-Dateien haben Sie diese NoClassDefFoundError erhalten.

Es ist möglich, diesen Fehler zu vermeiden, indem sie vorge Dexing

Eine mögliche Abhilfe zu deaktivieren ist preDexLibraries zu deaktivieren, die die Anzahl der classes.dex Dateien reduziert in einem apk enthalten.

android { 
    dexOptions { 
     preDexLibraries false 
    } 
} 

auf die build.gradle Datei App hinzufügen

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

Update:

wie das eigentliche Problem scheint, ist die fbjni Bibliothek Laden mit soloader bezogen. Wir haben dieses Problem behoben, indem wir die Solarbibliothek vorab geladen haben

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 
}