Android:致命异常:java.lang.NoClassDefFoundError(三星4.4.2)

时间:2017-10-06 15:37:25

标签: android android-multidex

此崩溃仅出现在具有4.4.2 SDK版本且处于root模式(Crashlytics信息)的三星上:

Fatal Exception: java.lang.NoClassDefFoundError: android/graphics/drawable/Icon
       at java.lang.Class.getDeclaredMethods(Class.java)
       at java.lang.Class.getDeclaredMethods(Class.java:656)
       at android.view.ViewDebug.getExportedPropertyMethods(ViewDebug.java:960)
       at android.view.ViewDebug.exportMethods(ViewDebug.java:1047)
       at android.view.ViewDebug.dumpViewProperties(ViewDebug.java:997)
       at android.view.ViewDebug.dumpViewProperties(ViewDebug.java:983)
       at android.view.ViewDebug.dumpView(ViewDebug.java:900)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:870)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dump(ViewDebug.java:793)
       at android.view.ViewDebug.dispatchCommand(ViewDebug.java:416)
       at android.view.ViewRootImpl$W.executeCommand(ViewRootImpl.java:6258)
       at android.view.IWindow$Stub.onTransact(IWindow.java:65)
       at android.os.Binder.execTransact(Binder.java:404)
       at dalvik.system.NativeStart.run(NativeStart.java)
Caused by java.lang.ClassNotFoundException: Didn't find class "android.graphics.drawable.Icon" on path: DexPathList[[zip file "/data/app/com.xxx-1.apk", zip file "/data/data/com.xxx/code_cache/secondary-dexes/com.xxx-1.apk.classes2.zip"],nativeLibraryDirectories=[/data/app-lib/com.xxx-1, /vendor/lib, /system/lib]]
       at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:497)
       at java.lang.ClassLoader.loadClass(ClassLoader.java:457)
       at java.lang.Class.getDeclaredMethods(Class.java)
       at java.lang.Class.getDeclaredMethods(Class.java:656)
       at android.view.ViewDebug.getExportedPropertyMethods(ViewDebug.java:960)
       at android.view.ViewDebug.exportMethods(ViewDebug.java:1047)
       at android.view.ViewDebug.dumpViewProperties(ViewDebug.java:997)
       at android.view.ViewDebug.dumpViewProperties(ViewDebug.java:983)
       at android.view.ViewDebug.dumpView(ViewDebug.java:900)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:870)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dumpViewHierarchy(ViewDebug.java:867)
       at android.view.ViewDebug.dump(ViewDebug.java:793)
       at android.view.ViewDebug.dispatchCommand(ViewDebug.java:416)
       at android.view.ViewRootImpl$W.executeCommand(ViewRootImpl.java:6258)
       at android.view.IWindow$Stub.onTransact(IWindow.java:65)
       at android.os.Binder.execTransact(Binder.java:404)
       at dalvik.system.NativeStart.run(NativeStart.java)

我无法理解为什么。我的projet正确配置了Dex概念:

在Gradle文件中:

defaultConfig {

    minSdkVersion 19 // Min SDK supported by this app (= KITKAT)
    targetSdkVersion 26 // SDK dedicated for this app

    // Enabling multidex support.
    multiDexEnabled true

    ...

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')

    // https://developer.android.com/studio/build/multidex.html
    implementation 'com.android.support:multidex:1.0.2'

    ...

我的应用程序扩展了MultiDexApp:

public class MyApplication extends MultiDexApplication { ...

你对这次事故有什么解释吗?

非常感谢你们

2 个答案:

答案 0 :(得分:3)

我在使用Android 4.4的小米设备中遇到了同样的错误。您可以通过在attachBaseContext()和普通的Application:

中添加multidex来解决问题
public class MyApplication extends Application {

  @Override protected void attachBaseContext(Context base) {
    super.attachBaseContext(base);
    MultiDex.install(this);
  }

}

然后将以下代码添加到您的应用build.gradle

android {

  ...

    dexOptions {
      jumboMode true
      javaMaxHeapSize "4g"
    } 
  ...
}

我已在Android 4.1,4.4,5.0和6.0上测试了代码

答案 1 :(得分:0)

在Android 5.0之前,Multidex工作非常不稳定。我不能为我的两个项目正确运行它。尝试将所有构建工具更新为上一版本并禁用即时运行。例如,一些图书馆不支持multidex - https://issuetracker.google.com/issues/63999442