一、前言
安卓系统是完全开源的,你可以直接去其官方网站查看该系统的源码:Android Code Search。
因此我们是完全可以修改该系统源码、并对其进行重新编译并安装的。
事实上国内很多系统都是基于该源码进行修改而来,比如近些年华为的鸿蒙系统,为了能够兼容安卓生态、运行安卓程序,其内部就嵌入了安卓系统。
但随着鸿蒙生态逐渐完善,或许很快其就会彻底将安卓系统源码从鸿蒙系统中移除,到那时鸿蒙系统才是真正和安卓划分界限的时候。
说远了,本文主要关注的是我们如何在本地也尝试编译一下安卓系统,并让其运行起来。
最佳的方式其实是安装了linux系统后再编译、运行,但我更习惯于使用windows系统,所以便想尝试一下使用windows系统下的wsl来编译安装系统。
事实上这确实是可行的方式,因为网上已经有相应的教程了。
而本文便是在这些文章的基础之上,更加详细的对整个编译、安装过程介绍一下。
二、环境搭建
想要编译安卓系统,首先你必须要有linux环境,windows系统下比较好用的其实就是官方推出的wsl,不会安装的可以查看文章:
第一篇为安装wsl的教程,第二篇为将wsl安装位置更改的教程,因为安卓源码大概有100G左右,编译需要50G左右,所以最好你的硬盘有200G左右,不然可能会导致空间不足而出错。
然后你需要配置你的git
工具,默认ubuntu自带了该工具,如果没有你就需要自己手动安装。
首先更新一下apt数据、并更新现有软件:
sudo apt update
sudo apt upgrade
安装git工具:
sudo apt install git
配置git用户数据:
git config --global user.name YourName
git config --global user.email you@example.com
注意上面两条命令的最后YourName
与you@example.com
要换为你自己的用户名和邮箱。
然后是安装python2
,默认情况下ubuntu-22.04
已经安装了python3,但本文将要编译的安卓系统版本为10,它使用的是python2。
sudo apt install python2
which python2
第二条命令会打印出当前python2的安装位置:
/usr/bin/python2
所以创建链接时就是下面这个命令:
sudo ln -s /usr/bin/python2 /usr/bin/python
该命令的目的是为python2
程序创建一个软连接,以后我们可以直接使用python
这个名字调用python3
程序,因为安卓系统编译的时候默认使用的python
这个名,所以这里需要为其创建软链接。
然后我们还需要安装编译安卓系统所需要的依赖项:
sudo apt install unzip zip libssl-dev libffi-dev gnupg flex bison gperf build-essential curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev libz-dev ccache libgl1-mesa-dev libxml2-utils xsltproc libncurses5
以及java的jdk:
sudo apt install openjdk-8-jdk
至此我们就完成了安卓源码编译的环境搭建流程。
三、源码下载与编译
由于安卓系统官方源码放在国外,国内很难下载,所以我们需要使用镜像源。
为了方便说明,我们首先回到当前用户的家目录:
cd ~
注意,不要使用root用户,否则最后编译大概率会失败的。
然后执行下面的命令:
mkdir bin
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > bin/repo
cd bin
chmod +x repo
上面命令的作用是从清华源下载了一个repo
工具,并将其设置为可执行,放在了bin
目录下。
repo
是多个git
仓库的管理工具,后面我们便是通过这个工具拉取指定版本安卓系统源码的。
然后回到家目录,编辑.bashrc
文件:
cd ~
vim .bashrc
将下面两条语句放在该文件的最后:
PATH=~/bin:$PATH
export REPO_URL=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo
然后保存、退出,并重新应用该文件,使其生效:
source ~/.bashrc
这两个命令的作用是将前面下载的repo
工具放在PATH
变量中,这样我们就可以在任何地方使用命令repo
了,并同时设置了repo
的源,也就是换为了清华源。
然后创建一个目录用来存放安装源码:
mkdir aosp
cd aosp
进入该目录后,就可以初始化源码:
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-10.0.0_r40 --depth=1
这里使用的是android-10.0.0_r40
版本,完成初始化后,执行命令拉取代码:
repo sync -j8
最后的j8
代表8个工作线程,因为我的电脑是4核8线程,如果你的电脑配置更好,那么可以适当的增加工作线程,提高其拉取速度。
我总共耗费了大概16分钟完成源码拉取。
然后就可以执行编译步骤了:
source build/envsetup.sh
lunch sdk_phone_x86_64
make -j8
其中第一个命令用于应用安装构建时所需要的环境变量,第二个命令用于设置你想要构建的平台架构,第三个命令是正式开始构建。
这个过程大概要持续数个小时,电脑性能好的话就会快一点,性能差就会慢一点。
如果出现xxx: No such file or directory
这样的错误,那么一般就是有库没有装上,自己搜一搜、装上后再运行make -j8
即可。
而如果是莫名出现这样的错误:
ninja: build stopped: subcommand failed.
这大概率就是你的wsl分配的内存不够用,可以先推出wsl、然后运行命令:
wsl -t Ubuntu
wsl --shutdown
关闭该子系统,然后进入windows系统当前用户目录:
C:\Users\it_yu
创建文件.wslconfig
,然后复制下面的内容进入该文件:
[wsl2]
memory=16GB
swap=16GB
localhostForwarding=true
这就是在分配内存,保存后退出,然后重新启动wsl再编译一般就可以了。
四、运行安卓系统
wsl2暂时无法直接运行安卓系统,所以只能通过模拟器实现。
首先你需要安装好Android Studio环境,创建一个相应版本的虚拟机:
然后选择一个手机型号:
唯一需要注意的就是这里,要选择x86_64、并且为android 10:
最后还可以给它改个名字:
点击完成后,找到android SDK的安装位置,使用emulator
工具擦除该系统的数据,比如在我的系统中,它的安装位置为:
C:\Users\it_yu\AppData\Local\Android\Sdk\emulator
在终端中进入该路径,运行命令:
.\emulator.exe -avd wsl2_android_x86_64 -wipe-data
该命令清除后会启动安卓系统,可以直接按Ctrl+C
终止。
为了方便使用,你可以将前面编译好的安卓系统镜像:system.img
以及userdata.img
复制到D盘根目录。
其编译后的镜像在下面位置:
yu@HUAWEL:~/aosp/out/target/product/generic$ cp system.img /mnt/d
yu@HUAWEL:~/aosp/out/target/product/generic$ cp userdata.img /mnt/d/
最后,执行命令使用我们自行编译好的镜像:
.\emulator.exe -avd wsl2_android_x86_64 -system "D:\system.img" -data "D:\userdata.img"
效果如下: