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设备上出现类找不到的异常。
解决步骤
- 配置项目支持Java 8
在app模块的build.gradle中添加Java 8编译配置:
android { compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } // 若为Kotlin项目,需额外添加以下配置 kotlinOptions { jvmTarget = "1.8" } }
- 更换兼容的HTMLunit版本
部分新版本HTMLunit对Java版本要求较高,建议降级到兼容Android 6的版本(如2.64.0及以下),修改依赖配置:
implementation 'net.sourceforge.htmlunit:htmlunit:2.64.0'
- 完善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>
- 重新清理构建项目
执行./gradlew clean build命令,或在Android Studio中依次点击Build -> Clean Project、Build -> Rebuild Project。
内容的提问来源于stack exchange,提问作者Maruf Rien
相关产品推荐
相关产品推荐

