前阵子做的系统谷歌语音设置闹钟和计时器的功能,然后修复了一下横竖屏和全屏切换的bug,以为就完事了。没想到把代码提交给老师以后,老师说有问题,plus版本的项目打不开。但是明明已经测试过了三台手机,都没有问题才提交的。现在出现这种问题,真的好尴尬!


冷静下来仔细想了想,是不是系统谷歌语音添加闹钟和计时器的功能有问题,因为在普通版本上没有出现APP闪退的问题,恰好普通版本的APP没有谷歌语音的功能。思前想后,也只能是这个问题了。
为了进一步确定问题所在,于是决定打印出错误日志,发现一个规律,APP在5.0 以上的系统没有什么问题,但是在4.4 及一下的系统就会出现闪退和报错,如下:

05-11 12:02:26.071 20751-20751/? E/AndroidRuntime: FATAL EXCEPTION: main
                                                   Process: com.luckyxmobile.timers4meplus, PID: 20751
                                                   java.lang.NoClassDefFoundError: com.luckyxmobile.timers4meplus.provider.MyDataBaseAdapter$DatabaseHelper
                                                       at com.luckyxmobile.timers4meplus.provider.MyDataBaseAdapter.open(MyDataBaseAdapter.java:1510)
                                                       at com.luckyxmobile.timers4meplus.Timers4MePlus.onCreate(Timers4MePlus.java:92)
                                                       at android.app.Instrumentation.callApplicationOnCreate(Instrumentation.java:1007)
                                                       at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4586)
                                                       at android.app.ActivityThread.access$1500(ActivityThread.java:145)
                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1276)
                                                       at android.os.Handler.dispatchMessage(Handler.java:102)
                                                       at android.os.Looper.loop(Looper.java:145)
                                                       at android.app.ActivityThread.main(ActivityThread.java:5266)
                                                       at java.lang.reflect.Method.invokeNative(Native Method)
                                                       at java.lang.reflect.Method.invoke(Method.java:515)
                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:826)
                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:642)
                                                       at dalvik.system.NativeStart.main(Native Method)

问题 :
显示找不到DatabaseHelper这个类,仔细看了一下代码,没问题啊。后来查找了NoClassDefFoundError的出现情况。发现好多同行都遇到这种问题。最终的解释是:项目里面的jar包和依赖太多了,导致分包出现的错误,dex/field/class这三个文件的个数在android里面都是有限制的,为65535个。如jar包导入过多,会超过这个数,导致APP闪退。


解决办法 :
怎么解决呢?不可能删除jar包或者依赖来满足不超过这个数吧,于是找到一个方法如下能过让项目在jar包多的情况下不闪退报错:

1. 首先:
在gradle文件里添加multiDexEnabled = true

defaultConfig {
        multiDexEnabled = true //表示可以进行分包, 用于启用MultiDex
    }

2. 其次:
同样在gradle文件里添加MultiDex的依赖

compile 'com.android.support:multidex:1.0.1' //支持包用于5.0以下系统

3. 最后:
用MultiDexApplication替代Application,或者在你application的attachBaseContext()方法中调用MultiDex.install()。

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

这样就完美解决了。可以参考一下StackOverflow网站的解决方法:StackOverflow网站的解决方法详解