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

Android发布版WebView自定义JS接口调用失效,疑与ProGuard相关

WebView自定义JS接口发布模式失效(ProGuard相关)排查方案
  • 检查ProGuard规则的完整性
    确保自定义JS接口类及所有被JS调用的方法都被明确保留,不要只保留类本身:

    // 保留接口类的所有public方法
    -keep class com.your.package.YourJSBridgeClass {
        public <methods>;
    }
    // 如果有私有方法被JS调用,需单独指定
    -keepclassmembers class com.your.package.YourJSBridgeClass {
        private void yourPrivateMethod(android.webkit.WebView, java.lang.String);
    }
    

    若接口类继承了基类,基类中被调用的方法也需加入保留规则。

  • 验证@Keep注解的有效性
    确认使用的是官方注解(androidx.annotation.Keep或android.support.annotation.Keep),且类和每个被JS调用的方法都添加了该注解;同时检查gradle是否引入了对应的annotationProcessor依赖,确保注解在编译时被正确处理。

  • 分析ProGuard映射文件(mapping.txt)
    找到接口类的映射记录,核对类名、方法名是否被混淆:

    • 若方法名被改为a()/b()这类无意义名称,说明规则未生效;
    • 查看是否有类被合并或删除,导致WebView注册接口时找不到原类实例。
  • 排查WebView注册逻辑

    • 确认发布模式下webView.addJavascriptInterface(bridgeInstance, "jsBridgeName")被正确调用,注册时机在WebViewClient.onPageFinished之后;
    • 打印接口实例的类名(Log.d("JSBridge", bridgeInstance.getClass().getName())),检查发布模式下类名是否与预期一致。
  • 调试JS层错误
    发布模式下开启WebView调试:WebView.setWebContentsDebuggingEnabled(true),通过Chrome的chrome://inspect查看JS控制台错误,比如是否出现Uncaught TypeError: window.jsBridgeName.callMethod is not a function,定位是找不到类还是方法。

  • 检查ProGuard配置冲突

    • 排查是否有第三方库的ProGuard规则覆盖了自定义规则,可暂时禁用第三方规则测试;
    • 若开启了-allowaccessmodification,需确认它没有把public方法改为private,导致JS无法调用;
    • 尝试关闭shrinkResources,排除资源压缩间接影响的可能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 09:45:32