Android <java.lang.ClassNotFoundException:Didn‘t find class ‘XXX‘ on path:DexPathList> 解决

Android <java.lang.ClassNotFoundException:Didn’t find class ‘XXX’ on path:DexPathList> 解决

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-db0OmjRb-1602238282642)(C:\Users\xushiyun\AppData\Roaming\Typora\typora-user-images\image-20201009163751167.png)]

如图:问题现象如上,我大概描述一下

我自己开发的真机是8.0版本的,应用运行完全没有问题,然后再在5.1.1版本上的真机上运行的时候出现了闪退现场并报出这个问题。然后就因为这个问题我折腾了一天,基本上google搜索过了,CSDN博客也搜索过了,最后在StackOverFlow上找到了解决方法。StackOverFlow给我的感觉就是,基本上大多数问题都能在上面找到答案,但是每次都感觉自己的搜索效率真的太差太差。

最后寻了一圈,还是要返回到官方的文档上。每次这么折腾都感觉自己好蠢,永远不知道吸取教训。就好比别人都已经把饭碗放到你面前,把勺子伸到你嘴边了,你还不肯张嘴,非要自己从头摸索起。官方的文档地址如下:https://developer.android.com/studio/build/shrink-code。

还是一如既往,我直接把我这边产生问题的原因和解决方法写出来,为了不浪费那些急性子的人们。

产生我所遇到问题的原因是:代码混淆规则并没有添加对于“java.util.function.Predicate”等一系列java原生工具类的例外规则

至于为什么在8.0以上版本并没有出现这个问题,我个人对于这个问题的解释是,android API 21开始才支持java7版本,所以如果是对于java8中的lambda表达式,只能通过拆解语法糖来转化成已知的表达式从而达到同样支持的目的。这个思路一定要赞一个,将已知转为未知!具体转化为一个继承于"java.util.function.Predicate之类"的匿名内部类来达到变相支持lambda表达式的目的。所以,有些童鞋遇到这类问题时,通过将lambda表达式全部展开为匿名内部类的方式也能同样让这个问题消失,每每还抱怨一句,android真的垃圾,这种问题层出不穷。愚昧并不值得自豪和骄傲,对吧?

然而对于android 8.0版本,已经完全支持了java 8的特性,所以能直接对lambda表达式进行分析,不用再依赖通过原来的Predicate之类的子类进行间接转换,虽然,实际上还是用内部类来实现的,所以说java让人变得愚蠢,这点真的一点也没有错。刘超说,java用来写工具很方便,其他他没有说,其意思一目了然。

我是看《火影忍者》漫画长大的,里面有一句话让我感觉真的很震撼心灵。“写轮眼说到底也只是工具,实际上使用的效果还是要看使用者的天赋和才能。菜鸟所投掷出的手里剑往往还不如高手所投掷出的小石子。”其实很有道理,语言,平台,其实说到底仅仅是工具而已,你到底能做到什么内容,到最后还是看使用者自己的能力。很多末日电影不都有仅仅依赖一台游戏机的按钮都能打败人工智能从而拯救世界的桥段吗,虽然荒诞,但是其实还有一点点道理的。


乍一看,讲到这里其实已经把问题都讲清楚了,那么官方文档告诉了我们什么呢?

从上面地址的官方文档得知,在遇到ClassNotFoundException问题时,有可能是因为multidex拆包的时候情况过于复杂,所以可能存在找不到对应的类的问题。如果对于低版本下限并没有那么严格的要求,那么直接将minSdkVersion设置为21然后手动设置multiDexKeepFile对应配置文档就行了,至少是我就这么做了,另外一个方法就比较麻烦,建议直接阅读官方的文档,讲的十分详细。

猜你喜欢

转载自blog.csdn.net/qq_31433709/article/details/108983670