告别Android Studio:纯命令行搭建React Native安卓环境
1. 为什么我要绕开 Android Studio 装 RN 环境
先说结论:如果你只是想在 Windows 上跑一个 React Native 的 Android 工程,完全不需要装那个动辄十几个 G 的 Android Studio。我用命令行从零搭了三套环境,最慢的一次也就四十分钟,装完整个 SDK 目录控制在 3G 以内,机器清爽,升级也透明。
大多数人第一次接触 RN 的 Android 环境,都是被教程引导着去下载 Android Studio,然后一路 Next,最后发现硬盘被吃掉一大块,启动一个模拟器风扇狂转,Gradle 同步卡在某个进度条上半天不动。更麻烦的是,Android Studio 帮你做了太多"黑盒"操作——它自动选了哪个 SDK 版本、自动装了哪些 build-tools、环境变量到底写没写对,你一概不清楚。一旦出问题,排查起来就是纯靠猜。
我这次要分享的,是纯命令行的搭建路径。核心思路很简单:RN 的 Android 构建本质上就是 Gradle 在调用 Android SDK 里的几个命令行工具,Android Studio 只是一个图形化的壳。我们把这个壳去掉,直接装 SDK、配环境变量、用 Gradle 跑构建,整条链路每一环都看得见、控得住。
这套方案适合几类人:一是机器配置一般、不想被 IDE 拖慢的开发者;二是喜欢把环境配置脚本化、可复现的工程师;三是已经在用 VS Code 或其它编辑器写 RN,只缺 Android 构建能力的人。如果你完全没碰过命令行,也不用慌,我会把每一步的命令和背后的原因都讲清楚,照着敲就行。
需要提前说明的是,本文所有操作都在 Windows 10/11 的 PowerShell 或 CMD 下完成,不涉及任何需要特殊网络手段的工具,全部使用官方公开的下载渠道和命令行工具。
2. 装之前先把这几个概念理清楚
2.1 RN 的 Android 构建到底依赖什么
很多人搭环境失败,根本原因不是命令敲错了,而是不知道每个组件是干嘛的。我先把这条链路上的关键角色列出来,你理解了它们的分工,后面出问题就知道该查哪里。
React Native 的 Android 侧,最终产物是一个 APK。这个 APK 的生成过程由 Gradle 驱动。Gradle 是一个构建工具,它读取工程里的 build.gradle 文件,知道要编译哪些 Java/Kotlin 代码、打包哪些资源。而 Gradle 在编译 Android 代码时,需要调用 Android SDK 里的工具,比如 aapt2(处理资源)、d8(把 Java 字节码转成 dex)、zipalign(对齐 APK)等等。
所以依赖关系是这样的:
- JDK:Gradle 本身跑在 JVM 上,编译 Java/Kotlin 也需要 JDK。RN 目前主流要求 JDK 17。
- Android SDK:提供编译 Android 所需的一切工具和平台文件。
- Gradle:RN 工程自带 Gradle Wrapper,不需要你单独装,但需要它能找到 JDK 和 SDK。
- Node.js:RN 的 JS 侧打包、Metro 服务需要它。
这四样齐了,环境就通了。Android Studio 只是把这四样(除了 Node)打包在一起给你,我们手动装,反而更清楚。
2.2 SDK 目录里到底该装哪几个包
Android SDK 不是一个单一软件,而是一个目录结构,里面分了好几类内容。用命令行装的时候,最容易懵的就是"我到底要装哪些"。我按实际构建需要,给你梳理清楚:
| 组件类别 | 具体包名示例 | 作用 | 是否必需 |
|---|---|---|---|
| Platform | platforms;android-34 | 目标 Android 版本的框架文件 | 必需 |
| Build-Tools | build-tools;34.0.0 | aapt2、d8、zipalign 等构建工具 | 必需 |
| Platform-Tools | platform-tools | adb、fastboot 等设备通信工具 | 必需 |
| Command-Line Tools | cmdline-tools;latest | sdkmanager、avdmanager 等管理工具 | 必需 |
| NDK | ndk;25.x | 编译原生 C/C++ 代码 | 按需 |
| Emulator | emulator | 模拟器本体 | 按需 |
这里有个关键点:Command-Line Tools 是入口。你得先有它,才能用 sdkmanager 去装其它包。而它本身又不在 SDK 目录里,需要单独下载解压。这是整个流程里第一个容易卡住的地方。
2.3 版本怎么选才不踩坑
RN 版本和 Android SDK 版本之间有对应关系。比如 RN 0.73 默认用 compileSdkVersion 34,那你就得装 platforms;android-34 和对应的 build-tools。如果你装的 SDK 版本和工程里 build.gradle 写的不一致,Gradle 会报错说找不到某个 platform。
我的建议是:先看你工程的 android/build.gradle 里 compileSdkVersion 和 buildToolsVersion 写的是多少,然后照着装。不要盲目装最新版,也不要装一堆用不上的版本占地方。JDK 同理,RN 0.73 之后基本都要求 JDK 17,装 17 就对了,别用 8 或 11 去凑。
3. 命令行装 SDK 的完整实操链路
3.1 先搞定 JDK 17
JDK 我推荐用 Eclipse Temurin(原 AdoptOpenJDK)的 17 版本,稳定、免费、Windows 安装包干净。下载 msi 安装包一路 Next 即可,安装路径建议保持默认,比如 C:\Program Files\Eclipse Adoptium\jdk-17.x.x。
装完之后验证:
如果输出里能看到 17.0.x 就对了。如果提示找不到命令,说明环境变量没配好。你需要手动加两个变量:
JAVA_HOME=C:\Program Files\Eclipse Adoptium\jdk-17.x.x- 在
Path里追加%JAVA_HOME%\bin
注意:改完环境变量一定要重开一个终端窗口,旧窗口不会自动刷新。这个坑我踩过不止一次,改完变量在当前窗口敲命令死活不生效,白白排查半天。
3.2 下载并放置 Command-Line Tools
去 Android 开发者官网的 Command-Line Tools 下载页,选 Windows 版的 zip 包。下载下来是一个类似 commandlinetools-win-xxxx_latest.zip 的文件。
接下来是关键操作。解压后你会看到一个 cmdline-tools 目录,里面有个 bin 文件夹。不要直接把它丢到 SDK 根目录,正确的结构是这样的:
也就是说,你要在 cmdline-tools 下建一个叫 latest 的文件夹,把解压出来的 bin、lib 等目录放进去。为什么?因为 sdkmanager 会根据自己的位置去推断 SDK 根目录,如果结构不对,它会报"找不到 SDK 根目录"。
我建议把 SDK 根目录设在 C:\Android\Sdk,路径短、没空格、没中文,能避开一大堆路径解析的坑。
3.3 配置 ANDROID_HOME 与 Path
环境变量配三个:
ANDROID_HOME=C:\Android\SdkANDROID_SDK_ROOT=C:\Android\Sdk(有些老工具还在读这个变量,一起配上省事)Path里追加:%ANDROID_HOME%\cmdline-tools\latest\bin%ANDROID_HOME%\platform-tools
配完重开终端,敲:
能打印出版本号,说明入口通了。这一步是整个流程的分水岭,过了这关后面就顺了。
3.4 用 sdkmanager 装齐必需包
先看看有哪些包可装:
输出会很长,分"Installed packages"和"Available Packages"两块。我们直接装需要的:
如果你需要模拟器,再加:
装的过程中会弹出许可协议,让你输入 y 确认。如果包多,一个个确认很烦,可以先用这条命令批量接受:
一路 y 下去,把所有协议都接受掉。
实操心得:
sdkmanager下载走的是 Google 的服务器,国内有时候会慢。如果卡住不动,可以配一下代理镜像,但注意别用任何来路不明的工具,用官方支持的镜像源就行。我一般是在网络状况好的时候一次性把包装齐,避免构建时临时下载。
3.5 验证 SDK 是否装对
装完敲:
应该能看到你刚装的几个包。再去 C:\Android\Sdk 下看目录结构,platforms、build-tools、platform-tools 三个文件夹都在,就说明 SDK 侧齐活了。
顺便验证一下 adb:
能打印版本号,说明 platform-tools 的 Path 配对了。
4. 让 RN 工程真正跑起来的收尾配置
4.1 在工程里指定 SDK 路径
环境变量配好了,但 Gradle 有时候还是找不到 SDK,尤其是你从别人那 clone 来的工程。最稳妥的做法是在工程根目录的 android 文件夹下建一个 local.properties 文件,写一行:
注意路径里的反斜杠要转义,或者干脆用正斜杠:
这个文件不要提交到 git,它跟具体机器绑定。RN 的 .gitignore 默认就忽略了它,你确认一下就行。
4.2 检查 Gradle 用的 JDK
RN 工程自带的 Gradle Wrapper 会去找 JAVA_HOME。如果你机器上有多个 JDK,可能它挑错了版本。可以在 android/gradle.properties 里显式指定:
这样不管系统默认 JDK 是啥,Gradle 都用你指定的这个。多 JDK 环境下这招特别管用。
4.3 第一次构建:从 clean 到 installDebug
进到工程的 android 目录,先跑一次 clean 确保没有残留:
Windows 下如果 ./gradlew 不认,用:
然后构建 debug 包:
第一次构建会下载 Gradle 发行版和一堆依赖,慢是正常的,耐心等。构建成功后,APK 在 android/app/build/outputs/apk/debug/ 下。
如果你连着设备或模拟器,直接装上去:
4.4 启动 Metro 并跑起来
回到工程根目录,开一个终端跑 Metro:
再开一个终端,把 app 装到设备上并启动:
如果一切正常,设备上会出现你的 RN 应用。第一次启动可能会白屏几秒,那是 Metro 在打包 JS bundle,属正常现象。
5. 那些让我熬夜的坑与排查思路
5.1 白屏问题:先分清是 JS 侧还是原生侧
RN 启动白屏是最常见的求助。我的排查顺序是这样的:
第一步,看 Metro 终端有没有报错。如果 JS bundle 打包失败,Metro 会红字报错,这种最好办,按报错改代码就行。
第二步,如果 Metro 没报错但设备白屏,摇一摇设备(或按 Ctrl+M)调出开发者菜单,看能不能弹出。能弹出说明原生侧是好的,问题在 JS 加载。这时候检查设备能不能连上 Metro 服务,通常是端口 8081 被占或设备网络不通。
第三步,如果开发者菜单都弹不出来,那是原生侧的问题,多半是 APK 没装对或者 native 模块初始化失败。看 adb logcat 的输出,过滤 ReactNative 关键字。
经验:白屏十次里有七次是 Metro 没起来或者端口冲突。先确认
npx react-native start那个窗口还活着,再确认 8081 端口没被别的程序占用。
5.2 端口被占:Windows 下怎么快速定位
Windows 上 8081 被占是家常便饭。查端口占用:
最后一列是 PID,拿着 PID 去任务管理器找对应进程,或者直接:
找到之后,要么关掉它,要么让 Metro 换个端口:
换了端口之后,设备上的 app 也要知道新端口。用:
把设备的端口映射到主机。
5.3 SDK 版本不匹配的报错长什么样
如果你看到类似这样的报错:
或者:
那就是 SDK 版本和工程要求对不上。解决办法很简单,用 sdkmanager 把缺的版本装上:
装完再构建。我建议养成习惯,clone 一个新工程后先看 android/build.gradle 里的版本号,提前把对应 SDK 装好,别等构建报错再回头装。
5.4 Gradle 下载卡住怎么办
第一次构建时 Gradle 要下载发行版,国内网络下可能很慢甚至超时。两个办法:
一是手动下载对应版本的 Gradle 发行版,放到 C:\Users\你的用户名\.gradle\wrapper\dists\ 下对应的目录里。目录名是一串哈希,你跑一次构建让它创建目录,然后把下载好的 zip 丢进去,再跑构建它就会用本地的。
二是在 android/gradle/wrapper/gradle-wrapper.properties 里把 distributionUrl 换成国内可访问的镜像地址。改之前先备份原文件。
5.5 adb 认不到设备
设备插上了但 adb devices 列表是空的,常见原因有几个:
- 手机没开 USB 调试。去开发者选项里打开。
- 数据线是充电线,不支持数据传输。换一根。
- 驱动没装。Windows 下有些机型需要单独装 USB 驱动。
- adb 服务卡死。重启一下:
再 adb devices 看看。
6. 把这套流程脚本化的几个思路
环境搭一次就够了,但如果你经常换机器或者带团队,把这套流程脚本化能省很多事。我自己的做法是写一个 PowerShell 脚本,把下载、解压、配环境变量、装 SDK 包这几步串起来。
核心逻辑大概是:
这个脚本不是让你照抄,而是给你一个思路:把重复劳动固化下来。团队里新人入职,跑一遍脚本,环境就齐了,比口头指导靠谱得多。
提醒:脚本里的下载地址会随版本更新变化,用之前去官网确认一下当前的最新链接。另外环境变量写入后需要重开终端才生效,脚本里可以加一句提示。
7. 关于工具选型的一点个人看法
有人会问,既然命令行能装,为什么还有那么多人用 Android Studio?我的看法是:工具没有优劣,只有场景匹配。
如果你要做复杂的原生 UI 调试、要看布局预览、要用 Profiler 分析性能,那 Android Studio 的图形化能力确实省事。但如果你只是写 RN 的 JS 侧,偶尔改改原生模块,那 IDE 的绝大部分功能你都用不上,反而要忍受它的启动慢、占内存、自动更新打断工作流。
命令行方案最大的价值不是"省空间",而是透明。每一个 SDK 包是你主动装的,每一个环境变量是你主动配的,构建失败时你知道该去哪个环节找原因。这种掌控感,是黑盒工具给不了的。
我现在的工作流是:VS Code 写代码,命令行跑 Metro 和 Gradle,需要看原生日志就 adb logcat,需要装包就 sdkmanager。整套下来机器轻快,出问题定位快,换机器迁移也就是跑个脚本的事。
如果你之前一直被 Android Studio 的各种同步、索引、更新折磨,不妨试试这条纯命令行的路子。第一次搭可能要多花点时间理解每个环节,但搭完之后你会发现,原来 RN 的 Android 环境可以这么清爽。