记一次坑爹的运行时崩溃

要打包给测试,切换分支,然后打release包,成功,然后运行,崩溃。在Bugly上看到崩溃的Log如下:

1 java.lang.ExceptionInInitializerError:
2 org.eclipse.paho.android.service.d.b(Unknown Source:358)
3 ......
4 Caused by:
5 java.util.MissingResourceException:Can't find bundle for base name org.eclipse.paho.client.mqttv3.internal.nls.logcat, locale zh_CN
6 java.util.ResourceBundle.throwMissingResourceException(ResourceBundle.java:1558)
7 java.util.ResourceBundle.getBundleImpl(ResourceBundle.java:1381)
8 java.util.ResourceBundle.getBundle(ResourceBundle.java:771)
9 org.eclipse.paho.a.a.b.c.a(Unknown Source:6)
10 org.eclipse.paho.a.a.g.<clinit>(Unknown Source:4)
11 org.eclipse.paho.android.service.d.b(Unknown Source:358)
12 org.eclipse.paho.android.service.d$b.onServiceConnected(Unknown Source:16)
13 android.app.LoadedApk$ServiceDispatcher.doConnected(LoadedApk.java:1681)
14 android.app.LoadedApk$ServiceDispatcher$RunConnection.run(LoadedApk.java:1710)
15 android.os.Handler.handleCallback(Handler.java:790)
16 android.os.Handler.dispatchMessage(Handler.java:99)
17 android.os.Looper.loop(Looper.java:192)
18 android.app.ActivityThread.main(ActivityThread.java:6949)
19 java.lang.reflect.Method.invoke(Native Method)
20 com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438)
21 com.android.internal.os.ZygoteInit.main(ZygoteInit.java:817)

奇怪,MQTT很早就加进去了,之前也发布过release包没有问题的。
猜想是什么时候改了gradle或者混淆规则导致的,看log从上个OK的realse版本到现在为止,确实更改过build.gradle,可能是这个引起的?
后续做了如下事情:

  • 在最新分支打debug包(关闭混淆),运行OK
  • 多种方式尝试关闭MQTT的混淆(设置MQTT所在module minifyEnabled为false,添加不混淆MQTT相关类,在外部应用module添加不混淆MQTT类),打realse包,运行异常!!
  • 反编译第一个OK的版本和最新打出来的异常版本对比,异常版本缺少相关的properties文件。证明混淆规则中只能保证相关的MQTTJava类不会被混淆,但是打包的时候不能保证保留相应的properties文件。
  • 回退到第一次发布的版本,打realse包,运行OK
  • 回退到修改gradle的版本,打release包,运行异常
  • 回退到修改gradle的前一个版本,打realse包,运行异常!!(理论上,应该这里是OK的)
  • 后续二分法尝试了回退版本,并重新打包验证,怎么好像又可以运行了?有点凌乱!

最后,checkout到最新版本,clean工程,重新打realse包,运行OK!!!

结论:以后发布版本之前,请先Clean!!

推荐阅读更多精彩内容