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

开启Proguard后Fetch API无法正常工作的问题求助

我之前在维护RN老版本项目时也碰到过一模一样的问题——开了Proguard后Fetch调用莫名其妙“消失”,既不返回响应也不抛错,结合RN 0.55.4的特性,给你整理一套调试和解决的方案:

一、先定位Proguard的问题根源

首先得搞清楚是哪些类被错误混淆了,不能盲目加规则:

  • 开启Proguard混淆日志:在你的proguard-rules.pro文件里添加以下配置,构建后会生成详细的混淆映射文件
    -printmapping mapping.txt
    -verbose
    
    打包完成后,找到app/build/outputs/mapping/release/mapping.txt,搜索fetch、Response、Headers、okhttp这些关键词,看看是不是网络相关的核心类被错误混淆了。
  • 缩小排查范围:临时把build.gradle里的minifyEnabled设为false,重新打包测试。如果Fetch恢复正常,那100%是Proguard规则的问题;如果还是不行,再去排查网络环境、URL有效性这些其他因素。
二、添加针对性的Proguard保护规则

RN的Fetch是基于OkHttp实现的polyfill,这些核心类绝对不能被混淆,把下面的规则加到你的proguard-rules.pro里:

# 保留RN网络模块核心类(Fetch的Native桥接依赖这个)
-keep class com.facebook.react.modules.network.** { *; }

# 保留OkHttp和Okio全量类,RN网络请求的底层依赖
-keep class okhttp3.** { *; }
-keep class okio.** { *; }
-keep class com.squareup.okhttp.** { *; }

# 保留JSON相关类,你的请求头指定了application/json,避免序列化/反序列化出错
-keep class org.json.** { *; }

# 保留RN桥接方法,防止JS与Native通信的方法被混淆
-keepclasseswithmembers class * {
    @com.facebook.react.bridge.ReactMethod <methods>;
}

如果你自己封装了网络请求类,也要把对应的包路径加进去:

# 替换成你项目里网络封装类的实际包名
-keep class com.yourproject.network.** { *; }
三、验证修复效果

加完规则后重新构建release包,再用调试器追踪Fetch调用:

  • 如果能正常拿到响应,说明规则生效了;
  • 如果还是没反应,再去看mapping.txt里有没有遗漏的核心类,或者检查是不是请求头里的常量字符串被Proguard意外优化了(这个概率很低,但可以留意)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 09:46:43