Expo ejected项目Expo Asset库debug正常release模式下无法获取图片路径
解决方案
问题根因
Android release构建流程中,Expo默认会将静态资源打包进APK的assets目录,不会主动解压到本地可访问的文件缓存路径,因此Asset.loadAsync返回的localUri不会生成完整file路径,仅返回资源标识符。
方案1:手动复制资源到缓存目录获取路径(推荐,兼容Expo全 workflow)
需配合expo-file-system库实现,无论debug还是release模式都可以稳定返回绝对路径:
- 安装依赖:
npx expo install expo-file-system
- 封装调用方法:
import { Asset } from 'expo-asset'; import * as FileSystem from 'expo-file-system'; const getAssetAbsolutePath = async (assetModule) => { const [targetAsset] = await Asset.loadAsync(assetModule); // Debug模式直接返回原生生成的路径 if (targetAsset.localUri?.startsWith('file://')) { return targetAsset.localUri; } // Release模式手动拷贝资源到缓存目录生成可访问路径 const cachedFilePath = `${FileSystem.cacheDirectory}${targetAsset.name}.${targetAsset.type}`; await FileSystem.copyAsync({ from: targetAsset.uri, to: cachedFilePath }); return cachedFilePath; } // 业务调用 const backgroundUri = await getAssetAbsolutePath(require('../../assets/bg_img.jpg'));
- 配置资源打包规则:在
app.json的expo节点下添加如下配置,确保静态资源被正确打包进APK:
{ "expo": { "assetBundlePatterns": [ "**/*.jpg", "**/*.png" // 可按需添加其他需要打包的资源后缀 ] } }
方案2:修改构建配置强制生成localUri(仅兼容Bare Workflow)
如果你使用的是Expo Bare Workflow(原生工程可修改),可以直接修改Android构建配置,无需额外代码:
在android/app/build.gradle的defaultConfig块中添加如下配置:
android { defaultConfig { // 已有配置保留,新增下面一行 manifestPlaceholders["expo.modules.asset.EnableLocalUriFallback"] = true } }
重新构建release包后,Asset.loadAsync返回的localUri就会和debug模式一致,返回完整的file://路径。
替代方案:使用原生文件操作库实现
如果不想依赖Expo相关生态,可以用react-native-fs库直接操作Android assets目录资源:
- 将需要调用的
bg_img.jpg放到Android原生工程的android/app/src/main/assets/目录下(没有assets目录就新建) - 安装依赖:
npm install react-native-fs --save
- 调用代码:
import RNFS from 'react-native-fs'; const getAssetAbsolutePath = async () => { const cachedPath = `${RNFS.CachesDirectoryPath}/bg_img.jpg`; // 将assets目录下的资源复制到可访问的缓存目录 await RNFS.copyFileAssets('bg_img.jpg', cachedPath); return `file://${cachedPath}`; }
内容的提问来源于stack exchange,提问作者Asp1re
相关产品推荐
相关产品推荐

