构建良好的Android Studio项目上的NoClassDefFoundError

Sha*_*don 2 java android facebook android-studio

我不是Android开发人员,但我正在尝试为Android Studio上的应用程序升级Facebook SDK.之前的SDK是3.5,我试图添加4.4.1

我按照入门指南编写了登录类,但现在当我尝试在设备上启动应用程序时,虽然它编译得很好,但它在启动时崩溃了.

我收到以下错误:

08-05 21:05:25.128 25207-25207 /?E/dalvikvm:无法找到从com.service.Global方法引用的类'com.history.HistoryOrder'.08-05 21:05:25.138 25207-25207 /?E/AndroidRuntime:FATAL EXCEPTION:在android.app的android.app.Activity.performCreate(Activity.java:5326)的com.imperautus.testProject.ActivitySplash.onCreate(ActivitySplash.java:61)中的主要java.lang.ExceptionInInitializerError. Instrumentation.callActivityOnCreate(Instrumentation.java:1097)在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2218)的android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2309)android.app.ActivityThread.access $ 700( ActivityThread.java:157)在android.app.ActivityThread $ H. 引起:java.lang.NoClassDefFoundError:com.history.HistoryOrder at com.service.Global.(Global.java:113)位于android.app的android.app.Activity.performCreate(Activity.java:5326)的com.imperautus.testProject.ActivitySplash.onCreate(ActivitySplash.java:61) .Instrumentation.callActivityOnCreate(Instrumentation.java:1097)在android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2218)的android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2309)android.app.ActivityThread.access $ 700 (ActivityThread.java:157)在android.app.A.运行时,Android.O.Roper.loop(Looper)上的android.app.ActivityThread $ H.handleMessage(ActivityThread.java:1289)位于android.os.Handler.dispatchMessage(Handler.java:99). java:176)在android.app.ActivityThread.main(ActivityThread.java:5317)at java.lang.reflect.Method.invokeNative(Native Method)at java.lang.reflect.Method.invoke(Method.java:511)at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run(ZygoteInit. java:1102)at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869)at dalvik.system.NativeStart.main(Native Method)

我所看到的是,它抱怨它无法找到类com.history.HistoryOrder,但这个类在这个确切的位置,它在转换到新的Facebook SDK之前工作(我没有触及类的代码).

Global.java:113说:

public static ArrayList<HistoryOrder> historyOrderList = new ArrayList<HistoryOrder>(); 
Run Code Online (Sandbox Code Playgroud)

public static HistoryOrder historyOrderItem = new HistoryOrder();

我还将我的代码中的所有引用从app.Fragment更改为support.v4.app.Fragment版本,因为我认为这导致了问题.

有线索吗?

Tou*_*der 6

java.lang.NoClassDefFoundError可以抛出,因为你达到了65k的限制http://developer.android.com/tools/building/multidex.html#about

如果您需要超过65k限制,则必须包含multidex支持

gradle这个:

defaultConfig { 
...
multiDexEnabled true
}
...
dependencies {
compile 'com.android.support:multidex:1.0.1'
...
}
Run Code Online (Sandbox Code Playgroud)

表现:

 <application
        ...
        android:name="android.support.multidex.MultiDexApplication">
Run Code Online (Sandbox Code Playgroud)

如果您有自定义应用程序类:

extend MultiDexApplication 添加MultiDex.install(getBaseContext());到您的CustomApplication onCreate()

请注意,在某些低端设备上添加 MultiDex.install(getBaseContext());CustomApplication onCreate() 仍然可以抛出java.lang.NoClassDefFoundError:

如果是这样尝试添加MultiDex.installattachBaseContext(Context base)代替

public class CustomApplication extends Application {
...
   @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(base);
    }
...
Run Code Online (Sandbox Code Playgroud)