【问题标题】:NoClassDefFoundError on Android Studio project that builds fine构建良好的 Android Studio 项目上的 NoClassDefFoundError
【发布时间】:2015-08-05 18:16:27
【问题描述】:

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

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

我收到以下错误:

08-05 21:05:25.128 25207-25207/? E/dalvikvm﹕找不到类 'com.history.HistoryOrder',引用自方法 com.service.Global。 08-05 21:05:25.138 25207-25207/? E/AndroidRuntime: FATAL EXCEPTION: main java.lang.ExceptionInInitializerError 在 com.imperautus.testProject.ActivitySplash.onCreate(ActivitySplash.java:61) 在 android.app.Activity.performCreate(Activity.java:5326) 在 android.app.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.handleMessage(ActivityThread.java:1289) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:176) 在 android.app.ActivityThread.main(ActivityThread.java:5317) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:511) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 在 dalvik.system.NativeStart.main(本机方法) 原因:java.lang.NoClassDefFoundError: com.history.HistoryOrder 在 com.service.Global.(Global.java:113) 在 com.imperautus.testProject.ActivitySplash.onCreate(ActivitySplash.java:61) 在 android.app.Activity.performCreate(Activity.java:5326) 在 android.app.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.handleMessage(ActivityThread.java:1289) 在 android.os.Handler.dispatchMessage(Handler.java:99) 在 android.os.Looper.loop(Looper.java:176) 在 android.app.ActivityThread.main(ActivityThread.java:5317) 在 java.lang.reflect.Method.invokeNative(Native Method) 在 java.lang.reflect.Method.invoke(Method.java:511) 在 com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1102) 在 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:869) 在 dalvik.system.NativeStart.main(Native Method)

我看到的是它抱怨它找不到类 com.history.HistoryOrder 但这个类在这个确切的位置并且它在转换到新的 Facebook SDK 之前工作(我没有接触过类的代码)。

Global.java:113 说:

public static ArrayList<HistoryOrder> historyOrderList = new ArrayList<HistoryOrder>(); 

public static HistoryOrder historyOrderItem = new HistoryOrder();

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

有什么线索吗?

【问题讨论】:

  • 请检查您的课程路径。 com.history.HistoryOrder
  • 没关系,就是这个……

标签: java android facebook android-studio


【解决方案1】:

java.lang.NoClassDefFoundError 可能会被抛出,因为您已达到 65k 限制 http://developer.android.com/tools/building/multidex.html#about

如果你需要超过 65k 的限制,你必须包括 multidex 支持

分级:

defaultConfig { 
...
multiDexEnabled true
}
...
dependencies {
compile 'com.android.support:multidex:1.0.1'
...
}

清单:

 <application
        ...
        android:name="android.support.multidex.MultiDexApplication">

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

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

请注意,在某些低端设备上添加 MultiDex.install(getBaseContext()); 到您的 CustomApplication onCreate() 还是可以扔java.lang.NoClassDefFoundError

如果是这样,请尝试将 MultiDex.install 添加到 attachBaseContext(Context base)

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

【讨论】:

    【解决方案2】:

    好的,错误似乎是由于一个非常不同的原因:

    该应用已更新为使用 Google Services 7.5,这使得方法超过 65k,这让我将 mutiDexEnabled 添加为 true。

    我不知道是否需要更改代码以支持该功能,但似乎在进行此更改后,应用程序在随机点崩溃(当我注意到历史调用时,可达性类崩溃了,当移除了其他的可达性,等等。

    当然,当编译器抱怨找不到它们时,所有类都在正确的位置 这让我想知道是不是 multidex 造成的,所以我删除了一些库,比如从 7.5 版本的 google play 到 6.5

    应用程序现在编译和运行正常,允许我添加 FB sdk 4+

    我在这里发布这个,所以它可以帮助其他人遇到问题而无法理解他们来自哪里。

    【讨论】:

      【解决方案3】:

      我认为你设置了错误的class path 所以第一次检查你的class path 它会解决你的问题

      【讨论】:

      • 看起来像,但路径完全如图所示,该应用程序在添加 facebook sdk 之前正在运行,所以我认为这里发生了其他事情。例如,如果我评论所有对历史记录的调用,然后另一个类失败(即可达性),它也正常运行等等......
      猜你喜欢
      • 2019-08-12
      • 2013-12-31
      • 1970-01-01
      • 2013-12-25
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 2019-04-26
      • 2023-03-22
      相关资源
      最近更新 更多