Windows 10 拉取 Android 源码实战:repo 工具链完整指南
2026/9/19 16:23:58 网站建设 项目流程

说实话,在 Windows 10 上拉 Android 源码这件事,我一开始是拒绝的。但现实往往由不得你选:公司发的笔记本就是 Windows 10,虚拟机权限申请不下来,双系统又折腾,可我又确实需要一份 AOSP 源码来梳理系统架构、改改上层逻辑。折腾了几天,把最新 repo 工具、Python 3、Git for Windows 这套组合彻底跑通之后,我最大的感受是——这条路完全可行,只是坑比想象中多。这篇就把我完整的过程、踩过的坑、以及最终跑通的方案整理出来,希望能让后面走这条路的人少翻几次车。

这篇内容不挑基础,哪怕你第一次接触 Android 源码,只要照着步骤来,基本也能把源码拉下来。我会尽量把原理讲清楚,而不只是丢一串命令给你,因为 Windows 环境下真正卡住人的,往往不是命令本身,而是命令背后那些没人明说的前置条件。

1. Windows 下搞 Android 源码,为什么总觉得“反人类”

很多人第一次尝试在 Windows 上拉 AOSP(Android Open Source Project)源码时,都会有一种“这玩意儿根本不是给 Windows 准备的”的感觉。这个感觉没错,AOSP 官方文档推荐的是 Ubuntu LTS 环境,所有路径、符号链接、大小写敏感、文件权限的设定,默认都是按照 Linux 的习惯来的。Windows 文件系统天生跟它有摩擦,所以第一步不是急着装工具,而是搞清楚摩擦点在哪,才能对症下药。

1.1 Windows 文件系统的三个天然短板

第一个短板是路径长度限制。Android 源码树非常深,很多目录一层套一层,完整路径动不动就超过 260 个字符,而 Windows 传统路径默认就卡在 260 个字符上。你拉取到一半,突然冒出一堆“Filename too long”的错误,就是这个原因。第二个短板是符号链接支持。AOSP 仓库里大量使用符号链接来复用文件,Windows 上如果没有开启开发者模式或者管理员权限,Git 创建符号链接时就很容易失败。第三个短板是大小写敏感。Linux 文件系统区分大小写,Windows 的 NTFS 默认不区分,两个名字只差大小写的文件放进同一个目录,在 Windows 上就可能互相覆盖。

正是因为这三个短板,很多教程一上来就劝你装 WSL 或者虚拟机。这个建议本身没错,但并不是所有场景都适用。我这次因为工作环境的限制,只能用原生 Windows,所以我把重点放在了“最小化摩擦”这件事上——也就是后面要讲的 Git 配置、Python 环境参数、以及 repo 工具的调用方式。

1.2 三条路线对比:虚拟机、WSL、还是纯 Windows

在动手之前,我把三条路线认真对比了一遍。虚拟机最稳,但代价是至少要预留 100GB 以上的磁盘,还要给 VMware 或 VirtualBox 分配足够的内存,电脑配置不够的话,拉取源码时整个机器都会卡到没法用。WSL(Windows Subsystem for Linux)是个很好的折中方案,文件系统兼容性比原生 Windows 好很多,但 WSL 1 和 WSL 2 的磁盘性能差距很大,而且如果你公司的 Windows 策略禁止启用 WSL,这条路也走不通。

我这次选择的是纯 Windows + Git Bash + Python 3 + repo 的方案。优点很明显:不用装虚拟机,不需要管理员权限改系统功能(只要你用的是 Git for Windows 自带的 Bash,而不是系统级 WSL),而且拉取下来的源码可以直接在 Windows 上阅读和编辑,配合 Android Studio 查看代码也方便。缺点也真实存在:下载速度受网络环境影响更大,部分 repo 命令需要绕开一些 Windows 特有报错。但如果只是“拉源码 + 阅读源码 + 简单修改”,这个方案完全能打。

1.3 工具链清单:每一件都有讲究

我的最终工具链是这样的:Windows 10 企业版 LTSC 2021(长期服务版,没有商店、没有乱七八糟的预装应用,干净),Python 3.11.x(注意不要用 3.12 以下太老的版本,部分依赖包对 Python 版本有要求),Git for Windows 最新版(自带 Git Bash),以及通过 pip 或官方引导脚本安装的 repo 工具。

