使用@viro-community/react-viro生成签名APK时遭遇重复资源错误
核心原因
这类错误通常是Viro库打包时自动处理3D资源(obj/mtl/纹理),但Android资源合并机制对文件名、存放路径要求严格,一旦出现命名冲突、路径重复,就会触发重复资源报错。
具体解决步骤
统一资源文件名格式
确保所有3D相关文件(obj、mtl、纹理图)的文件名全小写,不含空格、特殊字符(比如MyModel.obj改成mymodel.obj)。Android资源系统会自动转义不符合规范的文件名,容易生成重复条目。调整本地资源存放位置
不要把3D资源放在Android的res目录下,新建android/app/src/main/assets文件夹,将所有obj、mtl、纹理文件放入其中。在Viro3DObject中引用时使用:<Viro3DObject source={require('./assets/mymodel.obj')} resources={[require('./assets/mymodel.mtl'), require('./assets/texture.png')]} // ...其他属性 />这样Gradle不会将这些文件识别为Android资源,避免合并冲突。
修改Gradle打包配置
在android/app/build.gradle的android块中添加资源冲突处理规则,强制优先选择第一个匹配的资源:android { // ...其他已有配置 packagingOptions { pickFirst '**/*.obj' pickFirst '**/*.mtl' pickFirst '**/*.png' // 根据你的纹理格式调整,比如jpg就加**/*.jpg } }如果明确知道重复资源的路径,也可以用
exclude直接排除重复项:packagingOptions { exclude 'some/duplicate/path/model.obj' }清理缓存后重新打包
先清理Gradle缓存:cd android && ./gradlew clean回到项目根目录后,重新生成签名APK:
npx react-native run-android --variant release或者直接用Android Studio的
Build -> Generate Signed Bundle/APK流程操作。更新Viro库版本
旧版本的@viro-community/react-viro可能存在打包资源处理的bug,执行命令更新到最新稳定版:npm install @viro-community/react-viro@latest # 或者yarn用户 yarn add @viro-community/react-viro@latest
额外说明
如果使用网络URL的3D资源也报错,大概率是Viro在打包时会预加载缓存网络资源到本地,导致和本地资源重名。可以给网络资源的文件名添加唯一前缀,或者在Gradle的packagingOptions中排除Viro的缓存路径。
内容的提问来源于stack exchange,提问作者راجہ مخلص

