[crash修复]NoClassDefFoundError:原因:由于导包的时候包名大小写和自己在类里面的时候不一致导致的,找不到,
类com.txznet.music.image.imageLoader.ImageLoaderUtils但是这里面的包是Imageloader(大小写不一致)在release的时候可以正确release出来,但是使用到的时候就出现这样的问题。
java.lang.NoClassDefFoundError: Failed resolution of: Lcom/txznet/music/image/c/a;
at com.txznet.music.image.ImageFactory.init(Proguard:33)
at com.txznet.music.image.ImageFactory.(Proguard:25)
at com.txznet.music.image.ImageFactory.getInstance(Proguard:45)
at com.txznet.music.utils.PlayerCommunicationManager.sendPlayItemChanged(Proguard:219)
at com.txznet.music.utils.SyncOtherAppBroadcastListener.onPlayerPreparing(Proguard:22)
at com.txznet.music.playerModule.logic.PlayerControlManager.notifyOnPreparedListener(Proguard:76)
at com.txznet.audio.player.RemoteTestAudioPlayer$5.handleMessage(Proguard:504)
at android.os.Handler.dispatchMessage(Handler.java:111)
at android.os.Looper.loop(Looper.java:207)
at android.app.ActivityThread.main(ActivityThread.java:5737)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:834)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:724)
Caused by: java.lang.ClassNotFoundException: Didn't find class "com.txznet.music.image.c.a" on path: DexPathList[[zip file "/data/app/com.txznet.music-1/base.apk"],nativeLibraryDirectories=[/data/user/0/com.txznet.music/solibs, /data/user/0/com.txznet.music/solibs, /data/user/0/com.txznet.music/solibs, /data/app/com.txznet.music-1/lib/arm, /data/app/com.txznet.music-1/base.apk!/lib/armeabi-v7a, /data/user/0/com.txznet.music/solibs, /data/user/0/com.txznet.music/solibs, /data/user/0/com.txznet.music/solibs, /vendor/lib, /system/lib]]
at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
... 13 more
Suppressed: java.lang.ClassNotFoundException: com.txznet.music.image.c.a
at java.lang.Class.classForName(Native Method)
at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
... 14 more
Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
在AndroidStudio里面报的错误时:
Error:Error converting bytecode to dex:
Cause: java.lang.RuntimeException: Exception parsing classes
Error:Error converting bytecode to dex:
Cause: java.lang.RuntimeException: Exception parsing classes
Error:Error converting bytecode to dex:
Cause: java.lang.RuntimeException: Exception parsing classes
Error:3 errors; aborting
Error:Execution failed for task ':TXZMusic4.0:transformClassesWithDexForDebug'.
> com.android.build.api.transform.TransformException: java.lang.RuntimeException: com.android.ide.common.process.ProcessException: java.util.concurrent.ExecutionException: com.android.ide.common.process.ProcessException: Return code 1 for dex process
但是使用gradle的assembleRelease的时候,可以正常编译通过,这个让人匪夷所思。
同时如果改掉package的包名为ImageLoder的时候
AndroidStudio才会认为这里出现了异常并提示找不到类
F:\workspace\java\android\projects\rearview_mirror_steady\TXZMusic4.0\src\com\txznet\music\image\ImageFactory.java
Error:(9, 42) 错误: 程序包com.txznet.music.image.imageLoader不存在
Error:(33, 32) 错误: 找不到符号
符号: 类 ImageLoaderUtils
位置: 类 ImageFactory
Error:Execution failed for task ':TXZMusic4.0:compileDebugJavaWithJavac'.
> Compilation failed; see the compiler error output for details.
此时release也是不可以的也是提示找不到符号。
改成
package com.txznet.music.image.Imageloader;
和包名一致则可以。
类加载失败
测试代码::::
public class Undef1 {
public static Undef1 instance = new Undef1();
private Undef1()
{
throw new NullPointerException();
}
public static Undef1 getInstance(){
return instance;
}
public void print(){}
}
public class Undef {
public static void print(){
//System.out.println("thread id 0 : " + Thread.currentThread());
try
{
Undef1.getInstance().print();
}catch(Exception e){
System.out.println("thread id 0 : " + e.toString());
}catch(Error e1){
System.out.println("thread id 0 : " + e1.toString());
}
try{
Undef1.getInstance().print();
}catch(Exception e){
System.out.println("thread id 1: " + e.toString());
}
}
}
输出为::
thread id 0 : java.lang.ExceptionInInitializerError
Exception in thread "main" java.lang.NoClassDefFoundError: Could not initialize class com.txznet.testapi.Undef1
at com.txznet.testapi.Undef.print(Undef.java:16)
at com.txznet.testapi.Main.main(Main.java:30)
分析后可得:
第一次调用的时候发生了异常又被捕获了,第二次在调用该类的时候发生的。
猜测在类装载的时候将符号表进行进行存放,第一次调用的时候,尝试进行加载(此时发生错误),则装载器从符号表中删除错误的索引,第二次在调用的时候则会先在符号表中查找,没有则直接抛出这个异常。