这里多说一句 Python 版本的问题。repo 本身是一个 Python 脚本,早期版本还兼容 Python 2,现在最新的 repo 已经彻底不兼容 Python 2 了。我在第一次操作时贪快装的是 3.8,结果拉取时遇到一些 TLS 相关的问题,换了 3.11 之后一切正常。如果你手头还没有 Python,直接装 3.11 以上版本,别走弯路。

2. 环境准备:先把“地基”打牢再谈 repo

很多人拉源码失败,不是因为 repo 不会用,而是环境根本就没配置好。这一节我会把 Python、Git、repo 这三样东西的安装和配置细节全部过一遍,每一步都会告诉你为什么要这么做。

2.1 Python 3 安装:两个必须勾选的选项

Python 安装本身没什么难度,但有两个细节特别容易忽略。第一个是安装首页下方那个“Add Python to PATH”复选框,一定要勾上。如果你忘了勾,后面在命令行里输入 python 会提示找不到命令,虽然可以手动加环境变量,但没必要给自己添堵。第二个是选择“Customize installation”进入高级选项时,把“Install for all users”选上,这样可以避免某些目录权限问题。

装完之后不要急着关窗口,先打开 Git Bash 输入 python --version 确认一下版本。这里有一个很关键的小细节:Windows 10 系统可能会自带一个 Microsoft Store 的 Python 占位符,你输入 python 时可能打开的是商店应用。如果出现这种情况,在“设置-应用-应用执行别名”里把 python.exe 和 python3.exe 的别名关掉,再从命令行调用你手动安装的 Python。

2.2 Git for Windows:三个配置项决定成败

Git for Windows 安装时,组件默认全选即可,没什么好说的。装完以后,真正关键的是配置。第一个必须做的是开启 longpaths 支持:

git config --global core.longpaths true

这个配置让 Git 不再受 260 字符路径限制。第二个是设置 autocrlf:

git config --global core.autocrlf false

AOSP 源码里混杂着 LF 和 CRLF 换行符,如果让 Git 自动转换换行符,拉下来的文件可能被“善意地”改坏,编译时会出现一堆莫名其妙的错误。设成 false 的意思是“不要动我的文件内容”,从这个项目拉源码的角度看,这是最安全的。第三个是配置用户信息:

git config --global user.name "Your Name" git config --global user.email "your_email@example.com"

repo 在管理多个 Git 仓库时,某些操作会用到 user 信息,没有的话会直接报错,提前配好省一事。

2.3 repo 工具的获取:最新版和“系统自带版”的差距

repo 工具其实只是个 Python 脚本,它本身并不包含源码,它的作用是管理数百个 Git 仓库的拉取、切换和同步。这里要特别提醒:不要用 pip install repo 装到的版本,那个版本比较老,对最新 Android 分支的支持可能不到位。正确做法是去 Google 官方源码仓库拉取最新的 repo 脚本,但考虑到访问便利性,也可以通过国内镜像获取。

我的做法是直接用 curl 从 googlesource 的镜像地址拉最新版本,然后放到一个固定目录。如果你访问官方源不方便,也可以找国内维护的 repo 引导脚本。拿到脚本后记得件事:在文件开头确认它是 Python 3 版本。旧版 repo 可能还残留着 Python 2 的语法,新版第一行通常会写#!/usr/bin/env python3

然后把 repo 文件放到一个目录下,比如C:\repo-tool\repo,再把这个目录加到系统 PATH。这样你在任何路径下输入 repo 都能执行。添加完成后,在 Git Bash 里执行:

repo --version

如果输出了版本号,说明 repo 工具已经就位。

3. repo 初始化与镜像选择:这一步能少走一半弯路

环境准备好之后,真正的重头戏来了——repo init。这一步看似只是一条命令,但里面藏着很多门道,尤其是镜像地址的选择,直接决定了你后面能不能顺利拉完整个源码树。很多人在这一步就开始卡住,其实大多是镜像地址或 manifest 分支没选对。

3.1 manifest 仓库:源码树的“总清单”

