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

使用@viro-community/react-viro生成签名APK时遭遇重复资源错误

解决React Native中@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,提问作者راجہ مخلص

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 13:07:23