前阵子做的系统谷歌语音设置闹钟和计时器的功能,然后修复了一下横竖屏和全屏切换的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网站的解决方法详解