如何列出Expo项目构建产物包含的所有Android原生依赖?
获取Expo项目Android原生全量依赖的可靠方案
所有从最终二进制反编译推依赖的方式都存在误差,最准确的数据源来自Gradle构建阶段的依赖解析结果——这是打包流程中唯一决定哪些依赖会被打进最终产物的环节,结果100%和你构建出的aab/apk内包含的依赖一致,不存在遗漏或误判。
操作步骤
- 首先在Expo项目根目录执行命令生成原生构建骨架:
expo prebuild --platform android --clean
这个命令会自动执行所有config plugin的注入逻辑,把package.json中引用的所有Expo模块、React Native核心、第三方原生模块的依赖配置全部落地到android目录的Gradle文件中。你之前看到的Gradle里调用Node解析模块路径的代码,会在prebuild阶段和后续Gradle执行阶段自动求值,不需要手动运行。
注意:prebuild操作不会修改你的JS/TS业务代码,执行完成后如果不需要原生目录,直接删除
android文件夹即可恢复原有Expo项目结构。
- 进入生成的android目录,执行Gradle内置的依赖查询命令,拉取正式发布构建变体下的全量依赖:
cd android ./gradlew app:dependencies --configuration releaseRuntimeClasspath > raw_deps.log
这里用releaseRuntimeClasspath配置的原因是,这个配置项就是Gradle打包release版aab/apk时,用来筛选所有要打入包内依赖的官方配置,所有传递依赖、版本冲突仲裁后的最终结果都会完整输出,包括你提到的com.facebook.react相关依赖、所有Expo SDK自带的原生依赖、你手动接入的第三方原生库,没有遗漏。
- 如果需要直接输出你要的
com.company.example:identifier:x.y.z格式的去重列表,直接执行过滤命令即可:
./gradlew app:dependencies --configuration releaseRuntimeClasspath | grep -E '^[|+\\ ]+[a-zA-Z0-9.]+:[a-zA-Z0-9.-]+:[a-zA-Z0-9.-]+' | sed 's/^[|+\\ ]*//g' | sort -u > final_android_deps.txt
生成的final_android_deps.txt就是可以直接使用的全量依赖清单。
常见误区说明
- 反编译aab后通过包名抓取依赖的方式不可靠:代码混淆会篡改类的包名路径,多个依赖可能存在包名交叉,同时自动生成的R类、BuildConfig类的包名和依赖实际Maven坐标并不一一对应,结果必然存在误差。
- AndroidManifest.xml不会列出所有依赖:只有声明了四大组件、权限等配置的依赖才会在合并后的Manifest里留痕,大量基础工具类依赖不会出现在Manifest中,用它统计必然缺项。
- 如果你使用EAS云端构建,不需要本地跑prebuild,只需要在eas.json的构建hook中添加上述Gradle依赖查询命令,把生成的依赖清单作为构建产物导出即可,结果和本地执行完全一致。
内容的提问来源于stack exchange,提问作者devGG
相关产品推荐
相关产品推荐

