公司的项目本来是在安卓5.0以上设计的,之后有需求需要在4.2上运行,不出意外的无响应,以下将遇到的报错及其解决方法一一列出来
一、Manifest merger failed
刚开始改完我们的minSdk去打包时可能打包不成功出现以下报错
![](https://i-blog.csdnimg.cn/blog_migrate/8e9dd83393f9b97540cb6e4c437ceb69.png)
这里我用了第三方的包,他说我们第三方的minsdk最小是18而我们4.2的是17
这里我们可以点开第三方的androidmanifest看一下确实是18
![](https://i-blog.csdnimg.cn/blog_migrate/172bdcbfd3fd8d2254704a0bd363ff10.png)
我们只需要加上
![](https://i-blog.csdnimg.cn/blog_migrate/3c602030eca06eb9ade124404e471f47.png)
二、ExceptionInInitializerError
这个问题出在Okhttp
![](https://i-blog.csdnimg.cn/blog_migrate/5e09f281bcfaa7fb869a8b4a1e96d14a.png)
原因是
![](https://i-blog.csdnimg.cn/blog_migrate/66d3b638622f265a32200ac8faeb00a8.png)
所以把okhttp版本降一下就行,其中部分api有所改变自己改一下就行
不过这里可能会遇到多个okhttp的版本的情况
就是如果引入了retrofit还是啥的因为他们里面有okhttp的其他高版本所以会出现项目还是使用高版本的情况,比如我这里也引入了retrofit
![](https://i-blog.csdnimg.cn/blog_migrate/e97c755bc92922c6ac50ea826fa97767.png)
然后我们来检测一下依赖,按下面这个双击
![](https://i-blog.csdnimg.cn/blog_migrate/3197018900f8054ebcbb3e4c67b5b040.png)
检测完之后我们可以看到okhttp的版本有多个,如下
![](https://i-blog.csdnimg.cn/blog_migrate/952bac3cb5a7ebcdc6e53ccafdd080c0.png)
我们只需要在build.gradle下面加上这句就行了
![](https://i-blog.csdnimg.cn/blog_migrate/28650529fbd8b3ed8de6c291a92d2971.png)
之后我们再检测一下
![](https://i-blog.csdnimg.cn/blog_migrate/58a45e88a059ef368c353186a0acc721.png)
可以看到3.14的版本被修正了,这样就可以了
三、android.view.InflateException: Binary XML file line #30: Error inflating class ImageView
这个报错是在oncCreate方法引入布局的地方,在根据报错信息就是我们布局30行出了问题
![](https://i-blog.csdnimg.cn/blog_migrate/d76df52571b2a980c3358bb167273c77.png)
第30行是一个imageview
![](https://i-blog.csdnimg.cn/blog_migrate/e7bbd73c07f7f603047cdf9558bb24a6.png)
原因很简单就是我这里用的是一个矢量图,而安卓5.0以下使用矢量图需要做一些处理
首先在我们的mainactivity加上如下代码去配置
AppCompatDelegate.setCompatVectorFromResourcesEnabled(true)
kotlin可以加在init{}里,java可以加在static{}里
然后在build.gradle的defaultConfig下面加上这一句
![](https://i-blog.csdnimg.cn/blog_migrate/b518655647d26c02c283e0276aebe228.png)
最后把xml文件的image view的src改成scrCompat就可以了
![](https://i-blog.csdnimg.cn/blog_migrate/d31f0f8b385027cc8132b726c93b7479.png)
四、java.lang.IncompatibleClassChangeError: interface not implemented
这个报错位置在socket调用use函数的地方,如下
![](https://i-blog.csdnimg.cn/blog_migrate/ba046fc971ee836e00efbe77fbfb5ed5.png)
当时想的时候是不是use函数的问题,就把这里改成了
![](https://i-blog.csdnimg.cn/blog_migrate/4bd7042dff87dd25eda4d3a43011e8c2.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://i-blog.csdnimg.cn/blog_migrate/36e7bd535acec315d8f7793d52739762.png)
五、java.lang.IllegalStateException: Method addObserver must be called on the main thread
这个是lifecycle 的版本问题高版本会检测是否在主线程,把版本降下来就行了,如下
'androidx.lifecycle:lifecycle-runtime:2.2.0'