Android API 21使用jsoup 1.17.2出现StringUtil找不到的问题及解决办法
问题描述
使用最新版本jsoup(1.17.2),在Android API level 21设备上运行以下代码:
Jsoup.connect(urlToParse).get()
执行时出现NoClassDefFoundError错误,错误栈如下:
java.lang.NoClassDefFoundError: org.jsoup.internal.StringUtil$$ExternalSyntheticLambda0 at org.jsoup.internal.StringUtil.<clinit>(StringUtil.java:338) at org.jsoup.helper.UrlBuilder.<init>(UrlBuilder.java:30) at org.jsoup.helper.HttpConnection$Base.url(HttpConnection.java:427) at org.jsoup.helper.HttpConnection$Request.url(HttpConnection.java:585) at org.jsoup.helper.HttpConnection.url(HttpConnection.java:139) at org.jsoup.helper.HttpConnection.connect(HttpConnection.java:79) at org.jsoup.Jsoup.connect(Jsoup.java:92)
该代码在Android API level 30+设备上运行无异常,询问除使用旧版本jsoup外的其他解决办法。
解决办法
启用核心库脱糖(Core Library Desugaring)
这个错误源于jsoup 1.17.2使用了Java 8+的语法特性(如lambda表达式生成的合成类),而Android API 21及以下原生不支持这些特性。启用核心库脱糖可让旧API级别设备兼容Java 8+语言特性。
在Module级别的build.gradle中添加以下配置:android { compileOptions { coreLibraryDesugaringEnabled true sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } kotlinOptions { jvmTarget = "1.8" } } dependencies { coreLibraryDesugaring 'com.android.tools:desugar_jdk_libs:2.0.4' }同步项目后重新构建运行即可解决类找不到的问题。
配置混淆规则(若开启混淆)
如果项目启用了代码混淆,需确保jsoup的内部类不会被误删除。在proguard-rules.pro中添加规则:-keep class org.jsoup.** { *; } -dontwarn org.jsoup.**避免混淆工具移除jsoup所需的内部合成类。
内容的提问来源于stack exchange,提问作者mynameisnotmyname
相关产品推荐
相关产品推荐

