You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android 6(Marshmallow)调用HTMLunit崩溃,报ClassNotFoundException

Android 6调用HTMLunit崩溃问题求助

我通过HTTP请求获取服务器HTML内容,该功能在其他Android版本均正常,但在Android 6中调用HTMLunit时应用崩溃。已知问题与API 23及以下版本的兼容性有关,但尝试多种方案仍无法解决。

为何需适配Android 6

大量用户使用Android 6和5版本。

错误信息

FATAL EXCEPTION: Thread-9255
Process: bd.maruf.myapplication, PID: 7773
java.lang.NoClassDefFoundError: java.util.function.Supplier
    at libcore.reflect.InternalNames.getClass(InternalNames.java:55)
    at java.lang.Class.getDexCacheType(Class.java:476)
    at java.lang.reflect.Method.getReturnType(Method.java:183)
    at java.lang.Class.getDeclaredMethods(Class.java:678)
    at com.gargoylesoftware.htmlunit.javascript.configuration.AbstractJavaScriptConfiguration.process(AbstractJavaScriptConfiguration.java:212)
    at com.gargoylesoftware.htmlunit.javascript.configuration.AbstractJavaScriptConfiguration.getClassConfiguration(AbstractJavaScriptConfiguration.java:193)
    at com.gargoylesoftware.htmlunit.javascript.configuration.AbstractJavaScriptConfiguration.<init>(AbstractJavaScriptConfiguration.java:67)
    at com.gargoylesoftware.htmlunit.javascript.configuration.JavaScriptConfiguration.<init>(JavaScriptConfiguration.java:685)
    at com.gargoylesoftware.htmlunit.javascript.configuration.JavaScriptConfiguration.getInstance(JavaScriptConfiguration.java:701)
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.<init>(JavaScriptEngine.java:161)
    at com.gargoylesoftware.htmlunit.WebClient.<init>(WebClient.java:326)
    at com.gargoylesoftware.htmlunit.WebClient.<init>(WebClient.java:275)
    at com.gargoylesoftware.htmlunit.WebClient.<init>(WebClient.java:265)
    at com.gargoylesoftware.htmlunit.WebClient.<init>(WebClient.java:257)
    at bd.maruf.myapplication.MainActivity.main(MainActivity.kt:32)
    at bd.maruf.myapplication.MainActivity.onCreate$lambda$1$lambda$0(MainActivity.kt:22)
    at bd.maruf.myapplication.MainActivity.$r8$lambda$VtPJx1mT1BVGpp5vWQWqcx_e4kM(MainActivity.kt)
    at bd.maruf.myapplication.MainActivity$$ExternalSyntheticLambda2.run(D8$$SyntheticClass)
    at java.lang.Thread.run(Thread.java:818)
