Android SDK 与命令行工具下载失败:清单、许可证和路径
装 Android 开发环境时,图形界面和命令行会停在同一步:拉不下 SDK 清单。命令行里常见下载清单失败或连接被重置,地址指向 dl.google.com。Android Studio 则在设置里的 SDK 管理器转圈,平台列表出不来。有人已经勾了平台,下一步却停在许可证没人接受。
这三步要分开:命令行工具的目录对不对、清单主机通不通、许可证有没有在这个用户下接受过。镜像能缓解,但版本可能落后。下面先让官方清单能打开,再装平台和构建工具。组件名称以你本机 sdkmanager --list 的输出为准。
图形界面、命令行和镜像各管什么
图形界面能装、脚本不能装,多半是脚本用了另一个 SDK 目录或没把命令行工具放进 cmdline-tools 的 latest 目录。先让两边指向同一份 SDK。
| 对比项 | Android Studio | sdkmanager | 第三方镜像 |
|---|---|---|---|
| 入口 | 设置里的 SDK 管理器 | cmdline-tools 里的 sdkmanager | 另一套主机名 |
| 清单 | 同一份 Google 清单 | sdkmanager --list | 可能不是当天的包 |
| 典型失败 | 列表一直转圈 | 下载清单失败或连接重置 | 缺包或校验不对 |
| 许可证 | 界面里点接受 | sdkmanager --licenses | 不代替官方许可证 |
| 路径 | 界面写的是 SDK 位置 | ANDROID_HOME 必须指向同一位置 | 不改变路径 |
| 适合 | 日常勾选平台 | 脚本和持续集成 | 明确接受延迟时 |
从清单失败到能编译:分步操作
- 第一步:先把网络线路准备好,再打开 SDK 管理器或执行 sdkmanager。安装刺猬VPN,自定义用户名和密码注册,不需要邮箱和手机号。连上后再访问 dl.google.com,让清单和组件包走同一条线路。免费节点永久免费、不限流量、不限速。
- 第二步:浏览器打开 dl.google.com 上的 Android 仓库页面或至少确认主机能响应。打不开就换节点。不要先改包名。
- 第三步:安装命令行工具时,解压后的目录应类似 SDK 根下的 cmdline-tools/latest/bin。少了 latest 这一层,sdkmanager 会找不到自己,报错看起来像网络失败。
- 第四步:设置 ANDROID_HOME 指向 SDK 根目录,并把 cmdline-tools 的 bin 以及 platform-tools 放进路径。新开一个终端再执行 sdkmanager --list。旧终端可能还停在没改过的路径上。
- 第五步:清单能列出包之后,再装你需要的平台和构建工具,例如平台包和 platform-tools。名称以 --list 里看到的为准,不要凭记忆写一个不存在的版本。
- 第六步:第一次安装会停在许可证。执行 sdkmanager --licenses,把每一份都接受。只在图形界面点过、脚本用户不同,脚本仍会停在未接受许可证。
- 第七步:Android Studio 的 SDK 位置改成同一个 ANDROID_HOME。设置里的语言和框架、Android SDK 页面,确认已安装的平台和命令行看到的一致。SDK Tools 页里若没有命令行工具,勾选后再装一次。
- 第八步:准备上架时,构建能过只是开始。应用签名和商店后台见 Google Play 管理后台。本机有 SDK 不代表后台账号能登录。
按失败停在哪一行
- 下载清单失败或连接重置:清单主机没通。浏览器试 dl.google.com,换节点后再 --list。
- 提示找不到 sdkmanager:目录不是 cmdline-tools/latest。把解压结果移到这一层,不要多套一层文件夹。
- ANDROID_HOME 为空:脚本和图形界面各用各的目录。设好之后新开终端。
- 许可证未接受:执行 --licenses。持续集成要用同一用户或预先接受,不要等交互提示。
- 某个平台在列表里没有:版本号写错或清单是旧的。先 --list,再复制准确的包名。
- 只有 Studio 转圈、命令行成功:Studio 用了代理或另一条线路。以命令行能列出的为准,把 Studio 的 SDK 路径改过去。
- 包下到一半损坏:删掉该组件目录后重装这一份,不要把整个 SDK 都删掉。
官方清单和镜像怎么选
发布用的构建优先官方清单。刺猬VPN可按域名分流,让 dl.google.com 走线路。实际可用性取决于当前网络环境。
| 对比项 | 会员节点直连官方 | 公共镜像 | 免费节点 |
|---|---|---|---|
| 清单新鲜度 | 与官方一致 | 可能落后一个版本 | 只验证主机能否打开 |
| 许可证 | 必须接受官方条款 | 不跳过 | 不跳过 |
| 校验 | 与清单一致 | 要自行核对 | 不替代核对 |
| 流量 | 时长套餐期间不限流量、不限速 | 由镜像决定 | 永久免费、不限流量、不限速 |
| 适合 | 要复现的构建 | 能接受延迟的内网 | 先判断是不是网络 |
| 失败形态 | 重置或超时 | 缺包 | 时通时不通 |
目录、用户和持续集成
同一台电脑上,图形界面用你的登录用户,脚本用另一个用户时,许可证接受记录不共享。在真正执行构建的那个用户下再跑一次 --licenses。把 ANDROID_HOME 写进该用户的环境,而不是只写在你自己的终端配置里。
持续集成的机器没有桌面。先在有浏览器的电脑上确认 dl.google.com 能开,再让构建机走同一条线路策略。构建脚本里写死包名之前,把 --list 的相关行保存下来,避免上游改名后脚本还在装旧名字。
命令行工具升级后,旧的 latest 目录可能变成一长串版本号。新工具要重新放回 latest,否则路径仍指向旧二进制,新清单永远不会被使用。升级当天先 --list 成功,再改构建脚本。
团队说明里写上 SDK 根目录、命令行工具的层级和接受许可证的命令。新人不要从随机镜像教程里复制一整段环境变量。那些变量可能把清单永久指到一个已经停止更新的主机。官方清单恢复之后,先删掉多余变量,再重试。
只缺一个平台包时,不要重装整个 Android Studio。删掉那个平台目录,用准确包名再装一次。Studio 的界面勾选和命令行包名不一致时,以命令行 --list 为准,界面刷新后再看是否出现。两处都成功,才把路径写进项目文档。
和商店后台、其他仓库的分工
SDK 装好不等于能登录 Play 管理后台。账号、应用列表和测试轨道见 Google Play 管理后台。Maven、npm 等其他仓库的超时不要用 sdkmanager 的参数去修,见 开发包仓库打不开。
每种工具只改自己的配置。验收标准是:新开的终端里 --list 能列出包,并且 Studio 指向同一 SDK 根目录。
常见报错速查表
| 现象 | 原因 | 解决办法 |
|---|---|---|
| 下载清单失败 | 到不了 dl.google.com | 浏览器确认主机,换节点后再列出 |
| 找不到 sdkmanager | 目录缺少 latest 层 | 放到 cmdline-tools/latest |
| ANDROID_HOME 为空 | 变量没进当前终端 | 写进环境并新开终端 |
| 停在许可证 | 这个用户没接受 | 执行 sdkmanager --licenses |
| 列表里没有该平台 | 包名记错或清单旧 | 从 --list 复制包名 |
| 只有 Studio 转圈 | 它用了另一条路径或线路 | 把 SDK 位置改成同一根目录 |
| 组件损坏 | 下载中断 | 只删该组件目录后重装 |
新电脑、旧变量和只缺一个平台时
换一台电脑时,不要把旧机器的整个 SDK 文件夹拷过来就以为清单还有效。命令行工具的版本和路径经常对不上,清单仍会失败。在新电脑上先让浏览器打开下载主机,再按 latest 目录重新放好工具,然后列出包。列出成功之后,只安装项目文档里写明的那几个包名,不要把旧机器上多出来的试验平台一起装上。
环境变量里如果还留着镜像地址,新的官方清单会被永久改道。先把多余变量删掉,新开终端,再列出包。看到的主机名不是官方下载主机,就还没删干净。删干净之前不要接受许可证,否则你接受的是另一份来源的条款,和后来切回官方的包对不上。
图形界面勾选了平台、命令行却说没有这个包,是两边的清单不是同一时刻刷新的。以新开终端里的列表为准,把准确名字抄进脚本。界面刷新后若仍没有,重启一次界面再看,不要同时点安装。两个安装进程抢同一个目录,会留下损坏的组件,下次仍报下载失败。
只损坏一个平台时,删除那个平台的目录再装一次。构建工具、平台工具和模拟器镜像是三份不同的包,不要因为模拟器镜像很大就认定整次失败都是它。先让平台工具装上,确认命令能打印设备列表,再决定要不要下模拟器。
持续集成第一次失败,把日志里的主机名发给能打开浏览器的人。对方确认主机能开,再看构建机的变量和用户。对方确认主机不能开,就先处理线路,不要改项目里的编译版本。编译版本和清单失败是两件事,同一轮里只改一件。
文档的第一行写 SDK 根目录和列出包的命令,第二行写接受许可证的命令。新人失败时先原样执行这两行。两行都成功,才允许改包名。这样整组人不会在某一天因为一份过期镜像一起装不上。
模拟器镜像很大,失败时先确认平台工具已经可用。平台工具能列出设备,说明清单和许可证都过了,剩下的是单独一份大文件。把那一份删掉重下,不要从头重装整个环境。重装会让你分不清是目录又放错了,还是只是这一份文件中断。
同一仓库里如果有人用图形界面、有人只用脚本,两边的 SDK 根必须写进同一份说明。各写各的路径,许可证会在一个用户下通过、在另一个用户下再次拦住。构建失败时先问执行的是哪个用户,再问线路。
清单时通时不通,不要在失败的当口改编译用的平台版本。等列出包的命令连续成功两次,再改版本。连续成功说明线路和目录是稳的,之后的失败才值得当成版本问题来看。两个人同时安装时,先让一个人装完再让另一个人装,避免抢同一个目录留下损坏文件。损坏之后只删那一份,不要把已经列成功的环境全部推翻。先确认列出包的命令仍然成功,再继续装缺失的那一份。
高频问答
- 问:必须装 Android Studio 吗?答:只写脚本可以只装命令行工具。界面和脚本要指向同一 SDK 根。
- 问:镜像能不能代替官方?答:能缓解下载,但可能落后。发布构建仍建议能打开官方清单。
- 问:许可证要接受几次?答:每个执行构建的用户一次。换用户或换机器要再接受。
- 问:免费节点够不够?答:够试清单能否打开。大平台包用时长套餐,期间不限流量、不限速。
- 问:能只代理 Studio 吗?答:客户端没有按应用勾选的列表。用按域名的智能分流覆盖下载主机。
- 问:包名从哪抄?答:从本机 sdkmanager --list,不要从过期的博客抄。
交给脚本之前
Android SDK 下载失败时,先确认命令行工具在 latest 目录、清单主机能开、许可证已接受。图形界面和脚本共用一个 SDK 根。不要在清单还失败时改包名。
刺猬VPN采用 HTTPS+AES 加密传输。匿名注册不需要邮箱和手机号。免费节点永久免费、不限流量、不限速。时长套餐有效期内不限流量、不限速。组件能否下完取决于当前网络环境。
立即下载刺猬VPN:从注册到连接,三分钟完成
刺猬VPN提供永久免费节点,不限流量;无需邮箱,自定义用户名即可匿名注册。一个账号支持多设备同时在线,实际可用性取决于当前网络环境。