Expo 50 Android生产环境中如何对打包的PNG资源进行Base64编码
Expo 50 Android生产环境中如何对打包的PNG资源进行Base64编码
我完全理解你折腾这么久的烦躁——开发环境好好的,一打包APK就掉链子,这种问题最磨人了。咱们一步步来解决这个问题:
首先,你提到不能用SDK51的Asset API,但其实Expo 50依然可以用旧版的expo-asset库来处理打包资源,这是关键。另外,Expo打包Android APK时,静态资源并不是以普通文件的形式存在(这也是你解压APK找不到图片的原因,它们被编译进了asset bundles里),所以直接用file://前缀肯定行不通。
下面是经过验证的解决方案:
步骤1:确保依赖安装正确
如果还没装expo-asset,先执行安装:
npx expo install expo-asset
步骤2:正确加载资源并转换为Base64
我们需要先通过expo-asset加载资源,确保它在生产环境中能被正确定位,再用expo-file-system读取为Base64编码:
import { Asset } from 'expo-asset'; import * as FileSystem from 'expo-file-system'; // 封装成异步函数方便调用 async function convertImageToBase64() { try { // 1. 通过require引入你的图片资源,注意路径要正确 const imageModule = require('./assets/your-target-image.png'); // 2. 将模块转换为Asset实例 const imageAsset = Asset.fromModule(imageModule); // 3. 等待资源加载完成(生产环境中这一步会确保资源被正确定位) await imageAsset.loadAsync(); // 4. 获取生产环境可用的URI,Android下这个URI应该是`asset://`开头的,不用额外加前缀 const assetUri = imageAsset.localUri; // 5. 读取资源并转换为Base64 const base64Data = await FileSystem.readAsStringAsync(assetUri, { encoding: FileSystem.EncodingType.Base64, }); // 拿到Base64后就可以用来生成PDF了 return base64Data; } catch (error) { console.error('转换Base64失败:', error); // 可以在这里做错误处理,比如提示用户 throw error; } }
关键注意事项
- 资源必须被Expo打包识别:确保你的图片路径被添加到
app.json的assets数组中,比如:
这样Expo打包时才会把这些资源包含到APK里。{ "expo": { "assets": ["./assets/images/"] // 把你的图片所在目录加进去 } } - 不要手动修改URI前缀:
imageAsset.localUri已经是生产环境可用的正确路径,手动加file:///或file:///android_asset反而会导致FileSystem找不到资源。 - 路径不要写错:开发时metro可能会宽容一些路径错误,但打包时必须保证
require的路径完全正确,建议用相对路径,避免绝对路径。
如果还是不行,可以先打印imageAsset.localUri看看生产环境下的实际值,确认它是asset://开头的,然后用FileSystem.getInfoAsync(assetUri)检查资源是否存在,这样能快速定位问题出在资源加载还是读取环节。
备注:内容来源于stack exchange,提问作者Danny_P
相关产品推荐
相关产品推荐

