C 盘红了,十次里有八次第一个背锅的都是 Android Studio。每次调完模拟器,或者跑完一次大工程的 Gradle 构建,都能眼看着 C 盘可用空间往下掉几个 G。很多人的第一反应是清理缓存、删 SDL 之类,但清完没过多久又满了。真正的问题在于,Android Studio 这套开发环境把 SDK、AVD 模拟器镜像、Gradle 依赖缓存、IDE 日志等一堆东西默认全部塞进了 C 盘。这篇博文我会带你从头到尾做一次路径迁移,把这些“大块头”挪到 D 盘或其他空闲盘,并额外送你一套可以直接照抄的目录联接方案,解决路径迁移后各种打不开、找不到 SDK、AVD 起不来的坑。适用人群很简单:C 盘快满了、不想重装系统、又希望以后 IDE 和模拟器能正常工作的 Android 开发者。
1. 先算账:Android Studio 到底在 C 盘埋了哪些大文件
1.1 Android Studio “全家桶”默认路径速查表
在动手迁移之前,先得搞清楚哪些目录吃了 C 盘的空间。Android Studio 不是只有一个安装目录,它那套东西分散在四五个地方。下面这张表我按“体积量级”从大到小排了序,你可以对照自己的机器逐项检查:
| 目录 | 默认位置 | 典型体积 | 主要包含内容 |
|---|---|---|---|
| Android SDK | C:\Users\<用户>\AppData\Local\Android\Sdk | 10 ~ 40 GB | platforms、build-tools、platform-tools、system-images |
| Gradle 用户目录 | C:\Users\<用户>\.gradle | 5 ~ 30 GB | caches、wrapper/dists、daemon 日志、依赖包 |
| AVD 模拟器数据 | C:\Users\<用户>\.android\avd | 5 ~ 30 GB | 每一个模拟器镜像的磁盘文件、快照、配置 |
| Android Studio 配置与日志 | C:\Users\<用户>\.AndroidStudioX.Y | 1 ~ 5 GB | IDE 设置、缓存、日志、模板 |
| 安装目录 | C:\Program Files\Android\Android Studio | 2 ~ 4 GB | IDE 本体、自带 JBR、插件、内置 Gradle |
| 系统级辅助文件 | %LOCALAPPDATA%\Google等 | 1 ~ 3 GB | Android Studio 日志、系统缓存 |
这里面最容易突破 10 GB 的就是 SDK 和 AVD。尤其是系统镜像,一个system-images目录下可能同时存着 Android 30、31、32、33 好几套,每套都有好几个 G。Gradle 缓存也不甘示弱,每个版本依赖都要在本地留一份,时间久了caches目录能膨胀到让你怀疑人生。
1.2 哪些目录能迁、哪些目录别乱动
理论上,上表里所有目录都能迁到别的盘。但迁移方式不一样,风险也不一样。我的建议是:
- SDK、Gradle、AVD 这三个目录优先迁移,这三个是占用大头,迁移后收益最高,而且都能通过目录联接做到“无感搬迁”。
- Android Studio 的配置目录也可以迁,但要注意它里面有 plugins 缓存和许可证相关信息,迁移时必须整目录搬,不能只挑某个子文件夹。
- 安装目录最好别直接剪切。除非你用的是 zip 解压版,否则官方 exe 安装版在注册表和卸载程序里都有记录,直接搬走会导致更新失败、卸载失效。这地方如果你实在要迁,保险做法是卸载后重装到 D 盘。
- 另外,你自己的项目源码不建议被“路径迁移”这个操作覆盖,项目本身放在 D 盘就好。迁移目标是开发工具链,不是代码仓库。
还有一类目录别动:C:\Program Files\Java或 Android Studio 自带的 JBR。JDK 目录很小,并且系统环境变量写死了JAVA_HOME,改动性价比不高,属于“费力不讨好”的类型。
2. 迁移前准备:先体检再选方案,别上来就搬
2.1 三个命令,把磁盘占用摸得明明白白
很多人迁移前只看“C 盘可用空间”,却没搞清到底是哪个目录占空间。我建议先跑一遍体积体检,确定哪些才是真正的“硬盘刺客”。在 Windows 上,你可以打开 PowerShell,直接复制下面这段脚本:
$paths = @( "$env:USERPROFILE\.gradle", "$env:USERPROFILE\.android\avd", "$env:LOCALAPPDATA\Android\Sdk", "$env:APPDATA\Google", "$env:USERPROFILE\.AndroidStudio*" ) foreach ($p in $paths) { if (Test-Path $p) { $bytes = (Get-ChildItem $p -Recurse -Force -ErrorAction SilentlyContinue | Measure-Object -Property Length -Sum).Sum "{0:N2} GB - {1}" -f ($bytes / 1GB), $p } }注意:$env:USERPROFILE\.AndroidStudio*这个通配符在 PowerShell 里未必能正确匹配到目录,更保险的做法是把*换成你实际使用的版本号,比如.AndroidStudio2023.2。如果系统里同时存在多个版本,每个版本目录都要单独统计。
跑完之后,哪个目录超过 5 GB,就直接列入迁移名单。如果你手里有 TreeSize 或者 WizTree 这类工具,也可以快速按占用排序。我个人更喜欢命令行输出的方式,至少不会因为文件夹太多而看花眼。
2.2 改配置还是目录搬家?我推荐你优先用目录联接
迁移方案通常有两种:改软件配置、搬目录后建链接。
第一种是“正统做法”,比如在环境变量里把ANDROID_SDK_ROOT指向D:\Android\Sdk,或者在项目里改local.properties。这种做法的问题在于,SDK Manager 和一些第三方工具可能仍然会往默认位置写文件,而且 AVD 的路径配置分散到多个文件里,改起来非常麻烦。
第二种方案是“Windows 目录联接”技术。用一条命令:
mklink /J "C:\原路径" "D:\新路径"把 C 盘原来的目录变成一根“管道”,程序访问 C 盘路径时,系统自动把请求转发到 D 盘。整个过程对 Android Studio、SDK Manager、Gradle、命令行工具完全透明。目录联接不是快捷方式,也不是复制文件,而是一个 NTFS 重解析点,普通程序和底层工具都认它。这也是为什么我强烈推荐你优先使用这种方式——相当于先搬家,再让所有知道旧地址的人和快递员都继续沿用旧地址,你根本不需要挨个通知。
有人会问,这和“把你旧地址的常用联系人”改地址有什么区别?区别在于:改配置可能遗漏,建链接一定不漏。只要你把原目录改成链接,所有原路径的访问都会被自动引导到新位置,包括那些硬编码在 Gradle 脚本里的绝对路径。
3. 标准迁移流程:三步搬走 C 盘里的“大块头”
3.1 第一步:迁移 Android SDK 与系统镜像
SDK 是最值得迁的目录。如果你之前已经把它安装到别的盘,这步可以跳过;如果没有,按下面顺序操作:
- 完全退出 Android Studio,确保
java、adb等进程都退干净。最稳妥的做法是任务管理器里确认没有 Android Studio 相关进程。 - 在资源管理器里把
C:\Users\<你的用户名>\AppData\Local\Android\Sdk整个文件夹剪切到目标盘,比如D:\DevTools\AndroidSdk。剪切时最好关闭所有文件访问,避免出现“文件被占用”错误。 - 打开“以管理员身份运行”的命令提示符,执行:
mklink /J "C:\Users\你的用户名\AppData\Local\Android\Sdk" "D:\DevTools\AndroidSdk"注意:执行这一步前,C 盘原来的Sdk文件夹必须不存在。如果你剪贴时保留了原文件夹,先把它改名成Sdk_old,然后再建链接,最后确认链接正常再删掉Sdk_old。
- 用
dir C:\Users\...\Android\Sdk验证,如果能看到一个<JUNCTION>标记,说明链接建立成功。
之后再次打开 Android Studio,SDK Manager 里显示的路径仍然是C:\Users\...\Android\Sdk,但实际文件都在 D 盘。下载新的 system-image、platform 时,占用的也是目标盘空间。
3.2 第二步:迁移 AVD 模拟器数据
AVD 目录在C:\Users\<你的用户名>\.android\avd。这里存的不是模拟器安装包,而是每一个模拟器的“硬盘镜像”,所以经常比 SDK 还占地方。很多人的模拟器用的是 Google APIs 镜像,一个 AVD 的体积动辄 8~10 GB,还不算开机后产生的快照文件。
迁移 AVD 前,先把所有正在运行的模拟器彻底关闭,包括冷启动状态下挂在后台的。然后执行剪切操作,把整个avd目录搬到D:\DevTools\AndroidAvd。搬完后删除 C 盘原来的avd文件夹(或者先改名),再用管理员 cmd 建链接:
mklink /J "C:\Users\你的用户名\.android\avd" "D:\DevTools\AndroidAvd"这里特别提醒:.android目录里除了avd,还有adbkey、adbkey.pub、cache等文件。adbkey是 ADB 的身份密钥,最好不要和 avd 分开处理。所以如果你希望一次搞定,可以直接把整个.android目录搬走,然后联接到C:\Users\<用户>\.android,连adbkey也不用担心了。
mklink /J创建的是目录联接,可以指向一个不存在的目标?不行,目标路径必须已经存在,否则链接会指向空内容。所以剪切原目录到新路径是创建链接的前置条件。
3.3 第三步:迁移 Gradle 缓存和 Android Studio 配置
Gradle 用户目录是另一片“重灾区”。默认在C:\Users\<你的用户名>\.gradle,里面caches存放各种模块依赖,wrapper/dists存放不同版本的 Gradle 发行包,还有 daemon 的日志和临时目录。一次多模块工程的构建可能就把几个 G 写到这里。
迁移步骤和上面一模一样:关闭 IDE、剪切.gradle到D:\DevTools\GradleHome、删除原目录、管理员 CMD 里建链接:
mklink /J "C:\Users\你的用户名\.gradle" "D:\DevTools\GradleHome"建完链接后,你可以随便开一个新项目跑一次构建,观察D:\DevTools\GradleHome里的文件是否在增长。如果增长正常,说明 Gradle 已经通过旧路径写到了新盘。
Android Studio 自身的配置目录也不能忽略。比较常见的是:
C:\Users\<用户>\.AndroidStudio2023.2C:\Users\<用户>\AppData\Roaming\Google\AndroidStudio2023.2
这两个目录包含了 IDE 插件缓存、日志、代码模板、keymaps 等。建议把.AndroidStudioX.Y目录整体迁移并建链接。不过这个目录里有些文件可能正在被 IDE 占用,所以迁移前一定要先完全退出 Android Studio,并且关闭所有可能调用 IDE 的终端。
4. 迁移后的配置修改与环境变量
4.1 让 Android Studio 重新找到 SDK 和 Gradle
如果你全程采用目录联接方案,迁移后 Android Studio 基本不需要额外配置,因为它访问的还是原来的 C 盘路径。但这不代表你可以完全不管,有几个地方还是值得确认一下。
第一,打开File > Settings > Appearance & Behavior > System Settings > Android SDK,查看 SDK 路径。如果这一行显示的是旧的 C 盘路径,且旁边的 Edit 链接不可点,说明 IDE 还没有正确识别。这时候可以直接手动改为D:\DevTools\AndroidSdk,或者检查刚创建的 junction 是否存在。第二,如果你同时在多个终端用gradle命令,建议在项目里的local.properties文件中显式写入 SDK 路径:
sdk.dir=D\:\\DevTools\\AndroidSdk这里注意反斜杠的转义:冒号后必须用双反斜杠。如果没有local.properties,创建一个即可。第三,建议执行File > Invalidate Caches and Restart,清掉 IDE 之前缓存的路径信息。这个操作不会删除依赖,只是重建索引,不用慌。
4.2 环境变量设置要克制,别一次改太多
环境变量是迁移过程中最容易踩雷的地方。常见的做法是设置ANDROID_HOME和ANDROID_SDK_ROOT,但既然我们已经用 junction 保住了原路径,其实不需要额外改这两个变量。如果你确实想用新路径,可以打开系统设置里的环境变量编辑,新增或修改用户变量:
setx ANDROID_SDK_ROOT "D:\DevTools\AndroidSdk" setx ANDROID_HOME "D:\DevTools\AndroidSdk" setx GRADLE_USER_HOME "D:\DevTools\GradleHome"注意setx写入的是用户变量,不是系统变量。如果你当前终端里已经设置了旧值,新开的终端才会生效。很多命令行工具在迁移后报错,就是因为环境变量里还指着旧的C:\Users\<用户>\AppData\Local\Android\Sdk。如果你决定走环境变量路线,要保证ANDROID_SDK_ROOT和local.properties里的sdk.dir指向同一个目标。
另外,不要同时保留“原 C 盘路径”和“新 D 盘路径”两套环境变量。最容易出现的情况是,ANDROID_HOME还是旧路径,ANDROID_SDK_ROOT已经改成了新路径,结果某些工具用ANDROID_HOME,某些用ANDROID_SDK_ROOT,两边指向不同 SDK,报错信息千奇百怪。
4.3 安全删除旧目录,别把 Junction 一起删了
迁完之后,C 盘原来的路径已经变成了一个联网“跳转门”,不再占空间。但你有可能在资源管理器里看到它,以为它还在占空间,于是右键删掉——这就出大事了。删除 junction 会只删除链接,不会删除目标文件,但如果你用某些清理工具(比如 CCleaner 的“磁盘清理”)去清理这个目录,就可能顺着链接扫到 D 盘的目标文件,导致数据被误删。
判断一个目录是不是 junction 的方法很简单:在命令提示符里执行dir C:\原始路径,如果路径名后面带有<JUNCTION>,说明它是链接。要删除链接本身,用:
rmdir "C:\Users\你的用户名\.gradle"不用加/s,因为它只是个“管道”,不是实体文件。如果你看到的是普通文件夹并且内部有大量文件,那就说明链接没建成功,或者链接被误删了,需要重新建。
如果是纯改配置、没有建链接的情况,旧目录里确实还有一堆实体文件,删除时直接用资源管理器 Shift+Delete 即可。但删除前建议再确认一遍项目构建没有正在访问这个目录,否则可能删到一半提示文件被占用。
5. 常见问题与排查技巧实录
5.1 AVD 突然启动失败?多半是路径没对上
迁移后最容易遇到的问题就是模拟器起不来。典型症状是启动时报错Cannot find AVD system path. Please check your Android SDK path,或者停在“Loading”界面不动。
第一优先级检查C:\Users\<用户>\.android\avd\下每个.ini文件,里面的path=字段是否指向了不存在的旧位置。如果你用了 junction,这个文件里通常还是旧 C 盘路径,这没事,因为可以通过 C 盘路径访问。但如果 junction 建错了,比如目标路径少了一级目录,path=就会指向一个空目录。
还有一种情况是 SDK 里的 system-images 目录没迁移干净。AVD 启动时要到Android\Sdk\system-images下找镜像文件,如果你的 SDK 迁移后 system-images 子目录结构发生了变动,需要在 AVD 编辑界面重新指定 System Image。最省事的做法是在 Android Studio 里Tools > Device Manager,找到对应模拟器,点铅笔图标重新选一次镜像,保存后重启。
如果问题依旧,用命令行带-wipe-data启动一次模拟器:
emulator -avd 你的AVD名称 -wipe-data这会清掉模拟器内部数据,相当于恢复出厂设置,能解决大部分缓存损坏问题,但也会丢失模拟器里安装的应用数据。一般我会在确认路径无误后再走这一步。
5.2 mklink 没权限 / 建链接失败怎么办
在普通命令提示符里执行mklink /J,偶尔会提示“您没有足够的权限”。解决办法很简单:右键“命令提示符”选“以管理员身份运行”。如果已经管理员运行却依然失败,检查两点:
- 链接的父目录是否存在。比如要建
C:\Users\Leo\.gradle,必须先确定C:\Users\Leo存在。 - 原路径是否已经被占用。如果原来就存在一个实体
Sdk文件夹,mklink /J会报错“无法创建文件,文件已存在”。必须先移除原目录或把它改名,再建链接。
有些系统开启了“开发人员模式”,符号链接可能不需要管理员权限,但 junction 在不同系统上策略不完全一致。最稳妥的操作流永远是:关闭 IDE、剪切目录、确认原路径消失、管理员 CMD 执行mklink、验证<JUNCTION>。
另外,目标盘必须是 NTFS 格式。如果 D 盘是 exFAT 或 FAT32,不支持 junction,需要先格式化或者选择其它 NTFS 分区。
5.3 Gradle 构建报 SDK location not found,怎么救
报错信息通常是:
SDK location not found. Define location with an ANDROID_SDK_ROOT environment variable or by setting the sdk.dir in your project's local.properties file.这个报错说明你的工程没找到 SDK。按以下顺序排查:
一是看local.properties是否存在,注意它应该在项目根目录,而不是模块目录。二是看ANDROID_SDK_ROOT用户变量是否指向旧路径。三是在 Android Studio 的 SDK Manager 里确认当前 SDK 路径是否有效。
如果你用的是 junction,并且确认dir能显示<JUNCTION>,但 Gradle 仍报错,最大的可能是local.properties里的sdk.dir写成了类似D:\DevTools\AndroidSdk\的格式。反斜杠末尾加不加斜杠都行,但路径里的\必须转义为\\,这一点很容易被忽略。
还有一个小众情况:项目里用了 Gradle 插件,而插件内部硬编码了旧 SDK 路径。这时候建议删掉项目里的.gradle和build目录,让 Gradle 重新解析。注意不要删全局的C:\Users\<用户>\.gradle,只删项目的临时构建目录。
5.4 容易被忽略的隐藏缓存清单
即使你迁移了 SDK、AVD、Gradle 和 IDE 配置,C 盘可能还是会在不知不觉中变小。这里列几个我踩过的坑:
%USERPROFILE%\.android\cache:这个目录里是 ADB 和模拟器的临时缓存,有时候能到 1~2 GB,随.android一起迁走最方便。%LOCALAPPDATA%\Google\AndroidStudioX.Y:这个是 IDE 的本地日志和缓存目录,和AppData\Roaming下的那一份不一样,很多人漏掉,几年下来也能攒出好几个 G。%TEMP%\Gradle或%TEMP%\AndroidStudio:各种临时卸载文件、编译中间文件,建议直接用系统磁盘清理定期清理。C:\Users\<用户>\AppData\Local\Android\Sdk\extras:旧版 SDK 扩展包,如果项目不再使用,迁移时可以只保留必要的子目录,但小心别把整个 extras 删了导致老项目编译失败。
对于这些隐藏目录,我的建议是从迁移日画一条线:今天之前的缓存可以清理,今天之后的缓存必须落新盘。比如 Android Studio 日志可以设置 IDEA 属性来指定路径,但绝大多数人不会为日志专门配置,那就隔几个月清一次%LOCALAPPDATA%下的 Google 目录。
迁移这件事,我做完一次最大的体会是:别指望只迁一个 SDK 就能永绝后患,AVD 和 Gradle 两个目录才是隐形大头。第一次我只迁了 SDK,结果半年后 C 盘又红,后来把.gradle和.android也用 junction 搬到 D 盘,才真正安心。最后一个小技巧:建议专门建一个D:\DevTools文件夹,所有开发相关的大目录统一放在里面,以后重装系统或换电脑,直接告诉别人“开发环境全在 D 盘”就行了。