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

rn-fetch-blob编译Release包后失效,Debug包正常运行问题求助

RN-Fetch-Blob Release构建下载功能失效问题

问题概况

使用rn-fetch-blob实现文件本地下载,Debug模式(npx react-native run-android及Debug APK)下一切正常,但打包Release版本(assembleRelease)后下载功能完全失效。

项目依赖配置(package.json)

"dependencies": {
    "@react-navigation/native": "^6.1.2",
    "@react-navigation/native-stack": "^6.9.8",
    "axios": "^1.2.2",
    "react": "18.1.0",
    "react-native": "0.70.6",
    "react-native-fs": "^2.20.0",
    "react-native-safe-area-context": "^4.4.1",
    "react-native-screens": "^3.18.2",
    "react-native-video": "^5.2.1",
    "rn-fetch-blob": "^0.12.0"
  },
  "devDependencies": {
    "@babel/core": "^7.12.9",
    "@babel/runtime": "^7.12.5",
    "@react-native-community/eslint-config": "^2.0.0",
    "babel-jest": "^26.6.3",
    "eslint": "^7.32.0",
    "jest": "^26.6.3",
    "metro-react-native-babel-preset": "0.72.3",
    "react-test-renderer": "18.1.0"
  }

下载功能实现代码

const hanldePress = async () => {
    requestGet(`/getswpvideo?org_id=${envConst.orgID}`).then((res) => {
      if (res?.data?.body) {
        let videoLength = res?.data?.body?.length;
        res?.data?.body?.forEach(async (i) => {
          const nameArr = i.category_name.split("/")
          const name = nameArr.pop();
          if (!await RNFS.exists(`${RNFS.DownloadDirectoryPath}/${envConst.videoFolderName}/${name}`)) {
            const { config, fs, } = RNFetchBlob
           
            let options = {
              fileCache: true,
              addAndroidDownloads: {
                useDownloadManager: true,
                notification: false,
                path: `${RNFS.DownloadDirectoryPath}/${envConst.videoFolderName}/${name}`,
              }
            }
           try {
            await config(options).fetch('GET', i.category_name)
            videoLength--;
           } catch (error) {
            ToastAndroid.show('Something went wrong!!!',ToastAndroid.SHORT);
           }
           
          } else {
            videoLength--;
            if (videoLength === 0) {
              ToastAndroid.show('Download Complete',ToastAndroid.SHORT);
            }
          }
        })
      }
    })
  }

Logcat错误信息

抛出java.lang.ClassNotFoundException: com.RNFetchBlob.RNFetchBlobPackage异常

AndroidManifest权限配置

已添加必要权限:

  • android.permission.INTERNET
  • android.permission.WRITE_EXTERNAL_STORAGE
  • android.permission.READ_EXTERNAL_STORAGE

解决方案

1. 添加ProGuard混淆规则

在android/app/proguard-rules.pro文件中加入以下内容,避免RNFetchBlob被混淆移除:

-keep class com.RNFetchBlob.** { *; }
-dontwarn com.RNFetchBlob.**

2. 确认包链接配置

自动链接(React Native 0.60+)

执行命令重新触发自动链接:

npx react-native link rn-fetch-blob

手动链接(自动链接失效时)

  • 在android/settings.gradle中添加:
    include ':rn-fetch-blob'
    project(':rn-fetch-blob').projectDir = new File(rootProject.projectDir, '../node_modules/rn-fetch-blob/android')
    
  • 在android/app/build.gradle的dependencies块中添加:
    implementation project(':rn-fetch-blob')
    
  • 在MainApplication.java中注册包:
    import com.RNFetchBlob.RNFetchBlobPackage;
    
    @Override
    protected List<ReactPackage> getPackages() {
      return Arrays.asList(
        new MainReactPackage(),
        new RNFetchBlobPackage() // 新增该行
      );
    }
    

3. 检查Release构建配置

确保android/app/build.gradle中Release构建正确启用混淆并指定规则文件:

buildTypes {
  release {
    minifyEnabled true
    proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
  }
}

4. 清理缓存后重新构建

执行以下命令清理旧构建缓存,再重新打包Release版本:

cd android && ./gradlew clean
cd .. && npx react-native run-android --variant=release

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.31 04:21:48