Expo Eject后Android应用无法运行 报package不存在、找不到符号错误
- 这是我开发的首个React Native应用,项目初期因不确定后续所需功能,选择基于Expo Managed工作流开发。后续因需要实现平台特定配置,执行了Expo Eject操作,操作完成后Android端始终无法正常运行,也无法构建可供Google Play上架的安装包。
- 此前仅使用Expo Managed工作流开发过React Native应用,缺乏Android原生配置相关经验,已尝试全网检索到的各类可行解决方案均未修复问题,目前无从排查。
- Node 16.15.0
- Npm 8.5.5
- React 17.0.2
- React Native 0.68.2
- Expo SDK 45.0.0
- Android Studio配置:
- SDK 33
- SDK Tools 33
执行npx react-native run-android命令时出现大量报错,报错分为两类:error: package android.xxx.yyy not found、error: cannot find symbol。初步推测是Expo eject过程中Android相关配置出现损坏,未在公开渠道找到对应解决方案,可按需补充其他排查信息。
因平台字数限制,完整错误日志已上传至公开日志托管平台,典型报错示例如下:
/Users/shendric/Desktop/Palau/PalauApp/node_modules/expo-modules-core/android/src/main/java/expo/modules/apploader/AppLoaderProvider.java:4: error: package android.content.pm does not exist import android.content.pm.PackageManager;
/Users/shendric/Desktop/Palau/PalauApp/node_modules/expo-modules-core/android/src/main/java/expo/modules/core/interfaces/Package.java:13: error: cannot find symbol default List<? extends InternalModule> createInternalModules(Context context) { ^ symbol: class Context location: interface Package
这类报错本质是Expo Eject流程未正确同步Android原生工程配置,SDK依赖关联失效,按以下步骤操作即可修复:
1. 修正本地SDK路径配置
打开项目根目录下的android/local.properties文件,确认sdk.dir配置项指向本地Android SDK的实际安装路径,路径不要包含中文、特殊字符或空格,Mac环境默认路径参考:
sdk.dir=/Users/你的系统用户名/Library/Android/sdk
如果该文件不存在,手动新建即可。
2. 对齐编译SDK版本
Expo SDK 45 最高兼容Android SDK 32,本地安装的SDK 33和当前版本不兼容,是触发依赖找不到的核心原因。打开android/build.gradle文件,修改buildscript.ext下的版本配置:
buildscript { ext { buildToolsVersion = "31.0.0" minSdkVersion = 21 compileSdkVersion = 32 targetSdkVersion = 32 } }
修改完成后打开Android Studio的SDK Manager,补装Android 12 (S) 对应的SDK 32版本、31.0.0版本的Build Tools。
3. 重置原生配置并清理缓存
在项目根目录依次执行以下命令,修复eject流程遗漏的配置项:
# 重装依赖排除node_modules缓存问题 rm -rf node_modules && npm install # 清理Android构建缓存 cd android && ./gradlew clean && cd .. # 重新同步Expo原生配置,自动补全缺失的gradle依赖项 npx expo prebuild --platform android
执行prebuild命令时如果提示覆盖现有android目录,选择确认覆盖即可。
4. 校验Gradle JDK版本
打开Android Studio,进入设置页的Build, Execution, Deployment > Build Tools > Gradle选项,将Gradle JDK设置为JDK 11,React Native 0.68.2不兼容JDK 17及以上版本,版本不匹配也会触发类找不到的编译错误。
以上步骤完成后,重新执行npx react-native run-android即可正常调试运行。需要构建Google Play上架包时,进入android目录执行./gradlew bundleRelease即可生成符合要求的AAB安装包。
内容的提问来源于stack exchange,提问作者Simon Hendrickx

