
环境配置:照着做,半小时搞定基础依赖
首先得选对系统——别瞎折腾Windows或macOS,直接用Ubuntu(推荐20.04或22.04版本)。不是我偏心Ubuntu,是Android源码对它的兼容性最好,我试过CentOS,结果依赖库冲突更麻烦,最后又乖乖换回Ubuntu。接下来一步一步来,每步都给你写死,直接复制命令就行:
第一步:换国内镜像源。默认的Ubuntu源在国内访问跟龟爬似的,直接换成清华或阿里云的源。操作很简单:打开/etc/apt/sources.list
文件(用sudo nano /etc/apt/sources.list
),把里面的内容全换成清华源的配置(直接去清华源官网复制对应Ubuntu版本的内容),然后执行sudo apt-get update
更新缓存。我之前没换源的时候,下一个git包都要等5分钟,换了之后10秒搞定,这一步绝对不能省。
第二步:装基础依赖库。直接复制这条命令执行: sudo apt-get install git-core curl repo openjdk-11-jdk python3-distutils python3-pip libncurses5-dev libssl-dev libsqlite3-dev libxml2-dev libxslt1-dev zlib1g-dev
这里要注意,不同Android版本对应不同JDK——比如Android 11及以上用OpenJDK 11,Android 7-10用OpenJDK 8,我把对应关系整理成表格,你直接对照着装:
Android版本 | 对应JDK版本 | 安装命令 |
---|---|---|
Android 11+ | OpenJDK 11 | sudo apt-get install openjdk-11-jdk |
Android 7-10 | OpenJDK 8 | sudo apt-get install openjdk-8-jdk |
Android 6及以下 | Oracle JDK 7 | 需手动下载安装 |
第三步:配置repo工具。repo是Google用来管理Android源码的“大管家”,先建个bin
目录放repo:mkdir ~/bin
,然后下载repo脚本:curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
,给repo加执行权限:chmod a+x ~/bin/repo
,最后把bin
目录加到环境变量(不然系统找不到repo):export PATH=~/bin:$PATH
——记得把这句话写到~/.bashrc
里(用nano ~/.bashrc
),这样每次开机都有效。我之前没加环境变量,结果执行repo
命令提示“command not found”,折腾半小时才发现是路径问题,你可别犯这错。
第四步:同步源码。先建个目录放源码(比如mkdir android_source && cd android_source
),然后初始化repo:repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest
(用清华镜像,比Google原生快10倍),接着同步:repo sync -j4
(j
后面是线程数,根据CPU核心来——4核用j4
,8核用j8
,太多容易超时)。同步中断没关系,再执行一次repo sync
就行,repo会自动续传。我第一次同步时因为WiFi不稳定,中断了三次,后来换有线网络,一次就成功了。
常见错误解决:遇到问题不用慌,直接查这里
编译时最崩溃的是突然报错,但90%的错误都是“套路”,我把高频问题整理好了,你直接对号入座:
(提示“connection timed out”)
解决方法:要么换清华/阿里云镜像,要么加超时参数——repo sync -j4 timeout=120
(timeout=120
是允许超时2分钟)。Google官方文档明确说过,增加超时时间能解决大部分同步问题,我亲测有效。
(提示“missing dependency”)
比如缺libncurses5-dev
,直接执行sudo apt-get install libncurses5-dev
就行。重点是看报错信息里的关键词——比如“ncurses”“ssl”,搜对应的包名,别瞎猜。我之前缺libxml2-dev
,直接装这个包就好了,没什么技术含量。
(内存不够)
解决方法:加swap分区。先创建4G swap文件:sudo fallocate -l 4G /swapfile
,设权限:sudo chmod 600 /swapfile
,格式化:sudo mkswap /swapfile
,启用:sudo swapon /swapfile
。要是还不够,把swap加大到8G。我编译Android 12时8G内存不够,加了4G swap就搞定了。
(镜像装不上手机)
表现是“signature verification failed”,解决方法有俩:要么生成自己的签名(用keytool
生成密钥库,放到build/target/product/security
目录),要么用测试签名——编译时加参数:make -j8 PRODUCT_DEFAULT_DEV_CERTIFICATE=build/target/product/security/testkey
。我第一次编译没注意签名,结果镜像装不上,换成测试签名就好了。
镜像生成:最后一步,抄作业就行
环境对了,错误解决了,接下来生成镜像超简单,跟着做:
:进入源码目录,执行source build/envsetup.sh
——这步是加载编译需要的变量和函数,必须做。
:执行lunch
,选aosp_arm-eng
(aosp_arm
是架构,eng
是工程版,适合调试)。要是想编译特定设备(比如Pixel 6),得先下设备驱动,第一次尝试 用aosp_arm-eng
,省事儿。
:执行make -j8
(j
后面是CPU核心数,8核用j8
,速度最快)。编译时间看配置——我用i7-12700H+16G内存,编译Android 13用了2小时;要是你电脑是4核+8G,可能要4-5小时,趁这时间去喝杯奶茶吧。
:编译完成后,镜像在out/target/product/generic_arm
目录下,主要有system.img
(系统)、boot.img
(引导)、recovery.img
( Recovery)。用fastboot
刷到模拟器或手机就行——比如fastboot flash system system.img
。我第一次刷完看到开机画面时,差点跳起来:终于成了!
其实编译Android源码真没那么难,无非是“把复杂流程拆成简单步骤,每步做对”。我当初也是小白,踩了无数坑才 出这些经验,今天全给你了。要是你跟着做遇到问题,或者成功编译了,欢迎在评论区告诉我——我帮你参谋,也想沾沾你的喜气~
其实repo同步中断真的特正常,我第一次同步Android源码的时候,光中断就来了三次——一会儿小区WiFi突然限速,一会儿电脑自动休眠,急得我直拍桌子,但后来才发现,repo这工具早帮你想好了,它会自动记着你同步到哪一步,哪怕断了,再输一遍repo sync命令,它就乖乖接着之前的进度继续跑,完全不用从头开始,省了好多时间。
要是你总碰到超时中断的情况(就是终端里弹出“connection timed out”的提示),那我给你俩亲测有效的办法:第一招是加个超时参数,在repo sync后面加上timeout=120,意思是让它多等两分钟再判定超时,别那么敏感;第二招更绝,直接把源换成国内的,比如清华或者阿里云的镜像源——我之前用Google原生源的时候,同步一次要四五个小时,还老断,换成清华源之后,速度一下快了三倍,而且几乎没再断过。对了,文章里有具体怎么换源的步骤,你直接照着复制粘贴命令就行,不用自己瞎琢磨。
还有啊,你要是担心同步到一半断了白费劲,其实完全不用——repo的同步机制是“增量式”的,每一步都有记录,哪怕断个十次八次,只要最后能把所有代码块拉下来,结果都是一样的。我有次同步的时候,中间因为要出门,直接关了电脑,第二天打开再输repo sync,它照样接着跑,没一会儿就完成了,特省心。
对了,要是你用的是无线网卡, 换成有线网络试试——我之前用WiFi同步总断,后来插了根网线,一下就稳了,毕竟有线的网络延迟比无线低多了,同步的时候不容易掉包。这些都是我踩过的坑,你照着做,肯定能少走点弯路。
必须用Ubuntu系统编译吗?Windows或macOS不行吗?
Android源码对Ubuntu的兼容性最好,新手 优先选Ubuntu 20.04或22.04版本。Windows需要通过WSL(Windows Subsystem for Linux)模拟Linux环境,但可能遇到权限、性能或依赖库冲突问题;macOS则可能因SDK版本、文件系统权限或M1/M2芯片架构导致编译失败。第一次尝试的话,用Ubuntu能避开80%的“玄学问题”。
repo同步源码时频繁中断怎么办?
repo sync中断是正常现象,它会自动记录同步进度——重新执行repo sync
就能继续。如果频繁因超时中断,可以加timeout=120
参数(允许超时2分钟),或换成清华/阿里云等国内镜像源(文章里有具体配置方法),能大幅提升同步稳定性。
编译Android源码需要多少硬件资源?
内存 至少8G(最好16G),内存不足时可以通过加swap分区解决(文章里有swap配置步骤);存储空间至少预留100G——Android源码约30-40G,编译后的产物(out目录)约50-60G,总占用大概80-100G。如果存储不够,会出现“磁盘空间不足”的编译错误。
编译好的镜像怎么刷入手机?
首先要解锁手机的Bootloader(不同品牌方法不同,比如小米需要在官网申请解锁工具),然后将手机进入Fastboot模式(通常是关机后按“电源键+音量减”),用USB连接电脑,执行fastboot flash
命令刷入:比如刷系统镜像用fastboot flash system system.img
,刷引导镜像用fastboot flash boot boot.img
。注意:部分设备(如Pixel)需要额外刷入厂商提供的Vendor镜像(闭源驱动),否则可能无法启动。
依赖库安装提示“无法定位包”怎么办?
先执行sudo apt update
刷新软件源缓存——很多时候是源没更新导致包找不到;如果还是失败,可能是包名在新版本Ubuntu中发生了变化(比如Ubuntu 22.04下libncurses5-dev
改为libncurses-dev
),或镜像源本身缺少该包。这时可以换成清华/阿里云等国内源(文章里有换源方法),通常能解决90%的依赖安装问题。