news 2026/10/22 4:00:48

Windows Android SDK命令行安装与模拟器配置实战

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Windows Android SDK命令行安装与模拟器配置实战

简介:面向 Windows 平台开发者的 Android 命令行工具集最新版压缩包,专为无需安装完整 Android Studio 的用户设计。内含 sdkmanager、avdmanager 等核心可执行组件,可通过命令行下载 SDK 包、管理虚拟设备、执行构建与调试任务,适合习惯终端操作或需轻度开发环境的工程师与学习者。压缩包共 108 个文件,主要为 95 个 JAR 运行库与 10 个 BAT 启动脚本,另含配置与说明文档,整体大小 136.41MB,解压即可使用。工具集中 sdkmanager 尤其重要,能够按需获取系统镜像、API 文档及模拟器组件;lint 与 d8/r8 等则协助静态检查与代码压缩,方便接入自动化构建与持续集成流程。目前已有 544 人浏览学习,属于轻量、可裁剪的开发基座,适合需要快速搭建命令行 Android 环境或希望深入理解 SDK 工具链的开发者。

1. 先认清这个 zip 是什么:一个没有 SDK 的 SDK 管理器

如果你在一台干净的 Windows 机器上,既不想装一整个 Android Studio,又想在 CI 里跑构建、造模拟器、精确管理 SDK 版本,那你下载的东西大概率就是 Android 命令行工具(commandlinetools-win-13114758-latest.zip)。这个 zip 体积不大,但它解决的是大问题:把 sdkmanager、avdmanager、lint 这些管理能力从图形界面里拆出来,让你能用脚本操作整个 Android SDK。这里有个反直觉的事实:它本身不含 adb,也不含任何 system-image 和 platform 包,更像一个启动器。所有真实组件都得靠它去下载,所以搞懂它的运行机制比下载本身更重要。这套工具适合三类人:不装 Studio 的命令行党、维护 Windows CI 的工程师、想精确固定 SDK 版本的插件开发者。下载只是第一步,真正的坑在后面的目录结构、JDK 和许可证。

2. 落地先过目录关:cmdline-tools/latest 结构与两个环境变量

2.1 解压到正确位置:cmdline-tools/latest 的意义

很多人第一步就翻车。这个 zip 解压后直接得到一个cmdline-tools文件夹,里面有bin/、lib/、source.properties、NOTICE.txt。如果你把cmdline-tools\bin直接加到 PATH,然后跑sdkmanager.bat,大概率会看到类似Could not determine SDK root的报错。原因是 sdkmanager 靠自身路径反推 SDK 根目录,它默认寻找的结构是$SDK_ROOT/cmdline-tools/latest/bin/sdkmanager.bat,而不是$SDK_ROOT/cmdline-tools/bin/。

常见做法是:在某个磁盘根下建一个干净的 SDK 目录,把解压出来的整个cmdline-tools文件夹移动进去,并改名为latest,最终形成C:\Android\sdk\cmdline-tools\latest\bin\sdkmanager.bat。我用的是C:\Android\sdk,不带空格,避免后续脚本解析出幺蛾子。命令如下:

mkdir C:\Android\sdk\cmdline-tools move Downloads\cmdline-tools C:\Android\sdk\cmdline-tools\latest
dir C:\Android\sdk\cmdline-tools\latest\bin

移动后dir应该能看到sdkmanager.bat、avdmanager.bat、apkanalyzer.bat、lint.bat这几个关键文件。这里latest是工具内部约定的相对路径,不是随意起的名字。如果你把目录叫tools-2024,它还是会找不到自己。如果你机器上已经有一份 Android Studio 的 SDK,我更建议复用:把cmdline-tools放到那一份 SDK 根目录的cmdline-tools\latest下,这样命令行工具和 Studio 共用同一套platforms、build-tools,不会出现两套 SDK 各占几个 GB 的尴尬。

2.2 环境变量:ANDROID_HOME、JAVA_HOME 与 PATH

