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.INTERNETandroid.permission.WRITE_EXTERNAL_STORAGEandroid.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
相关产品推荐
相关产品推荐

