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

