Published on

一个解决问题的思路 Didn't find class "javax.net.ssl.SNIHostName"

Authors
  • avatar
    Name
    Adam Liu
    Twitter

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:

null

关键信息是: 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 即可解决问题。

https://github.com/aws-amplify/aws-sdk-android/blob/release_v2.16.12/aws-android-sdk-iot/build.gradle

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 马上成功。👍