sdkmanager 是 Java 程序,先决条件是 JDK。现在新版命令行工具最低要求是 JDK 17,如果你还在用 JDK 8 或 11,启动时直接报UnsupportedClassVersionError。如果你装有 Android Studio,最省事的办法是把JAVA_HOME指向 Studio 自带的 jbr 目录,那是经过验证的 JDK 17,不用额外装 Java。没有 Studio 的话,单独装一个 JDK 17 也很快。

环境变量我一般同时设置ANDROID_HOME和ANDROID_SDK_ROOT。虽然新官方建议是ANDROID_SDK_ROOT,但老项目、老 Gradle 插件还在读ANDROID_HOME,两个都设置才不会踩坑。在 Windows 上用setx设置,注意setx不影响当前终端窗口,设置完要开一个新的终端再验证。

setx ANDROID_HOME "C:\Android\sdk" setx ANDROID_SDK_ROOT "C:\Android\sdk" setx JAVA_HOME "C:\Program Files\Android\Android Studio\jbr" setx PATH "%ANDROID_HOME%\cmdline-tools\latest\bin;%ANDROID_HOME%\platform-tools;%ANDROID_HOME%\emulator;%PATH%"

PATH 里提前把platform-tools和emulator也放进去,是为了免去后面装完包再改一次环境变量的重复劳动。cmdline-tools\latest\bin放在最前面,保证你敲sdkmanager时命中的是预期那个,而不是某个残留的旧版本。

2.3 最小验证:sdkmanager --version 与 --sdk_root

设置完环境后,先做最小验证,别急着装包。打开新终端,运行:

sdkmanager --version

如果输出一串版本号就没问题。如果提示找不到 sdkmanager,先查两件事:sdkmanager.bat是否真的在C:\Android\sdk\cmdline-tools\latest\bin下,以及 PATH 是否生效。还有一种情况是目录暂时改不动,可以用--sdk_root强指:

sdkmanager --sdk_root=C:\Android\sdk --list

--sdk_root的作用是绕过自动探测,直接告诉 sdkmanager SDK 根目录在哪。这个参数在后续所有命令里都能用,特别是当你把 SDK 放在非约定位置时,它就是后悔药。现在能跑通这两条,说明目录、JDK、PATH 三关都过了,可以进入下一个环节。

3. 用 sdkmanager 装出第一套基础 SDK:ID、版本、许可证一个都不能漏

3.1 先读懂 sdkmanager --list 的输出

sdkmanager 本质上是一个包管理器,类似针对 Android SDK 的apt或npm。它管理的每个包都有一个唯一 ID,格式像platforms;android-34、build-tools;34.0.0、system-images;android-34;google_apis;x86_64。包名是分号分隔的,不是等号也不是冒号。运行:

sdkmanager --list --sdk_root=C:\Android\sdk

输出会分成两块,上面是Installed packages,下面是Available Packages。截取一段典型输出:

Installed packages: build-tools;34.0.0 platforms;android-34 Available Packages: build-tools;34.0.0 build-tools;35.0.0 platforms;android-34 platforms;android-35 system-images;android-34;google_apis;x86_64

这里有个细节:安装时写的是完整包 ID,不是缩写。有人习惯写android-34,sdkmanager 会直接报unknown package。原因是android-34只是显示名的一部分,完整 ID 必须是platforms;android-34。版本号也要精确到小版本,比如build-tools;34.0.0,只写build-tools或build-tools;34都会让你多踩一个坑。

3.2 一条命令装齐四类组件

最小可用环境至少需要四类东西:platform-tools(提供 adb 和 fastboot)、platforms;android-34(提供 android.jar,编译期依赖)、build-tools;34.0.0(提供 aapt2、zipalign 等打包工具)、emulator(模拟器本体)。一条命令可以同时装多个包:

sdkmanager "platform-tools" "platforms;android-34" "build-tools;34.0.0" "emulator" --sdk_root=C:\Android\sdk

参数说明:platform-tools没有版本号后缀,始终跟随最新版;platforms;android-34的34对应 API 级别,需要和项目的compileSdk一致;build-tools的完整版本号必须存在,先用--list确认,别凭记忆写。安装过程会显示下载进度,完成后检查:

dir C:\Android\sdk\platform-tools\adb.exe