repo 的工作原理可以这样理解:Android 源码不是一个大仓库,而是由几百个独立的 Git 仓库组成的集合。每个仓库都有自己的地址、分支和依赖关系。如果手动一个一个 clone,不但繁琐而且容易漏,repo 就是来解决这个问题的。repo init 会拉取一个 manifest 仓库,这个仓库本身没有实际代码,只有一份 XML 清单,记录着所有子仓库的地址、路径、分支信息。我生活里类比一下:manifest 就像装修图纸,repo sync 就是照着图纸一砖一瓦盖楼。

所以 repo init 的第一个参数通常指向 manifest 仓库地址,第二个参数-b指定分支,例如android-13.0.0_r3android-12.1.0_r5这类版本标签。如果你不确定该选哪个分支,可以先从官方分支列表里找,或者直接选最新的稳定版本,比如 Android 14 或 Android 15 的某个 tag,注意 tag 名称一定要写完整,写错的话 manifest 拉取不到,后面什么都做不了。

3.2 镜像地址选择:官方源、AOSP 镜像还是国内镜像

镜像地址是整个流程里最影响下载速度和成功率的部分。官方源是https://android.googlesource.com/platform/manifest,在网络环境理想的情况下最干净,但国内用户访问速度时常不理想。替代方案是国内公共镜像,比如清华 TUNA 的 AOSP 镜像、中科大镜像等。这些镜像同步 Android 官方仓库,使用方式和官方完全一致,只是域名不同。

以清华镜像为例,repo init 可以这样写:

repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-14.0.0_r15

这里要注意一个细节:镜像地址最后有没有/platform/manifest、是不是带git路径,不同镜像的写法不完全一样,建议先去镜像站首页看清楚说明。我见过很多新手因为复制错了路径,导致 repo init 拉了半天发现根本不是 manifest 仓库,非常浪费时间。

3.3 完整初始化命令与常见报错

完整的 repo init 流程一般分两步。第一步是初始化,第二步是同步。但如果你用的是最新 repo,init 之后不直接 sync,而是会提示缺失 CA 证书或者需要配置认证信息。这里有一个常见的报错:

fatal: unable to access 'https://.../.git/': SSL certificate problem: unable to get local issuer certificate

这个报错在 Windows 上出现的频率很高,因为 Windows 的 Git 可能没有正确读取系统证书。临时解决办法是关闭 SSL 验证,但我不建议全局关,只对特定域名关会更好。不过如果你只是拉取公开的 AOSP 源码,其实可以直接用环境变量GIT_SSL_NO_VERIFY=true跑一次,等源码拉下来之后再关掉。这里我提醒一句,关验证只适合从可信镜像拉公开代码这种场景,自己心里要有数,别在不明来源的仓库上也这么干。

如果初始化时遇到 repo 提示“Cannot fetch platform/manifest”,大概率不是网络问题,而是 mirror 地址写错了。去镜像站首页把 manifest 的 git 路径复制完整,再重来一次就行。

4. 真正拉取源码:完整实操过程与核心命令拆解

repo init 成功后,你就有了一个.repo目录,里面存放着 manifest 和后续所有子仓库的元数据。接下来就是最漫长也最容易出问题的环节——repo sync。这一步会耗费大量时间,而且对磁盘、内存、网络都有要求,所以我会把 sync 命令的参数拆开讲清楚,并给出一个适合 Windows 环境的运行方案。

4.1 repo sync 参数拆解:-j、-c、--no-tags 各是什么含义

很多第一次接触 repo sync 的人会直接执行repo sync,然后看着屏幕刷屏,一等就是几小时。其实 sync 命令有很多参数可以控制拉取方式,先理解再动手,效率完全不同。最简单的命令是:

repo sync -c -j4 --no-tags

这里的-c表示当前分支只拉取 manifest 指定的分支,不拉取所有远程分支,能省掉大量不必要的提交记录。-j4表示并发数,Windows 环境下我建议不要开太大,4 到 8 比较稳。并发数太高会导致网络连接数激增,反而容易触发服务器限流,而且 Windows 的文件系统并发处理能力不如 Linux,开太高容易出奇怪的问题。--no-tags表示不拉取标签,AOSP 仓库的标签很多,但不一定都用得上,去掉能节省时间和磁盘空间。

如果你需要冲特定版本做开发,--no-tags是可以的。但如果你后续要做版本对比或者精确回溯,那建议不要加这个参数,宁可多花点时间,也别欠下技术债。

4.2 断点续传与本地缓存:中断不可怕,避免从头再来