Caused by: java.lang.ClassNotFoundException: Didn't find class "java.util.function.Supplier" on path: DexPathList[[zip file "/data/app/bd.maruf.myapplication-1/base.apk"],nativeLibraryDirectories=[/data/app/bd.maruf.myapplication-1/lib/arm, /vendor/lib, /system/lib]]
    at dalvik.system.BaseDexClassLoader.findClass(BaseDexClassLoader.java:56)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:511)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:469)
    at libcore.reflect.InternalNames.getClass(InternalNames.java:53)
    at java.lang.Class.getDexCacheType(Class.java:476) 
    at java.lang.reflect.Method.getReturnType(Method.java:183) 
    at java.lang.Class.getDeclaredMethods(Class.java:678) 
    at com.gargoylesoftware.htmlunit.javascript.configuration.AbstractJavaScriptConfiguration.process(AbstractJavaScriptConfiguration.java:212) 
    at com.gargoylesoftware.htmlunit.javascript.configuration.AbstractJavaScriptConfiguration.getClassConfiguration(AbstractJavaScriptConfiguration.java:193) 
    at com.gargoylesoftware.htmlunit.javascript.configuration.AbstractJavaScriptConfiguration.<init>(AbstractJavaScriptConfiguration.java:67) 
    at com.gargoylesoftware.htmlunit.javascript.configuration.JavaScriptConfiguration.<init>(JavaScriptConfiguration.java:685) 
    at com.gargoylesoftware.htmlunit.javascript.configuration.JavaScriptConfiguration.getInstance(JavaScriptConfiguration.java:701) 
    at com.gargoylesoftware.htmlunit.javascript.JavaScriptEngine.<init>(JavaScriptEngine.java:161) 
    at com.gargoylesoftware.htmlunit.WebClient.<init>(WebClient.java:326) 
    at com.gargoylesoftware.htmlunit.WebClient.<init>(WebClient.java:275) 
    at com.gargoylesoftware.htmlunit.WebClient.<init>(WebClient.java:265) 
    at com.gargoylesoftware.htmlunit.WebClient.<init>(WebClient.java:257) 
    at bd.maruf.myapplication.MainActivity.main(MainActivity.kt:32) 
    at bd.maruf.myapplication.MainActivity.onCreate$lambda$1$lambda$0(MainActivity.kt:22) 
    at bd.maruf.myapplication.MainActivity.$r8$lambda$VtPJx1mT1BVGpp5vWQWqcx_e4kM(MainActivity.kt) 
    at bd.maruf.myapplication.MainActivity$$ExternalSyntheticLambda2.run(D8$$SyntheticClass) 
    at java.lang.Thread.run(Thread.java:818) 
    Suppressed: java.lang.ClassNotFoundException: java.util.function.Supplier
        at java.lang.Class.classForName(Native Method)
        at java.lang.BootClassLoader.findClass(ClassLoader.java:781)
        at java.lang.BootClassLoader.loadClass(ClassLoader.java:841)
        at java.lang.ClassLoader.loadClass(ClassLoader.java:504)
        ... 20 more
    Caused by: java.lang.NoClassDefFoundError: Class not found using the boot class loader; no stack trace available
2022-11-12 18:11:50.861  7773-7807  Surface                 bd.maruf.myapplication               D  Surface::disconnect(this=0xaddb7b00,api=1)

已尝试的方案

  • 清理并重建项目
  • 添加多Dex配置:
    defaultConfig {
        multiDexEnabled true
    }
    
    dependencies {
        implementation 'com.android.support:multidex:1.0.3'
    }
    
  • 删除.gradle和.idea文件

问题根源与解决方案

根源分析

java.util.function.Supplier是Java 8新增的函数式接口,Android 6.0(API 23)默认未提供对该接口的支持,而当前使用的HTMLunit版本依赖了Java 8+的API,导致低版本Android设备上出现类找不到的异常。

解决步骤

  1. 配置项目支持Java 8
    在app模块的build.gradle中添加Java 8编译配置:
android {
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
    // 若为Kotlin项目,需额外添加以下配置
    kotlinOptions {
        jvmTarget = "1.8"
    }
}
  1. 更换兼容的HTMLunit版本
    部分新版本HTMLunit对Java版本要求较高,建议降级到兼容Android 6的版本(如2.64.0及以下),修改依赖配置:
implementation 'net.sourceforge.htmlunit:htmlunit:2.64.0'
  1. 完善Multidex配置
    若之前的Multidex配置不完整,需补充以下操作:
  • 自定义Application类继承MultiDexApplication,或在原有Application类的attachBaseContext方法中调用MultiDex.install(this):
class MyApplication : Application() {
    override fun attachBaseContext(base: Context?) {
        super.attachBaseContext(base)
        MultiDex.install(this)
    }
}
  • 在AndroidManifest.xml的application标签中指定该自定义Application类:
<application
    android:name=".MyApplication"
    ...>
    ...
</application>
  1. 重新清理构建项目
    执行./gradlew clean build命令,或在Android Studio中依次点击Build -> Clean Project、Build -> Rebuild Project。

内容的提问来源于stack exchange,提问作者Maruf Rien

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 11:15:35