看到adb.exe就说明platform-tools真的落地了。再次强调:commandlinetools这个 zip 本身不含 adb,如果你没装platform-tools,后面所有adb命令都会报“不是内部或外部命令”。这是新手最容易产生的误解。

3.3 接受许可证:一条管道命令解决构建失败

Gradle 构建时会检查 SDK 包对应的许可证记录,没接受的话会直接报You have not accepted the license agreements of the following SDK components。这不是网络问题,是许可证文件没生成。解决方式是对当前 SDK 根目录执行许可证接受命令。在 Windows 上没有yes命令,我习惯在 PowerShell 里运行:

1..50 | ForEach-Object { 'y' } | & "$env:ANDROID_HOME\cmdline-tools\latest\bin\sdkmanager.bat" --licenses --sdk_root="$env:ANDROID_HOME"

这条命令的意思是:生成 50 个y字符,通过管道依次喂给 sdkmanager 的许可证询问流程,把所有协议都接受掉。执行后检查C:\Android\sdk\licenses目录,里面会出现android-sdk-license文件,有它就行。如果你用的是内网代理或镜像源下载,sdkmanager 不读HTTP_PROXY环境变量,它是 Java 程序,认的是 JVM 系统属性。常见做法是设置JAVA_TOOL_OPTIONS带代理参数,但要注意设置后只对当前终端有效,直接放到 CI 配置里才能稳定生效。

4. avdmanager + emulator:从系统镜像到可启动的 AVD

4.1 系统镜像怎么选:google_apis 与 x86_64 的理由

模拟环境还需要系统镜像。system-images的三个常见变体是default、google_apis、google_apis_playstore。选型理由很简单:default最干净但很多 Google 服务接口调不了;google_apis_playstore带 Play 商店,适合测试上架前的兼容性,但它无法 root,自动化脚本里权限受限;google_apis是开发和 CI 最稳的中间选项,既有 Google API 又能 root,做 UI 自动化不容易被卡权限。架构上 Windows 机器选x86_64才能吃硬件加速,arm64-v8a镜像在 x86 主机上跑起来慢得没法用。安装命令:

sdkmanager "system-images;android-34;google_apis;x86_64" --sdk_root=C:\Android\sdk

镜像体积不小,下载完可以先看C:\Android\sdk\system-images\android-34\google_apis\x86_64目录是否存在。sdkmanager 的好处是它会自动处理镜像依赖,不需要你手动解压任何东西。

4.2 创建 AVD 并调整 config.ini

创建虚拟设备前,先看看有哪些设备定义可用:

avdmanager list device

输出里能看到pixel_6、pixel_7这类 ID。创建 AVD 时用--device指定 ID,用--package指定刚才装的镜像,--force覆盖同名设备:

echo no | avdmanager create avd --name ci_avd --package "system-images;android-34;google_apis;x86_64" --device pixel_6 --force

echo no的作用是自动回答“是否创建自定义硬件配置文件”,选择不创建,直接用设备模板。AVD 生成后默认存在%USERPROFILE%\.android\avd\ci_avd.avd目录下,核心配置在config.ini。为了在无 GPU 的 CI 机器上稳定跑,我会改三个参数:

hw.ramSize=2048 disk.dataPartition.size=6G hw.gpu.mode=off

hw.ramSize是虚拟机内存,CI 机上给 2GB 够用;disk.dataPartition.size设大一点,避免安装测试 APK 时数据分区爆掉;hw.gpu.mode=off关掉 GPU 加速,配合无头模式用。如果你是在本地开发机跑,想要窗口画面,把hw.gpu.mode改回auto或host即可。

4.3 无头模式启动与开机等待

启动模拟器用emulator命令,它在C:\Android\sdk\emulator\emulator.exe。无头模式的标准启动命令:

emulator -avd ci_avd -no-window -no-audio -no-boot-anim -gpu swiftshader_indirect -no-snapshot -memory 2048 -cores 2

参数含义:-no-window不弹窗口;-no-audio关音频,避免声卡驱动报错;-gpu swiftshader_indirect用软件渲染,防止没显卡的机器直接崩溃;-no-snapshot很重要,它避免加载上次的残留快照,保证每次冷启动都是干净状态。启动后不能立刻跑测试,系统还在 boot。adb wait-for-device只等设备在线,不等系统启动完成,真正的开机完成标志是:

until adb shell getprop sys.boot_completed 2>/dev/null | tr -d '\r' | grep -q 1; do sleep 5; done

这段循环的逻辑很直白:不断读sys.boot_completed属性,读到1才继续。tr -d '\r'是为了去掉 Windows 下 adb 输出里的回车符,不然grep匹配不上。这里是血泪经验,很多 CI 脚本卡死就是因为少了这个回车符处理。启动完成后,adb shell input keyevent 82可以唤醒屏幕,后续 UI 自动化脚本就能直接操作了。

5. 高频翻车点排查:许可证、硬件加速、两套 SDK 打架

5.1 sdkmanager.bat 一闪而过或提示 SDK manager was not found

现象:双击sdkmanager.bat窗口闪一下就消失,或者在终端里运行提示SDK manager was not found、Could not determine SDK root。

原因:目录结构不符合cmdline-tools/latest/bin约定,或者JAVA_HOME没设置、指向了 JRE。sdkmanager 靠自身路径探测 SDK 根,路径不对就无从谈起。

解决:先检查sdkmanager.bat的实际位置,确保它是$ANDROID_HOME\cmdline-tools\latest\bin\sdkmanager.bat。再运行java -version,确认版本号是 17 而不是 1.8。如果目录暂时不想动,可以给所有命令加--sdk_root=C:\Android\sdk硬指根目录。注意:JAVA_HOME必须指向 JDK,不是 JRE,命令行工具用到javac相关能力时 JRE 不够。

5.2 Gradle 报 licenses has not been accepted

现象:项目构建时出现You have not accepted the license agreements of the following SDK components,同样是编译platforms;android-34,换了台机器就报。

原因:许可证不是全局注册的,它记录在 SDK 根目录的licenses文件夹里。你在这台机器接受过,换一个新 SDK 目录就要重新接受。很多人以为 Studio 里接受过就一劳永逸,但命令行工具对的是另外一套 SDK 路径。

解决:对当前实际使用的 SDK 根目录执行第 3.3 节的许可证命令,然后确认ANDROID_HOME、ANDROID_SDK_ROOT、项目里的local.properties三个地方指向同一个目录。如果项目指定了 Studio 的 SDK 目录,而命令行工具装在另一处,两边各自都要执行一次许可证接受。最省事的办法是复用一个统一目录,别搞两套房。

5.3 模拟器提示 x86_64 emulation currently requires hardware acceleration

现象:启动模拟器直接退出,提示x86_64 emulation currently requires hardware acceleration!,BIOS 里明明开了虚拟化还是不行。

原因:Windows 的虚拟机监控程序平台没启用,或者 Hyper-V 被其他软件抢占。Android 模拟器在 Windows 上依赖 WHPX 或 Hyper-V,不是光有 VT-x 就行。

解决:打开“控制面板 → 启用或关闭 Windows 功能”,勾选“Windows 虚拟机监控程序平台”和“Hyper-V”,重启。然后用emulator -accel-check验证加速状态。如果你同时跑 Docker Desktop,它也会占 Hyper-V,这时候模拟器可能拿不到资源。运行模拟器前先把不相关的容器服务停掉,这个排查顺序能省半小时。

5.4 adb 找不到,或分不清两个 SDK 根目录

现象:安装完 sdkmanager 后敲adb提示不是内部或外部命令;或者命令行工具装的包项目里全看不见。

原因:adb不在commandlinetools里,它属于platform-tools包,没装就是没有。另一种情况是命令行装的 SDK 是一套路径,项目里 Gradle 用的是另一套,两边各管各的。

解决:先执行sdkmanager "platform-tools",再把platform-tools加进 PATH。如果是路径打架,打开终端执行echo %ANDROID_HOME%和echo %ANDROID_SDK_ROOT%,看是不是同一个值。再去项目根目录看local.properties里的sdk.dir,三方对齐。之前有人遇到“Studio 能跑、命令行不能跑”,就是 Studio 内置 SDK 和命令行 SDK 是两套,最后统一成一套就安静了。