repo sync 最让人崩溃的并不是慢,而是拉取到一半突然中断,然后你以为下次要重头再来。其实 repo 是支持断点续传的,前提是不要手动删除.repo目录,也尽量不要在 sync 中途强制结束 Git 进程。当中断发生时,直接再次执行同样的 sync 命令即可,repo 会比较本地已有对象和远程差异,只拉缺失部分。

我个人的习惯是每次 sync 前先执行:

repo sync -c -j4 --no-tags

中断后再执行相同的命令。如果连续几次都在同一个仓库处失败,可以先单独进入该仓库目录,手动执行git fetch排查一下是不是网络或认证问题,然后再回到根目录重新 sync。

另外一个减少重复劳动的方法是保留.repo目录。很多人拉完源码后觉得.repo占用空间大,想删掉。我的建议是不要急着删,因为以后切换分支、增量更新都靠它。如果你实在需要空间,可以考虑把源码目录压缩归档,但.repo尽量留着,它就是你整个代码仓库的“本地服务区”。

4.3 磁盘占用与空间规划:看起来 100GB 够用,其实不够

Android 源码的体量随着版本增长越来越多,这里我给一个大概的参考:如果只拉当前分支代码,Android 14 的源码加.repo目录,总体占用在 80GB 到 120GB 之间。如果你把全部标签和分支都拉下来,200GB 都打不住。所以在开始之前,先用磁盘管理器检查一下你的目标盘剩余空间,我建议至少留 120GB。如果你的磁盘只剩 50GB,那就别硬拉了,赶紧想办法清空间或者换镜像分支。

另外,Windows 的文件索引服务、杀毒软件实时扫描都会在拉取大量小文件时拖慢速度。我实测下来,把源码目录加入 Windows Defender 的排除列表,sync 速度能提升不少。方法是在“病毒和威胁防护-排除项”里添加整个源码目录,这不会影响系统安全,但对拉取速度提升明显。如果你用的是第三方杀毒软件,同样把源码目录加入白名单。

4.4 拉取完成后的状态检查

拉取完成后,不要急着看代码。先在根目录执行:

repo status

如果输出干干净净,说明所有仓库都在正确分支上。然后可以随便进入一个子目录,比如frameworks/base,执行git log --oneline -5看看提交日志是否能正常显示。到这里,你的 Windows 原生环境下的 Android 源码就算正式落地了。

5. 常见问题与排查技巧实录

讲完正常流程,再聊聊这次实操里和以往经验中的各种“翻车现场”。有些问题你可能一次都不会遇到,但一旦遇到,没有排查思路会很崩溃。我把最典型的问题和解决办法整理成了一份速查表,也补充了一些独家的排查技巧。

5.1 SSL 证书错误与认证问题

之前的初始化部分我们提过证书问题,这里再展开细说。在 Windows 下,Git 默认会使用系统证书库来验证 HTTPS 连接,但很多时候系统证书库里缺少某些根证书,尤其公司电脑上有安全代理时更容易触发。解决思路有两种:一是更新 Git for Windows,新版 Git 对证书的处理完善了很多;二是临时设置环境变量:

export GIT_SSL_NO_VERIFY=true repo sync -c -j4 --no-tags

sync 完成之后记得unset GIT_SSL_NO_VERIFY。不过需要说明的是,这只是一个临时绕过方案,如果你是在内网环境拉取非公开代码,建议还是把证书配置好,别用这种方式,因为安全漏洞非常明显。

5.2 文件路径太长导致 checkout 失败

这是 Windows 拉 AOSP 时另一个高频问题。明明开启了core.longpaths true,但在拉取某些深路径文件时依然报错。我的经验是,光设置 Git 配置还不够,还需要确保 Windows 系统本身开启了长路径支持。操作方法是可以打开“本地组策略编辑器”,在“计算机配置-管理模板-系统-文件系统”中启用“启用 Win32 长路径”。如果你用的是 LTSC 版本,这个策略可能存在,如果没有,也可以直接修改注册表启用。修改完一定要重启电脑,否则不生效。

如果还是报错,可以尝试用管理员的 Git Bash 运行 sync。有些文件写入需要更高权限,管理员模式能规避部分权限问题。

5.3 repo sync 卡住不动或者一直在 Fetch

