Mac M1上Expo run:android触发:app:checkDebugDuplicateClasses错误求助
Expo 48 Android构建失败:重复类冲突问题
问题场景
在Mac M1设备上运行Expo项目时,以下操作正常执行:
npx expo start # 正常运行 npx expo prebuild # 正常执行
但执行Android设备构建命令时报错:
npx expo run:android --device 1_Pixel_3a_ # 报错
报错信息
> Task :app:checkDebugDuplicateClasses FAILED FAILURE: 构建完成,出现2个失败。 1: 任务执行失败,抛出异常。 ----------- * 问题原因: 任务':app:checkDebugDuplicateClasses'执行失败。 > 执行com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable时出错 > 在模块jetified-lifecycle-viewmodel-ktx-2.3.1-runtime(androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1)和lifecycle-viewmodel-2.5.1-runtime(androidx.lifecycle:lifecycle-viewmodel:2.5.1)中发现重复类androidx.lifecycle.ViewModelLazy 在模块jetified-lifecycle-viewmodel-ktx-2.3.1-runtime(androidx.lifecycle:lifecycle-viewmodel-ktx:2.3.1)和lifecycle-viewmodel-2.5.1-runtime(androidx.lifecycle:lifecycle-viewmodel:2.5.1)中发现重复类androidx.lifecycle.ViewTreeViewModelKt 可查阅文档了解如何修复依赖解析错误。 * 建议尝试: > 使用--stacktrace选项获取堆栈跟踪。 > 使用--info或--debug选项获取更多日志输出。 > 使用--scan选项获取完整洞察。 ============================================================================== 2: 任务执行失败,抛出异常。 ----------- * 问题原因: java.lang.StackOverflowError(无错误信息) * 建议尝试: > 使用--stacktrace选项获取堆栈跟踪。 > 使用--info或--debug选项获取更多日志输出。 > 使用--scan选项获取完整洞察。 ============================================================================== * 更多帮助请访问Gradle官方帮助。 构建中使用了已弃用的Gradle功能,与Gradle 8.0不兼容。 你可以使用'--warning-mode all'显示单个弃用警告,确定它们来自你自己的脚本还是插件。 请查看Gradle 7.5.1命令行界面文档了解命令行警告详情。 为确保正确性,本次构建期间已禁用1个无效工作单元的执行优化。 请查阅弃用警告了解更多详情。 BUILD FAILED in 26s 604个可执行任务: 10个已执行,594个已是最新状态 Error: /Users/joy/Dev/Projects/XXX/XXX-Mobile/mobile/android/gradlew 以非零代码退出: 1 Error: /Users/joy/Dev/Projects/XXX/XXX-Mobile/mobile/android/gradlew 以非零代码退出: 1 at ChildProcess.completionListener (/Users/joy/Dev/Projects/XXX/XXX-Mobile/mobile/node_modules/@expo/spawn-async/build/spawnAsync.js:52:23) at Object.onceWrapper (node:events:628:26) at ChildProcess.emit (node:events:513:28) at maybeClose (node:internal/child_process:1100:16) at Process.ChildProcess._handle.onexit (node:internal/child_process:304:5) ... at Object.spawnAsync [as default] (/Users/joy/Dev/Projects/XXX/XXX-Mobile/mobile/node_modules/@expo/spawn-async/build/spawnAsync.js:17:21) at spawnGradleAsync (/Users/joy/Dev/Projects/XXX/XXX-Mobile/mobile/node_modules/@expo/cli/build/src/start/platforms/android/gradle.js:72:46) at Object.assembleAsync (/Users/joy/Dev/Projects/XXX/XXX-Mobile/mobile/node_modules/@expo/cli/build/src/start/platforms/android/gradle.js:52:18) at runAndroidAsync (/Users/joy/Dev/Projects/XXX/XXX-Mobile/mobile/node_modules/@expo/cli/build/src/run/android/runAndroidAsync.js:31:24) at processTicksAndRejections (node:internal/process/task_queues:96:5)
猜测原因
- 曾尝试将Expo从48升级到50,中途因升级卡住用ctrl+c终止,可能导致依赖环境混乱。
- 使用nvm切换Node版本(16→18)后在其他Next.js 14项目工作,可能影响了当前项目的依赖解析。
- 期间在另一个同版本(Expo 48)的旧Expo项目中工作,可能残留了冲突的缓存或依赖配置。
已尝试的解决方法
# 清除全部缓存 rm -rf node_modules npm cache clean --force npm install watchman watch-del-all rm -fr $TMPDIR/haste-map-* rm -rf $TMPDIR/metro-cache npx expo start --clear #################### npm install -g --force expo-cli nvm alias default 16 # 16.20.1 nvm alias default 18 # 18.20.2 npx expo prebuild --clean # git克隆并重新安装
项目Package.json配置
{ "dependencies": { "@emotion/react": "^11.10.6", "@emotion/styled": "^11.10.6", "@expo/config-plugins": "~6.0.0", "@mui/icons-material": "^5.11.11", "@mui/material": "^5.11.14", "@react-native-async-storage/async-storage": "1.17.11", "@react-native-community/datetimepicker": "6.7.3", "@react-navigation/bottom-tabs": "^6.5.7", "@react-navigation/core": "^6.4.16", "@react-navigation/material-bottom-tabs": "^6.2.15", "@react-navigation/native": "^6.1.6", "@react-navigation/native-stack": "^6.9.12", "@reduxjs/toolkit": "^1.9.3", "@tanstack/react-query": "^4.28.0", "@types/react": "~18.0.27", "axios": "^1.3.4", "base-64": "^1.0.0", "date-fns": "^2.30.0", "dotenv": "^16.3.1", "expo": "~48.0.21", "expo-av": "~13.2.1", "expo-barcode-scanner": "~12.3.2", "expo-blur": "~12.2.2", "expo-dev-client": "~2.2.1", "expo-device": "~5.2.1", "expo-image": "~1.0.2", "expo-linking": "~4.0.1", "expo-location": "~15.1.1", "expo-notifications": "~0.18.1", "expo-secure-store": "~12.1.1", "expo-splash-screen": "~0.18.2", "expo-status-bar": "~1.4.4", "expo-system-ui": "~2.2.1", "expo-updates": "~0.16.4", "framer-motion": "^10.9.1", "js-sha256": "^0.10.1", "jwt-decode": "^3.1.2", "nativewind": "^2.0.11", "react": "18.2.0", "react-devtools": "^4.27.4", "react-native": "0.71.14", "react-native-animatable": "^1.3.3", "react-native-dotenv": "^3.4.9", "react-native-maps": "1.3.2", "react-native-paper": "^5.5.1", "react-native-razorpay": "^2.3.0", "react-native-recaptcha-that-works": "^1.3.2", "react-native-safe-area-context": "4.5.0", "react-native-screens": "~3.20.0", "react-native-svg": "13.4.0", "react-native-vector-icons": "^9.2.0", "react-native-webview": "11.26.0", "react-redux": "^8.0.5", "redux-devtools-extension": "^2.13.9", "remote-redux-devtools": "^0.5.16", "tailwindcss": "3.2.7", "typescript": "^4.9.4" }, "devDependencies": { "@babel/core": "^7.20.2" }, "private": true }
解决方案
1. 强制统一lifecycle依赖版本
在项目根目录的android/build.gradle文件中,添加依赖分辨率规则,强制所有依赖使用同一版本的lifecycle库:
allprojects { repositories { // 保留现有仓库配置 } configurations.all { resolutionStrategy { force 'androidx.lifecycle:lifecycle-viewmodel:2.5.1' force 'androidx.lifecycle:lifecycle-viewmodel-ktx:2.5.1' } } }
2. 清理Android构建缓存
除已尝试的Node缓存,还需清理Android本地构建缓存:
cd android ./gradlew cleanBuildCache ./gradlew clean cd ..
3. 锁定Node版本
使用nvm锁定当前项目的Node版本为Expo 48推荐的16.20.1:
nvm use 16.20.1 # 在项目根目录创建.nvmrc文件,后续进入项目自动切换版本 echo "16.20.1" > .nvmrc
4. 重新预构建并构建
完成上述步骤后,执行以下命令重新构建:
rm -rf node_modules android ios npm install npx expo prebuild --clean npx expo run:android --device 1_Pixel_3a_
内容的提问来源于stack exchange,提问作者JOY SAM RAJ
相关产品推荐
相关产品推荐

