• java.lang.NoClassDefFoundError的原因及解决


    [O]

    安卓应用在低版本(V2.3.6)系统上运行时报错: java.lang.NoClassDefFoundError

    完整错误信息如下:

    05-29 13:56:13.687: E/AndroidRuntime(3538): FATAL EXCEPTION: main
    05-29 13:56:13.687: E/AndroidRuntime(3538): java.lang.NoClassDefFoundError: com.uustudio.unote.android.BaseApplication$1
    05-29 13:56:13.687: E/AndroidRuntime(3538): 	at com.uustudio.unote.android.BaseApplication.onCreate(BaseApplication.java:109)
    05-29 13:56:13.687: E/AndroidRuntime(3538): 	at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:969)
    05-29 13:56:13.687: E/AndroidRuntime(3538): 	at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3276)
    05-29 13:56:13.687: E/AndroidRuntime(3538): 	at android.app.ActivityThread.access$2200(ActivityThread.java:117)
    05-29 13:56:13.687: E/AndroidRuntime(3538): 	at android.app.ActivityThread$H.handleMessage(ActivityThread.java:973)
    05-29 13:56:13.687: E/AndroidRuntime(3538): 	at android.os.Handler.dispatchMessage(Handler.java:99)
    05-29 13:56:13.687: E/AndroidRuntime(3538): 	at android.os.Looper.loop(Looper.java:130)
    05-29 13:56:13.687: E/AndroidRuntime(3538): 	at android.app.ActivityThread.main(ActivityThread.java:3687)
    05-29 13:56:13.687: E/AndroidRuntime(3538): 	at java.lang.reflect.Method.invokeNative(Native Method)
    05-29 13:56:13.687: E/AndroidRuntime(3538): 	at java.lang.reflect.Method.invoke(Method.java:507)
    05-29 13:56:13.687: E/AndroidRuntime(3538): 	at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
    05-29 13:56:13.687: E/AndroidRuntime(3538): 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
    05-29 13:56:13.687: E/AndroidRuntime(3538): 	at dalvik.system.NativeStart.main(Native Method)
    

    简化后:

    E/AndroidRuntime(3538): FATAL EXCEPTION: main
    E/AndroidRuntime(3538): java.lang.NoClassDefFoundError: com.uustudio.unote.android.BaseApplication$1
    at com.uustudio.unote.android.BaseApplication.onCreate(BaseApplication.java:109)
    at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:969)
    at android.app.ActivityThread.handleBindApplication(ActivityThread.java:3276)
    at android.app.ActivityThread.access$2200(ActivityThread.java:117)
    at android.app.ActivityThread$H.handleMessage(ActivityThread.java:973)
    at android.os.Handler.dispatchMessage(Handler.java:99)
    at android.os.Looper.loop(Looper.java:130)
    at android.app.ActivityThread.main(ActivityThread.java:3687)
    at java.lang.reflect.Method.invokeNative(Native Method)
    at java.lang.reflect.Method.invoke(Method.java:507)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:867)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:625)
    at dalvik.system.NativeStart.main(Native Method)
    

    1. 一种解决方案如链接:http://blog.csdn.net/leehong2005/article/details/9407111

    未生效

    2. 一种解决方案:Properties->Java Build Path 选择Source分页添加Libs路径,从而将第三方jar包打包进apk

    未生效

    3. 过程中出现新问题:Unable to execute dex: Multiple dex files define Lcom/myapp/R$array;

    解决方案:http://stackoverflow.com/questions/7870265/unable-to-execute-dex-multiple-dex-files-define-lcom-myapp-rarray

    4. 一种解决方案,此种应该是离问题原因很近的:http://blog.csdn.net/tianjian4592/article/details/43467283

    依然未生效,但可基本判断是配置冲突或配置未生效造成的,需要clean之后重新配置。

    (然而测试之后发现并非如此...)

    以上解决办法均针对安卓工程引用第三方jar包这一原因,我的情况是在部分机型(高版本安卓系统)及模拟器运行正常,在部分机型(安卓系统2.3.6)测试时出现问题,若是上述原因,则所有机型均无法正常运行才对,故排除。

    5. 一种原因分析:AsyncTask陷阱之:Handler,Looper与MessageQueue的详解

    在该问题案例中,程序在安卓2.3版本的机器上无法运行,在4.0及以上版本运行OK,其原因是程序中的Handler对象未进行BindApplication,而4.0及以上版本系统会自动进行该操作,该文章相关内容如下:

    从2.3运行时的Stacktrace来看原因是在非UI线程中操作了UI组件。不对呀,神奇 啊,AsyncTask#onProgressUpdate()和AsyncTask#onPostExecute()的文档明明写着这二个回调是在UI 线程里面的嘛,怎么还会报出这样的异常呢!


    AsyncTask设计出来执行异步任务却又能与主线程通讯,它的内部有一个 InternalHandler是继承自Handler的静态成员sHandler,这个sHandler就是用来与主线程通讯的。看下这个对象的声 明:private static final InternalHandler sHandler = new InternalHandler();而InternalHandler又是继承自Handler的。所以本质上讲sHandler就是一个 Handler对象。Handler是用来与线程通讯用的,它必须与Looper和线程绑定一起使用,创建Handler时必须指定Looper,如果不 指定Looper对象则使用调用栈所在的线程,如果调用栈线程没有Looper会报出异常。看来这个sHandler是与调用new InternalHandler()的线程所绑定,它又是静态私有的,也就是与第一次创建AsyncTask对象的线程绑定。所以,如果是在主线程中创建 的AsyncTask对象,那么其sHandler就与主线程绑定,这是正常的情况。在此例子中AsyncTask是在衍生线程里创建的,所以其 sHandler就与衍生线程绑定,因此,它自然不能操作UI元素,会在onProgressUpdate()和onPostExecute()中抛出异常。

    以上例子有异常的原因就是在衍生线程中创建了SimpleAsyncTask对象。至于为什么在4.0版本上没有问题,是因为4.0 中在ActivityThread.main()方法中,会进行BindApplication的动作,这时会用AsyncTask对象,也会创建 sHandler对象,这是主线程所以sHandler是与主线程绑定的。后面再创建AsyncTask对象时,因为sHandler已经初始化完了,不 会再次初始化。至于什么是BindApplication,为什么会进行BindApplication的动作不影响这个问题的讨论。AsyncTask的缺陷及修改方法。

    这其实是AsyncTask的隐藏的Bug,它不应该这么依赖开发者,应该强加条件限制,以保证第一次AsyncTask对象是在主线程中创建。

    该问题及原因描述与我遇到的情况及错误日志信息极为相近,为验证之,新建安卓2.2和2.3版本的模拟器并运行代码。

     - 在安卓2.2版本系统的模拟器下运行,报出同样错误及Log信息。

  • 相关阅读:
    beta冲刺——用户使用调查报告
    专业团队——Beta计划总结随笔
    专业团队测试随笔
    Beta冲刺--第十次随笔
    Beta冲刺--第九次随笔(md文档问题的解决)
    Beta冲刺--第八次随笔
    Beta冲刺--第七次随笔(仓库优化)
    Beta冲刺--第六次随笔(仓库修改)
    Beta冲刺--第五次随笔
    Beta冲刺--第四次随笔
  • 原文地址:https://www.cnblogs.com/misybing/p/5039697.html
Copyright © 2020-2023  润新知