有时候 sync 执行了很久,但看着好像卡住了。这有两种情况:一种是在正常拉取大仓库,frameworks/base这类超大仓库确实需要较长时间,其实没有卡住。另一种是某个远程仓库连接超时,repo 会反复重试。我的排查技巧是,在 sync 时加上-v参数查看详细输出,比如:

repo sync -c -j4 --no-tags -v

如果看到某一个仓库长时间没有进展,就 Ctrl+C 中断,单独去.repo/projects/<对应路径>下执行git fetch,手动确认该仓库能否拉取成功。有些时候是仓库地址过期,有些时候是本地锁文件残留,手动跑一遍能更快定位问题。

5.4 恢复拉取默认状态

还有一种常见需求是“repo 恢复到拉版本默认状态”——比如你改了很多仓库的代码,想回到初始状态重新开始。这时可以用:

repo forall -c 'git checkout . && git clean -fd'

这行命令的意思是遍历所有仓库,将工作区文件恢复到最近一次提交状态,并清理掉未被跟踪的文件。注意,git clean -fd是危险操作,它会删掉所有未跟踪的文件,如果你在某个仓库目录里放了自己的笔记或者脚本,也会被一并删除。所以在执行之前,最好把源码目录做个备份,或者仔细确认没有重要文件。

5.5 Git 和 repo 代码仓库管理的优劣势对比

顺便回答一个很多人问过的问题:直接用 Git 管理多个仓库不行吗,为什么要用 repo?

Git 本身管理单个仓库非常好用,但 Android 源码是几百个仓库的集合,每个仓库都有独立的历史记录和分支,用 Git 手动管理,你得写一大堆脚本去循环执行。repo 的本质就是一个仓库管理封装,它用 manifest 描述仓库拓扑,用一套命令统一操作所有仓库。简单说,Git 管单个项目,repo 管一群项目。两者不是替代关系,而是配合关系——你最终在某个子仓库里操作时,用的还是 Git 命令。

6. 实操心德:真正把 AOSP 用起来的几个建议

源码拉下来只是起点,怎么把它用好才是关键。最后分享几个我自己在 Windows 环境下使用 AOSP 源码时的习惯,都是一些实操中积累出来的经验,可能不全面,但很实用。

第一个建议是,不要一上来就用 Android Studio 打开整个源码树。AOSP 工程量巨大,Android Studio 直接打开会卡到怀疑人生。正确的做法是先只打开你关心的模块目录,比如frameworks/base或者packages/apps/Settings,等 Android Studio 建立好索引再逐步扩大范围。如果你有足够的内存,也可以生成完整的 IDE 项目文件,但那是另外一个复杂话题了。

第二个建议是,善用repo start来创建新分支。如果你要在某个仓库里改代码,不要直接在主分支上改,先执行:

repo start my-dev-branch --all

这样会给所有仓库创建一个名为my-dev-branch的新分支。好处是后续编译也好、回退也好,都有一个清晰的分支边界。只用 Git 在单个仓库里建分支当然也行,但repo start会统一所有仓库的分支名,管理起来方便得多。

第三个建议是,在 Windows 环境下尽量不要去编译整个系统。拉源码、看代码、改上层逻辑都没问题,但真正到编译阶段,原生 Windows 对 AOSP 的支持依然一般。我的习惯是,Windows 上做代码研读和简单修改,真正出包还是交给 Linux 服务器。如果你非要在 Windows 上编译,那就需要 WSL 或者虚拟机了,这又回到开头说的路线选择。

第四个建议是,给源码目录单独建一个盘符或者分区。因为拉源码过程中会产生大量小文件,跨盘操作会很慢,而且.repo目录和源码目录如果不在同一分区,repo 的硬链接机制会失效,磁盘占用会直接翻倍。我自己是把 D 盘整个清空,专门拿来放 AOSP,空间规划方面一劳永逸。

最后再分享一个小技巧:Windows 的 Git Bash 对 repo 的支持总体来说不错,但偶尔会遇到命令参数解析差异。如果你在命令执行时遇到奇怪的报错,可以试试把命令写到.sh脚本里,然后用bash 脚本名.sh的方式执行,大多数情况下可以绕开解析问题。这个方法帮我解决过好几次看起来“玄学”的报错,希望也能帮到你。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询