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

Expo项目运行报错:Task :app:mergeDebugNativeLibs FAILED 求助

问题描述

从Web开发转移动端开发,React Native新手,创建Expo项目后在Android Studio运行时出现以下错误:

* What went wrong:
Execution failed for task ':app:mergeDebugNativeLibs'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.MergeNativeLibsTask$MergeNativeLibsTaskWorkAction
   > 2 files found with path 'lib/arm64-v8a/liblog.so' from inputs:
      - C:\\Users\\recep\\Desktop\\software\\aa-course\\node_modules\\react-native-mmkv\\android\\build\\intermediates\\library_jni\\debug\\jni\\arm64-v8a\\liblog.so
      - C:\\Users\\recep\\Desktop\\software\\aa-course\\node_modules\\react-native-quick-crypto\\android\\build\\intermediates\\library_jni\\debug\\jni\\arm64-v8a\\liblog.so
BUILD FAILED in 24m 36s
483 actionable tasks: 163 executed, 320 from cache
Error: C:\\Users\\recep\\Desktop\\software\\aa-course\\android\\gradlew.bat exited with non-zero code: 1
Error: C:\\Users\\recep\\Desktop\\software\\aa-course\\android\\gradlew.bat exited with non-zero code: 1
    at ChildProcess.completionListener (C:\\Users\\recep\\Desktop\\software\\aa-course\\node_modules\\@expo\\cli\\node_modules\\@expo\\spawn-async\\build\\spawnAsync.js:52:23)
    at Object.onceWrapper (node:events:629:26)
    at ChildProcess.emit (node:events:514:28)
    at cp.emit (C:\\Users\\recep\\Desktop\\software\\aa-course\\node_modules\\@expo\\cli\\node_modules\\cross-spawn\\lib\\enoent.js:34:29)
    at maybeClose (node:internal/child_process:1105:16)
    at ChildProcess._handle.onexit (node:internal/child_process:305:5)
    ...
    at Object.spawnAsync [as default] (C:\\Users\\recep\\Desktop\\software\\aa-course\\node_modules\\@expo\\cli\\node_modules\\@expo\\spawn-async\\build\\spawnAsync.js:17:21) 
    at spawnGradleAsync (C:\\Users\\recep\\Desktop\\software\\aa-course\\node_modules\\@expo\\cli\\build\\src\\start\\platforms\\android\\gradle.js:72:46)
    at Object.assembleAsync (C:\\Users\\recep\\Desktop\\software\\aa-course\\node_modules\\@expo\\cli\\build\\src\\start\\platforms\\android\\gradle.js:52:18)
    at runAndroidAsync (C:\\Users\\recep\\Desktop\\software\\aa-course\\node_modules\\@expo\\cli\\build\\src\\run\\android\\runAndroidAsync.js:35:24)
    at process.processTicksAndRejections (node:internal/process/task_queues:95:5)
error Command failed with exit code 1.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

已尝试在build.gradle的packagingOptions中添加pickFirst,但问题仍存在,询问问题原因及解决办法。

原因分析

这个错误是因为react-native-mmkv和react-native-quick-crypto两个第三方库都打包了Android系统自带的liblog.so文件,Gradle在合并Native库时发现重复文件,导致合并失败。如果添加了pickFirst仍无效,大概率是配置位置不对、覆盖的架构不全,或者缓存未清理导致配置未生效。

解决办法
  • 确认packagingOptions的配置位置
    必须将配置放在app模块的build.gradle文件中(路径:android/app/build.gradle),且在android{}代码块内部,示例配置:

    android {
      // 其他配置...
      packagingOptions {
          pickFirst 'lib/**/liblog.so'
      }
    }
    

    注意:不要把配置放在项目根目录的build.gradle里,那样不会生效。

  • 覆盖所有CPU架构的重复文件
    只针对arm64-v8a架构配置pickFirst可能不够,要确保覆盖所有Android支持的架构,用通配符**匹配所有子目录,这样不管哪个架构下的liblog.so都会被优先选择第一个。

  • 清理Gradle缓存
    缓存可能导致新配置不生效,执行以下命令清理:

    # 清理项目缓存
    ./gradlew clean
    # 清理Gradle全局缓存(可选,若clean后仍无效)
    ./gradlew cleanBuildCache
    

    执行完后重新构建项目。

  • 升级第三方库版本
    部分库的旧版本可能存在错误打包系统库的问题,检查react-native-mmkv和react-native-quick-crypto的最新版本,升级到最新版后重新安装依赖,再构建项目。

  • 排除其中一个库的重复文件
    如果pickFirst仍无效,可以直接排除其中一个库的liblog.so文件,比如排除react-native-quick-crypto的:

    android {
      // 其他配置...
      packagingOptions {
          exclude 'lib/**/liblog.so'
      }
    }
    

    或者针对特定库排除,在dependencies块中添加:

    dependencies {
      implementation(project(':react-native-quick-crypto')) {
          exclude fileTree(dir: 'libs', include: ['liblog.so'])
      }
    }
    

    注意:排除前要确认该库移除liblog.so后不影响功能,因为liblog是系统自带的库,大部分情况下不会有问题。


内容的提问来源于stack exchange,提问作者Recep Çankaya

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.04 02:34:56