6. 进阶习惯:把 SDK 清单化,让新机器一键复现

走到这一步,你已经能手动搭出全套环境。我最后的建议是:把 SDK 依赖写进一个文本文件,让以后每台新机器都能一键还原。我习惯建一个sdk-requirements.txt,每行一个包 ID,#开头是注释:

# SDK 依赖清单,保持版本精确 platform-tools platforms;android-34 build-tools;34.0.0 emulator system-images;android-34;google_apis;x86_64

配合一段批处理脚本安装:

for /f "eol=# delims=" %%i in (sdk-requirements.txt) do ( if not "%%i"=="" sdkmanager.bat "%%i" --sdk_root=%ANDROID_HOME% )

脚本的逻辑是逐行读取清单,跳过#开头的注释和空行,把每个包 ID 交给 sdkmanager 安装。版本号永远写具体值,不要写latest,否则两个月后新机器装出来的 SDK 和旧机器对不上,构建结果会变得很玄学。装完自动跑一次sdkmanager --list_installed,把输出留档,这就是这台机器的 SDK 指纹。升级某个组件前先把当前版本记下来,出问题还能用sdkmanager --uninstall退回去。CI 里跑模拟器时,-no-snapshot和adb emu kill是我每次都会带的,前者保证冷启动干净,后者保证任务结束不留僵尸进程。我自己当年就是没搞清 adb 不随 commandlinetools 附带,白白折腾了一下午,现在每个环节都按清单走,反而再没出过岔子。希望帮到你。

本文还有配套的精品资源,点击获取

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/10/22 3:59:48

OpenClaw:面向开发者的自动记忆增强工程方法论

1. “OpenClaw”不是开源项目,而是一套可落地的记忆增强工程方法论“OpenClaw”这个名字乍听像某个GitHub上的新晋开源库——带“Open”前缀,后缀“Claw”(爪),容易让人联想到抓取、捕获、钩住信息的意象。但实际在多个…

作者头像 李华
网站建设 2026/10/22 3:58:29

Git多仓库合并实战:保留完整提交历史的三种方案

先给大家还原一个经常遇到的场景:手头攒了好几个 Git 仓库,逻辑上同属一条产品线,或者就是当年把项目拆得太碎,现在想收拢。某天一句"把它们合并成一个仓库,历史别丢",任务就落到了你头上。一开始…

作者头像 李华
网站建设 2026/10/22 3:57:21

感知机训练全拆解:从手算推导到Python实现与常见陷阱

很多人都以为感知机简单到不值得单独写一篇。公式就一行,代码几十行,跑起来也快。但我这些年给人讲机器学习,发现恰恰是这种“觉得简单”的心态,会让人在最基础的地方翻车:有人把标签写成0和1,训练完发现负…

作者头像 李华
网站建设 2026/10/22 3:57:06

10美元MCU上的端侧AI Agent:水产养殖智能闭环实践

1. 项目概述:当“养虾”不再只是水产养殖,而是一场端侧智能的硬核突围你可能第一眼看到“养虾神器「PicoClaw」”会笑出声——这名字太跳脱了,像极了某位极客在深夜调试完第7版固件后,顺手敲进README里的彩蛋。但别急着划走。它背…

作者头像 李华
网站建设 2026/10/22 3:55:52

Agent Harness实战:让AI从“只说不做”到真正干活的工程框架

我这段时间翻技术社区的帖子,翻到最多的一个词就是Agent Harness。说实话,我第一次看到这个词的时候也愣了半天——"Harness"是马具、挽具的意思,翻译成"智能体套具"多少有点拗口,但它想表达的东西其实特别直…

作者头像 李华
网站建设 2026/10/22 3:55:52

SDXL Turbo加速原理与实战:从扩散模型到低步数生成

很多跑过 Stable Diffusion 的人应该都有同感:模型越厉害,等待时间越长。SDXL 刚出来的时候,一张 1024 图片在常见的消费级显卡上要跑十几二十秒,做创意探索还能忍,做实时交互就完全不是一回事。SDXL Turbo 正是针对这…

作者头像 李华