Android项目中使用htmlunit.jar时出现ProGuard问题
我之前在项目里集成旧版HtmlUnit的时候也踩过这个坑,你遇到的Can't find common super class错误,本质是ProGuard在混淆过程中,无法解析HtmlUnit里ActiveX相关类的特殊继承结构——尤其是com.gargoylesoftware.htmlunit.activex.javascript.msxml.MSXMLScriptable和Java核心类java.lang.Class的超类匹配逻辑被混淆破坏了。
给你几个可行的解决方案,按优先级推荐:
方案1:添加HtmlUnit专属的ProGuard保留规则
因为HtmlUnit大量依赖动态反射、JavaScript引擎交互以及内部类的动态加载,默认的ProGuard混淆会直接破坏这些逻辑。直接保留所有HtmlUnit相关类是最稳妥的方式,在你的proguard-rules.pro里添加:
# 保留HtmlUnit所有类及成员,避免混淆破坏内部逻辑 -keep class com.gargoylesoftware.htmlunit.** { *; } -keepclassmembers class com.gargoylesoftware.htmlunit.** { *; } # 额外保留JavaScript交互相关的接口,确保动态调用正常 -keep interface com.gargoylesoftware.htmlunit.javascript.** { *; }
添加完成后重新生成签名APK,这个规则基本能解决90%以上HtmlUnit和ProGuard的冲突问题。
方案2:精细保留报错相关类(适合不想太宽泛的场景)
如果你担心保留所有HtmlUnit类会增加APK体积,可以只针对报错的MSXML相关类和必要依赖添加规则:
# 保留ActiveX MSXML相关类,解决超类找不到的问题 -keep class com.gargoylesoftware.htmlunit.activex.javascript.msxml.** { *; } # 保留HtmlUnit JavaScript宿主类,确保继承链完整 -keep class com.gargoylesoftware.htmlunit.javascript.host.** { *; } # 确保Java核心Class类不被误处理 -keep class java.lang.Class { *; }
不过这种方式需要注意HtmlUnit内部的依赖关联,容易遗漏其他类导致新的混淆错误,所以更推荐方案1。
方案3:升级HtmlUnit版本(长期最优解)
你用的2.15是2015年的旧版本,对Android的兼容性和ProGuard的适配都比较差。如果项目允许的话,建议升级到最新的HtmlUnit版本(比如2.70+),新版本不仅修复了很多旧的兼容性问题,还对Android环境做了优化,ProGuard规则也更友好,能从根源上避免这类问题。
内容的提问来源于stack exchange,提问作者gdinesh029

