自己当年第一次搭 Android 开发环境,被 JDK、SDK、Gradle 这一串东西折腾到怀疑人生。后来帮不少人看过环境问题,发现大部分人卡住的地方高度雷同:版本对不上、下载慢、模拟器起不来、环境变量配了没反应。这个项目标题看着简单——“配环境”,其实水很深。这篇不聊虚的,把从零到能跑起来一套模拟器的完整路径捋一遍,中间会穿插我踩过的坑和现在固定下来的做法。不管你是第一次接触 Android,还是换新电脑需要重配环境的老人,这篇都能给你省下至少半天时间。
1. 配环境前,先把“安卓开发”这盘棋想明白
很多教程一上来就让你装这个装那个,装完发现问题一堆,根源在于没搞懂这些件之间是什么关系。
1.1 一套完整开发环境到底由哪几部分组成
一套能正常开发 Android 项目的环境,拆开看其实就五块:
- JDK(Java Development Kit):Android 的编译工具链是跑在 Java 虚拟机上的,没有 JDK,Gradle 根本转不起来。
- Android SDK:真正编译 Android 代码所需的核心库、平台 API 和各种构建工具,都在这一个包里。
- IDE(Android Studio):负责把上面这些工具串联起来,提供编辑器、布局预览、调试器这些图形化能力。
- Gradle:现代化 Android 项目的构建系统,负责下载依赖、编译代码、打包 APK。它本身又依赖 JDK,而且它有一套独立的 Gradle 版本和 Android Gradle Plugin(AGP)版本的适配关系。
- 模拟器或真机:用来跑你编译出来的产物。
我见过很多人的误区是,以为装完 Android Studio 就能直接开发了。实际上 Studio 只是个“前台”,它内部会自己带一个 JDK(叫 JBR,JetBrains Runtime),也会顺手帮你把 SDK 下载回来。但如果你的项目要用到命令行构建、持续集成,或者某些老项目 IDE 识别不出来,那系统层面没有配置好 JDK 和 SDK 环境变量,后面各种“奇怪的错”就会冒出来。
所以配环境这件事,不是点击安装那么肤浅,本质上是在规划一套工具链的协作关系。想清楚哪个工具依赖哪个工具,哪个版本跟哪个版本配对,再动手不迟。
1.2 为什么版本组合选择比安装动作更重要
这可能是整个配环境过程中最容易被忽略的。Java 的生态有一个特点:版本前进速度很快,但 Android 的工具链有时候会追不上,或者说为了保证稳定,官方会让特定主版本往固定的版本组合上靠。
举个真实的例子:如果你用 Android Studio 最新稳定版本(比如 2024 年之后的 Giraffe、Hedgehog 版本),它要求 Gradle 版本不低于某个值,同时 AGP 版本也在一个范围内。一旦你打开一个老项目,发现 Gradle 版本是 6.5,AGP 是 4.1,而你的环境按照新版工具链配置,大概率会直接报“Minimum supported Gradle version is 7.0”之类的错误。
类比一下,这就像装修:你定了最新的水电图纸,但工人拿的是旧版验收标准,两边不对表,最后发现墙面都刷完了,插座位置全错。版本组合就是我们动工前必须定下的那张图纸。
1.3 环境变量在 Windows 与 macOS 上的玩法差异
环境变量这事,Windows 和 macOS 完全两套逻辑。Windows 上你通过“系统属性 → 环境变量”图形化界面去配,它分“用户变量”和“系统变量”两层,配置完需要重新打开命令行窗口才能生效。macOS 上则是在.zshrc或.bash_profile里加export语句,靠source让配置立刻生效。
实操中发现一个高频翻车点:Windows 用户在“用户变量”里设了JAVA_HOME,但是“系统变量”的Path里没加%JAVA_HOME%\bin,或者加了但顺序不对。Windows 的 Path 是按照从上到下的顺序查找命令的,如果前面已经有一个旧版本的 Java 路径,你在后面追加了个新的,实际命令行敲java -version时命中的还是旧的。
这个问题在 macOS 上也有,只是表现形式不同——如果你用brew装过多个 JDK,你export的顺序不对,也会发生版本串味的情况。
2. JDK 这一关,决定后面省心还是闹心
先把最基础也最关键的一块讲了。
2.1 JDK 选择:8、11、17 还是 21
很多人一上来就问“最新 JDK 是不是最好?”我的回答是:稳定大于最新。梳理一下 Android 工具链对 JDK 的硬性要求,你会发现一个规律:
- Android Studio Flamingo(2022.3.1)之后,官方内部 JDK 版本已经切到 17。
- AGP 8.x要求 JDK 17 起步。
- AGP 7.x要求 JDK 11 起步。
- 一些非常老的项目(用了 AGP 4.x 甚至更早),仍然需要 JDK 8 才能编译。
如果你只是做新项目开发,没有历史包袱,我建议直接装 JDK 17。原因很简单:现在新版本 Studio 自带的 JBR 就是 17,你系统里装一个 17 的命令行 JDK,能跟 IDE 保持一个口味,命令行构建和 IDE 构建行为一致,少踩很多隐蔽的坑。
JDK 21 不是不行,但 AGP 对它的支持出现过一些小问题,尤其是注解处理器或者某些第三方库的字节码兼容性。对于追求“装完就能安心写代码”的目标,JDK 17 是最稳的墙头草,往上兼容新工具,往下有 AGP 兜底。
2.2 JAVA_HOME 与 PATH 配置的正确姿势
安装 JDK 我用两种方式:Windows 上直接下载官方安装包(m 后缀的是安装版,z 后缀的是免安装版),macOS 上可以用brew install openjdk@17。但无论哪种,最后都要做两件事:设置JAVA_HOME、把它加进Path。
Windows 正确姿势:
- 假设你的 JDK 装在
C:\Program Files\Java\jdk-17。 - 新建系统变量
JAVA_HOME,值填C:\Program Files\Java\jdk-17。 - 编辑
Path,新增一行%JAVA_HOME%\bin。 - 重新打开命令行窗口,敲
java -version验证。
macOS 正确姿势:
- 在
~/.zshrc里加两行:
export JAVA_HOME=$(/usr/libexec/java_home -v 17) export PATH=$JAVA_HOME/bin:$PATHsource ~/.zshrc让配置生效,再敲java -version验证。
这里有个隐藏细节:macOS 上用/usr/libexec/java_home这个命令来动态定位 JDK 路径,是个非常巧妙的做法,它会让JAVA_HOME始终指向系统里标记为“使用中”的那个 JDK 版本,你后面再装新版本也不容易搞乱。
2.3 命令行验证与多版本共存技巧
配置完环境变量,最忌讳的就是不验证直接开干。验证命令就三件套:
java -version:看默认 JDK 版本javac -version:看编译器版本echo %JAVA_HOME%(macOS 用echo $JAVA_HOME):看变量有没有生效
如果你想在多版本之间切换,Windows 上我建议的做法是不要频繁改系统变量,而是用命令行临时设置。比如临时切到 JDK 8:
set JAVA_HOME=C:\Program Files\Java\jdk-8u401 set Path=%JAVA_HOME%\bin;%Path%macOS 上更方便一点,直接改.zshrc里java_home -v后面的版本号,甚至可以在终端里用一个短命令切换。
注意到一个经验:很多同学配完环境变量,在同一个已经打开的命令行窗口里敲命令,发现没生效就以为自己配错了。其实 Windows 命令行窗口的环境变量是在启动时读取的,你配完必须新开一个窗口。这个坑,我在各种地方见人踩了无数遍。
2.4 JDK 安装避坑细节:路径、版本残留与权限
安装 JDK 时,有几个容易被忽略但一旦踩中会浪费大量时间的坑:
- 路径不能带中文和空格。我见过有人把 JDK 装在
D:\工具\Java\jdk-17,结果 Gradle 在解析路径时直接抛异常。程序员的目录名,老老实实用英文和数字就好。 - 老版本残留。如果你机器上以前装过 JDK 8,不卸载它问题不大,但一定要确保
JAVA_HOME指向的是你新装的目录,而不是留着一个没用的系统变量。曾经帮人排查一个诡异的编译失败,最终发现他系统环境变量里有JAVA_HOME指向一个已被卸载的 JDK 目录。 - 安装路径权限。Windows 上装到
C:\Program Files\Java没问题,但如果你自定义到某个需要管理员权限的目录,后续一些命令行工具在非管理员模式下可能因为写不了文件而报错。建议装到一个普通用户可读写的路径,省得折腾。 - 别迷信“解压版随便放”。免安装版的 JDK 确实不需要安装过程,但它对环境变量、对路径的敏感度更高。如果你第一次装,对 JDK 内部结构不熟,就用安装版最省心,它自动帮你配置了一些额外的东西。
3. Android Studio 与 SDK,配置核心中的核心
JDK 装好,相当于地基打好,接下来的 Android Studio 和 SDK 才是“看得见的配置主战场”。
3.1 Studio 版本选择与安装要点
Android Studio 有两个版本系列:稳定版和预览版(Canary/Beta)。我的建议非常明确:只装稳定版。道理很简单,你是来开发应用的,不是来帮 JetBrains 和 Google 测试 IDE 的。预览版往往带着最新的特性和未打磨干净的 bug,遇到问题没有现成的解决方案,排查成本极高。
安装时有个容易忽略的小点:选择安装组件的时候,不少人以为把“Android SDK”和“Android Virtual Device”等选项全勾上就对。其实这些后面在 SDK Manager 里都能补,装的时候顺手勾上默认选项即可,不用太纠结。
安装完成后首次启动,Studio 会问你要不要自动下载 SDK 组件,如果你网络状态一般,这个过程可能非常漫长,甚至直接卡死。这个问题的具体解法放在后面讲镜像配置时展开,这里先提个醒,首次启动不要傻等。
3.2 SDK Manager:平台版本与构建工具怎么挑选
打开 Studio 的 SDK Manager,你会看到一堆 API Level、Build Tools 选项,很容易眼花。这里记住一个原则:跟着项目的 minSdk / targetSdk 走,别全选。
- SDK Platform:你只需要装项目
targetSdkVersion对应的那个版本,以及一个用于模拟器运行的系统镜像。 - Build Tools:默认情况下 Studio 会根据 AGP 版本自动选择一个合适的 Build Tools 版本下载,偶尔你需要手动安装指定版本,但绝大多数情况不用额外管。
- SDK Tools:这里通常已经有 Android SDK Platform-Tools(里面有 adb)、Build-Tools、Platform-Tools 等核心组件,保持默认即可。
如果你项目的targetSdkVersion是 34,那你 SDK Platform 里装 Android 14(API 34)就够了,它不会影响编译低版本的项目,因为 Google Play 和编译规则都设计成了向后兼容。
实际操作中,我见过有人把所有 API Level 全勾上,硬盘瞬间没了 20G,下载就花了两个多小时,完全没必要。选择性地装,省时省力。
3.3 Gradle 依赖下载慢的最终解法:镜像源配置
这是配环境中最影响心情的一步,几乎所有人都在这里感受过“卡死”。
Gradle 构建时,依赖要从 google()、mavenCentral() 等仓库拉取。在部分网络环境下,这些仓库的访问速度不稳定,尤其是在首次构建项目,需要把整个依赖树拉下来的时候,那个进度条会让你怀疑人生。
解决这个问题的核心思路是:把仓库地址切换到国内可访问的镜像源。这里用的都是公开镜像服务,完全合规且稳定。
做法一:修改项目的settings.gradle(推荐)。在dependencyResolutionManagement的repositories里,把 Google 都换成国内镜像:
pluginManagement { repositories { maven { url 'https://maven.aliyun.com/repository/google' } maven { url 'https://maven.aliyun.com/repository/gradle-plugin' } maven { url 'https://maven.aliyun.com/repository/public' } maven { url 'https://maven.aliyun.com/repository/central' } gradlePluginPortal() } } dependencyResolutionManagement { repositories { maven { url 'https://maven.aliyun.com/repository/google' } maven { url 'https://maven.aliyun.com/repository/public' } maven { url 'https://maven.aliyun.com/repository/central' } } }做法二:配置全局初始化脚本,一劳永逸。在~/.gradle/init.gradle(Windows 在C:\Users\你的用户名\.gradle\)里写:
allprojects { repositories { maven { url 'https://maven.aliyun.com/repository/google' } maven { url 'https://maven.aliyun.com/repository/public' } maven { url 'https://maven.aliyun.com/repository/central' } } }这个方法对所有项目生效,新建项目也不用重复改settings.gradle。我个人推荐第二种,因为真正麻烦的不是一个项目,而是换新项目又要改一遍的重复劳动。
另一个加速技巧是:手动下载 Gradle 发行版。当 Gradle 首次构建某个项目时,它会根据项目里的gradle/wrapper/gradle-wrapper.properties中的distributionUrl下载对应版本的 Gradle。这个下载包约 100 多 MB,如果从原始地址拉,非常容易超时。你可以把这个 URL 替换成国内镜像加速:
distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.5-all.zip或者直接在浏览器里用下载工具把对应版本包下载下来,手动放到 Gradle 的 wrapper 缓存目录里。这一步做完,你必然会体会到什么是“飞一般的感觉”。
3.4 ANDROID_HOME 与 SDK 路径的统一规划
Studio 安装时会默认把 SDK 放到%USERPROFILE%\AppData\Local\Android\Sdk(Windows)或~/Library/Android/sdk(macOS),但很多命令行工具(比如 React Native、Flutter、Cordova)都会去找ANDROID_HOME这个环境变量。
强烈建议手动设置它:
- Windows:新增用户变量
ANDROID_HOME,值为C:\Users\你的用户名\AppData\Local\Android\Sdk。 - macOS:在
.zshrc里加export ANDROID_HOME=$HOME/Library/Android/sdk。
同时把 SDK 的platform-tools目录加入Path,这样你在命令行就能直接使用adb命令,不需要每次都输入全路径。
这里还有个细节:如果你把 SDK 目录从默认位置移到了别的盘,比如D:\Android\Sdk,Studio 会在File → Settings → Appearance & Behavior → System Settings → Android SDK里显示当前路径,你可以改。但命令行工具不会自动感知,这时候ANDROID_HOME的值就必须跟 SDK Manager 里显示的路径完全一致。
我曾经遇到过一种诡异现象:命令行里adb能识别,但adb devices一直显示空,调试了半天发现是platform-tools版本太老,跟新模拟器握手协议不兼容。这种问题升级一下platform-tools就好。
4. 模拟器与真机调试
环境配置的最终目的是让代码跑起来,这一步就进入“看效果”的阶段。
4.1 创建模拟器的参数解读
打开 Studio 的 Device Manager,创建虚拟设备(AVD)时,有几个关键参数值得你花三十秒想清楚:
- 设备定义(Phone/Tablet):选一个常见机型即可,比如 Pixel 系列,长宽比和屏幕密度比较标准。不用纠结具体型号。
- 系统镜像(System Image):推荐带“Google APIs”的版本,因为它包含完整的 Google 服务框架,后面调试推送、登录等依赖 Google 服务的功能时不会被卡住。选择
x86_64镜像,因为它可以走硬件加速,运行流畅度远超 ARM 镜像在非 ARM 机器上的表现。 - API Level:选你项目
targetSdkVersion对应的那个,一般选当前主流版本问题不大。
创建好模拟器后,首次启动也可能比较慢,因为要初始化系统分区。这一步耐心等待即可,第二次启动就会快很多。
4.2 模拟器加速:从 HAXM 到 AEHD 的那点事
在 Windows 上,模拟器要流畅运行,必须借助硬件虚拟化。以前大家都会去装 Intel 的 HAXM(Hardware Accelerated Execution Manager),但现在新版本模拟器已经全面切换到WHPX(Windows Hypervisor Platform)或AEHD(Android Emulator Hypervisor Driver),不再需要单独安装 HAXM。
使用前要注意:
- 必须在 BIOS/UEFI 中开启 CPU 虚拟化。Intel 平台叫 VT-x,AMD 平台叫 SVM/RVI,名字不同,作用一样。
- Windows 的“虚拟机平台”等可选功能需要打开。在“启用或关闭 Windows 功能”里勾选“Windows 虚拟机监控程序平台”。
- 如果开过第三方虚拟机软件(比如某些老版本模拟器依赖的 Hyper-V),可能跟 AEHD 冲突,需要关掉或调成共存模式。
如果你在启动模拟器时看到x86_64 emulation currently requires hardware acceleration之类的报错,那八成就是虚拟化没开或者是驱动没正确安装。这一块排查顺序建议是:先确认 CPU 虚拟化已开启,再确认 Windows 功能勾选正确,最后看模拟器设置里“Graphics”选项是否需要调整。
macOS 上一般没有这些困扰,因为系统自带 Hypervisor.framework,模拟器直接使用,不用单独安装额外驱动。
4.3 真机 USB 调试全流程
模拟器虽方便,但有些测试场景(比如传感器、GPS、相机硬件差异)必须上真机。真机调试配置流程不长,但每一环都可能卡人:
- 打开开发者选项:设置里找到“关于手机”,连续点击“版本号”7 次,直到提示“已进入开发者模式”。
- 开启 USB 调试:在“开发者选项”里打开“USB 调试”开关。
- 用数据线连接电脑:注意,有些劣质线只能充电不能传数据,会导致 adb 识别不到设备。
- 授权弹窗:手机上会弹出“允许 USB 调试吗”的提示,勾选“始终允许”后确认。
adb devices验证:命令行里看到设备列表有device状态,说明连接成功。
实际中常见的问题:手机连上后,adb 显示unauthorized,这说明手机上没点授权或者授权被拒绝了,拔线重插,观察手机上是否有弹窗再试一次。
4.4 adb 定位环境问题
adb(Android Debug Bridge)不只是用来安装 APK,它在排查环境问题上是神器。几个高频命令我给你列一下:
adb devices:查看当前连接的设备和模拟器状态。adb install app-release.apk:直接安装 APK 到设备。adb logcat:抓取设备日志,分析崩溃原因。adb shell pm list packages:查看已安装应用列表。adb shell wm size:查看屏幕分辨率。
配完环境后,我最常做的一步是adb devices,它能验证整套环境是否通路——如果这里连不上模拟器,那说明模拟器本身有问题;连上了但状态是 offline,那大概率是 adb 版本跟模拟器内核版本不匹配,升级平台工具就好。
5. 新手最常见的问题排查
这一节把配环境过程中最常见的高频问题整理成速查文档,你看一眼基本能对号入座。
5.1 Gradle 同步失败的几个典型原因
Gradle 同步失败是环境配置的第一大拦路虎,归纳起来无非下面几个原因:
- 版本不匹配:AGP 和 Gradle 版本不兼容,错误信息通常含有
Minimum supported Gradle version字样。此时去项目根目录的build.gradle(或settings.gradle)里查 AGP 版本,再对照官方版本映射表检查 Gradle 版本是否需要升降。 - 网络下载超时:依赖拉不下来,错误信息通常是
Could not GET或Connection timed out。用前面说的镜像源配置解决。 - JDK 版本不兼容:如果你用了新 JDK 而项目是老的 AGP,可能出现
Unsupported class file major version这样的报错,处理方式是把命令行 JDK 降级,或者在 Studio 的Gradle JDK设置里指定一个合适的版本。 - SDK 组件缺失:报错信息里有
SDK component 'platforms;android-XX' was not found时,打开 SDK Manager 安装对应版本即可。
排查套路很固定:先看Build窗口里标红的第一行错误,再去项目结构配置文件里对比版本,最后决定升还是降。千万不要一看到红字就想着重装整个环境。
5.2 模拟器异常现象排查
- 模拟器启动后一直黑屏:检查系统镜像是否带了 Google APIs;试试把模拟器“Graphics”从 Automatic 改为 Software;检查 CPU 虚拟化是否正常开启。
- 模拟器启动异常缓慢:检查磁盘是否为机械硬盘;模拟器镜像放在 SSD 和机械盘上,启动速度差距巨大。另外给模拟器分配的内存建议 2GB 起步。
- 冷启动后 adb 连不上:等模拟器完全启动完成后,再敲
adb devices,不要急着操作。部分模拟器启动时需要额外几十秒进行系统初始化。 - 启动时报 CPU 不支持虚拟化:去 BIOS 里找 “Intel Virtualization Technology” 或 “SVM Mode”,把它设为 Enabled,保存重启。
5.3 常见问题速查表
| 现象 | 大概率原因 | 解决动作 |
|---|---|---|
java -version显示旧版本 | Path 顺序不对 / 没重新开命令行 | 调整 Path 顺序或新开窗口 |
Gradle 同步卡在Configure project | 依赖下载慢或失败 | 配置阿里云镜像,手动下载 Gradle 发行包 |
SDK component was not found | SDK 平台版本没装 | SDK Manager 里补齐对应平台 |
install报INSTALL_FAILED_UPDATE_INCOMPATIBLE | 目标设备上有签名不一致的同名应用 | 先卸载冲突应用再安装 |
adb 显示offline | adb 与设备协议不匹配 | 升级 platform-tools 到最新版 |
| 模拟器启动报错说缺少驱动 | 虚拟化驱动未正确安装 | 按 4.2 节的步骤安装或启用虚拟化 |
这张表如果你在配环境过程中遇不到,也建议熟读一遍,因为后面开发过程中的大部分小毛病都跟这几个底层配置有关。排查的时候,记住一个原则:先看环境,再谈代码。很多时候项目构建失败,不是你代码有问题,而是某个依赖没拉下来、某个版本不匹配。把这几个基础项检查一遍,能筛掉至少一多半的问题。
我现在的习惯是,每到一个新电脑上配环境,都会有意识地先理一遍版本矩阵:JDK 17、AGP 8.x、Gradle 8.x、SDK 34,然后才动手下载。这个矩阵不是固定死的,但你必须清楚自己当前某个项目需要哪一套组合。老项目不要随便升级工具版本,新项目不要沉迷于最新预览版,配环境求的是稳,不是酷。
最后再分享一个小技巧:配环境的全程尽量用命令行手动操作一遍,不要全依赖 IDE 的图形界面。命令行能让你看到完整的异常栈,逼着你理解每个工具在背后做了什么。等你在命令行下能把./gradlew assembleDebug跑通,再去用 IDE 就是降维打击。环境装好不是终点,能随时定位它哪儿坏了,才是配环境这场修行真正带给你的收获。