- Published on
一个解决问题的思路 Didn't find class "javax.net.ssl.SNIHostName"
TL;DR
Android 开发,targetSdkVersion 23
,任务是给 APP 集成 AWS Android IoT SDK(2.16.12)
,Android Studio build APP 过程中遇到了标题所示的问题。
原因是 SDK 其中的一个依赖'org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.2.2'
有个 Bug。
我的解决方式是:Downgrade AWS SDK Android IoT SDK 到 2.14.2
,因为这个版本依赖的是org.eclipse.paho:org.eclipse.paho.client.mqttv3:1.1.0
,该版本没有兼容旧版本 API Level 23 的问题。
4 天前 (2020-Jun-19) AWS SDK Android 已经发布2.16.13
fix 了上述的问题,Issue 是: https://github.com/aws-amplify/aws-sdk-android/pull/1572
正文
这篇文章我想表达的点是,可以通过降低版本去解决新版可能导致的兼容性问题。
但是在我遇到标题所示的问题时,我并没有马上降低 AWS SDK 的版本,我的解决过程是:
1. Google Search Android Studio console the build error:
关键信息是: Didn't find class "javax.net.ssl.SNIHostName"
2. 定位到这个 Github Issue
https://github.com/eclipse/paho.mqtt.java/issues/633
3. 看了上述很长的 Issue 之后,发现是 org.eclipse.paho:org.eclipse.paho.client.mqttv3 的版本 1.2.2 有 Bug
但是1.2.3已经解决,而且 release 了。
https://github.com/eclipse/paho.mqtt.java/milestone/9?closed=1
4. 发现 AWS SDK Android 2.16.12 Gradle 依赖的正是 1.2.2 版本 😂
SDK 2.16.12 的发布时间是 11 Apr。其实只要 AWS SDK 更新一下 mqtt 的版本到 1.2.3 即可解决问题。
5. 我当时想到的解决问题的方式
5.1 给 AWS SDK 提交 PR 去更新 mqtt 的版本到 1.2.3,然后等待 review release。
5.2 自己把 AWS SDK 源码下来了,然后本地修改,本地导入修改过的 module。
我用的是 5.2 的方式,aws-android-sdk-iot 只是整个 sdk 的一个 gradle subproject。
这个类库的 gradle 依赖链是: aws-android-sdk-iot => aws-android-sdk-core & aws-android-sdk-testutils
也就是说,为了能修改 aws-android-sdk-iot 的 gradle 依赖,我要把相关类库的源码都放在自己的代码库里面,这个方式有点 overkill 了。最后我还是放弃了这个方法。
我是如何想到 Downgrade 的?
问题没有解决,我就下班了。下班后一直还在想着怎么 fix,洗澡过程中突然灵感乍现,为何不 downgrade 呢?
于是开电脑,检查 AWS SDK android IoT Git file changes history 找到了一个合适的版本后,修改 build.gradle,sync gradle 之后 build app 马上成功。👍