【Android4.2】解决程序在安卓4.2上运行时的崩溃
公司的项目本来是在安卓5.0以上设计的,之后有需求需要在4.2上运行,不出意外的无响应,以下将遇到的报错及其解决方法一一列出来
一、Manifest merger failed
刚开始改完我们的minSdk去打包时可能打包不成功出现以下报错
![](https://img-blog.csdnimg.cn/img_convert/efc6c49d0c4e6139a9594aadb828b157.png)
这里我用了第三方的包,他说我们第三方的minsdk最小是18而我们4.2的是17
这里我们可以点开第三方的androidmanifest看一下确实是18
![](https://img-blog.csdnimg.cn/img_convert/de1fbd927eedf74f721a62722c5c9c63.png)
我们只需要加上
![](https://img-blog.csdnimg.cn/img_convert/2a0b46c8895d5a1928e56344e252c9e9.png)
二、ExceptionInInitializerError
这个问题出在Okhttp
![](https://img-blog.csdnimg.cn/img_convert/a8fad207a8b9c4c53803c47359b75658.png)
原因是
![](https://img-blog.csdnimg.cn/img_convert/22ea50c674074a67e7df549c205a6e86.png)
所以把okhttp版本降一下就行,其中部分api有所改变自己改一下就行
不过这里可能会遇到多个okhttp的版本的情况
就是如果引入了retrofit还是啥的因为他们里面有okhttp的其他高版本所以会出现项目还是使用高版本的情况,比如我这里也引入了retrofit
![](https://img-blog.csdnimg.cn/img_convert/7c3e3df2cf7f9d328c44748cedca4b4b.png)
然后我们来检测一下依赖,按下面这个双击
![](https://img-blog.csdnimg.cn/img_convert/6d9fc1145bfa702962b527047dc6cef2.png)
检测完之后我们可以看到okhttp的版本有多个,如下
![](https://img-blog.csdnimg.cn/img_convert/0dfc664a865071359ef279e1c5b442f0.png)
我们只需要在build.gradle下面加上这句就行了
![](https://img-blog.csdnimg.cn/img_convert/f808e619557e0413407e89a9e3c31809.png)
之后我们再检测一下
![](https://img-blog.csdnimg.cn/img_convert/b6e1a2e310aa885c7f599255401ef3d3.png)
可以看到3.14的版本被修正了,这样就可以了
三、android.view.InflateException: Binary XML file line #30: Error inflating class ImageView
这个报错是在oncCreate方法引入布局的地方,在根据报错信息就是我们布局30行出了问题
![](https://img-blog.csdnimg.cn/img_convert/226a79466c6e72638eed1293089bf1b9.png)
第30行是一个imageview
![](https://img-blog.csdnimg.cn/img_convert/2a25d1a1de6ff3e4e4608ddb1449a248.png)
原因很简单就是我这里用的是一个矢量图,而安卓5.0以下使用矢量图需要做一些处理
首先在我们的mainactivity加上如下代码去配置
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
kotlin可以加在init{}里,java可以加在static{}里
然后在build.gradle的defaultConfig下面加上这一句
![](https://img-blog.csdnimg.cn/img_convert/189c5b7cb3acfd69c2186c3d8de6c133.png)
最后把xml文件的image view的src改成scrCompat就可以了
![](https://img-blog.csdnimg.cn/img_convert/4d29325ca762bc9cff3deca10de6e21c.png)
四、java.lang.IncompatibleClassChangeError: interface not implemented
这个报错位置在socket调用use函数的地方,如下
![](https://img-blog.csdnimg.cn/img_convert/b255dbc965bdda571917024379aeddc1.png)
当时想的时候是不是use函数的问题,就把这里改成了
![](https://img-blog.csdnimg.cn/img_convert/f22dd2d42a94ec27a4e43b500e08286d.png)
这样就没问题了,后来我也找到了原因,链接如下
java - Android: Exception using Closeable interface with Socket - Stack Overflow
Socket implements Closeable only since API level 19 (kitkat) but that information isn't in the generated documentation.
就是在api19即安卓4.4以下socket不能和closeable接口使用
这里点进去use方法可以看到有使用Closeable接口,所以不用use就可以了
![](https://img-blog.csdnimg.cn/img_convert/042550918a6a561ae03ab46a48c0621a.png)
五、java.lang.IllegalStateException: Method addObserver must be called on the main thread
这个是lifecycle 的版本问题高版本会检测是否在主线程,把版本降下来就行了,如下
'androidx.lifecycle:lifecycle-runtime:2.2.0'
CSDN-Ada助手: 恭喜你写了第四篇博客!标题看起来很吸引人,关于Vue页面缓存机制的讨论一直备受关注。你的简单实现方式很有创意,让人对这个话题更加感兴趣。不过,或许在未来的文章中,你可以进一步深入探讨一些具体的应用场景和实践经验,这样读者能够更好地理解和应用你提到的技术。期待你的下一步创作,加油! 如何快速涨粉,请看该博主的分享:https://hope-wisdom.blog.csdn.net/article/details/130544967?utm_source=csdn_ai_ada_blog_reply5
CanCanWorld: 哪里没成功?
不自律的笨鸟: 感谢分享,自己搞了半天也没成功