wsl 编译 android AOSP 13 源码
安装WSL
-
Windows 11 版本如下:
-
首先在 microsoft store 里面安装ubuntu版本,我选择的是 ubuntu 22.04:
-
安装完成后,打开"控制面板" --> "程序和功能" --> "启动或关闭 Windows功能",打开下面的选项:
-
安装成功后
迁移WSL到一个可用空间至少300G的磁盘
wsl 默认安装在C盘,因为Android AOSP 13 系统源码比较庞大,下载加编译需要100多G空间,而且文件系统必须要用linux的,必须在wsl unbutu系统内部的文件夹下载编译AOSP,不要下载到window 的文件系统里,比如下载到挂载点 /mnt/d 也就是对应window文件系统的D盘,下载是成功的,但是编译过程会因为跨了window和linux文件系统交叉,会编译出错。系统源码要下载到wsl 虚拟机内部空间中,所以需要做一个操作:把WSL迁移到一个空间至少有300G剩余的磁盘里。
- 打开CMD,输入wsl -l -v查看wsl虚拟机的名称与状态。
了解到本机的WSL全称为Ubuntu-22.04,以下的操作都将围绕这个来进行。
输入 wsl --shutdown 使其停止运行,再次使用wsl -l -v确保其处于stopped状态。 - 在E盘创建一个目录用来存放新的WSL,比如我创建了一个 E:\wsl_2204
- 导出它的备份(比如命名为Ubuntu-22.04.tar)
wsl --export Ubuntu-22.04 E:\wsl_2204\Ubuntu-22.04.tar
- 确定在此目录下可以看见备份Ubuntu.tar文件之后,注销原有的wsl
wsl --unregister Ubuntu-22.04
- 将备份文件恢复到E:\wsl_2204中去
wsl --import Ubuntu-22.04 E:\wsl_2204 E:\wsl_2204\Ubuntu-22.04.tar
- 在CMD中,输入 Linux发行版名称.exe config --default-user 原本用户名
Ubuntu2204 config --default-user stlong
这时候再次打开WSL,你会发现一切都恢复正常了
更换国内源
# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-updates main restricted universe multiverse
deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-backports main restricted universe multiverse
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-security main restricted universe multiverse
deb http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# deb-src http://security.ubuntu.com/ubuntu/ jammy-security main restricted universe multiverse
# 预发布软件源,不建议启用
# deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
# # deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ jammy-proposed main restricted universe multiverse
安装git,配置 email 与 name:
sudo apt-get install git
git --version
配置 email 与 name(有效无效均可)
git config --global user.name YourName
git config --global user.email you@example.com
安装python3
Ubuntu 2204中python3默认已经安装,使用下列命令查看程序的安装位置,同时建立软连接
which python3
sudo ln -s /usr/bin/python3 /usr/bin/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
sudo apt-get install openjdk-8-jdk
下载android源码
我选择的是 android-13.0.0_r35
- 初始化repo环境:
mkdir ~/bin
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
cd bin
chmod +x repo
- 设置环境变量:
vim ~/.bashrc
添加下面两行环境变量配置:
PATH=~/bin:$PATH
export REPO_URL=https://mirrors.tuna.tsinghua.edu.cn/git/git-repo
使环境变量生效:
source ~/.bashrc
- 初始化源码目录(因为我不需要源码的 commit ,所以设置了 —depth=1):
repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-13.0.0_r35 --depth=1
成功如下图:
- 同步源码
repo sync -j8
- 编译
source build/envsetup.sh
lunch sdk_phone_x86_64
make -j8
- 启动模拟器,验证编译成果
wsl2由于是没有界面的unbutu 环境集成,不支持linux下的虚拟机kvm,并不能直接启动带界面的模拟器,我们需要用我们自己windows android sdk环境下的emulater.exe去加载编译产物img来进行调试。
- 在android studio中启动avd manager,创建一个和你编译指定版本一致的模拟器,这里是android 13, x86_64的镜像,起个名字如 wsl-android-13R5,下面要用到这个名字
- 加载wsl2编译好的img到window模拟器中,一般调试只需要system.img和userdata.img
#擦除已有的avd数据
D:\AndroidSdk\emulator\emulator.exe -avd wsl-android-13R5 -wipe-data
#模拟器重新加载android image
D:\AndroidSdk\emulator\emulator.exe -avd wsl-android-13R5 -system "\\wsl$\Ubuntu-22.04\home\stlong\android13r35\out\target\product\emulator_x86_64\system.img" -data "\\wsl$\Ubuntu-22.04\home\stlong\android13r35\out\target\product\emulator_x86_64\userdata.img"
说明
- -system指定system.img
- -data指定userdata.img
- -ramdisk指定ramdisk.img
- -kernel指定内核映像
AOSP常用编译和查找命令
- m :等同于 make ,进行一次完整编译。
- mm:在当前目录下编译所有模块,但不包括依赖项。
- mmm [目录]:编译指定目录下的所有模块,但不包括依赖项。只编译指定模块:mmm [dir/:target1,target2]
- mma:在当前目录下编译所有模块,包括依赖项。
- mmma [目录]:编译指定目录下的所有模块,包括依赖项。
- make clean:删除整个 out/ 目录。
- make clobber:用于清除编译缓存。
- make snod:当重新编译部分模块完成后,快速生成img文件。
- cgrep:对C/C++文件执行 grep (只搜寻C/C++文件类型,也包括.h类型)。
- jgrep:只对Java文件执行 grep (只搜寻Java文件类型)。
- resgrep:只匹配 /res 目录下的 xml 文件。
- sepgrep:只查找sepolicy文件。
参考
本文来自博客园,作者:suntl,转载请注明原文链接:https://www.cnblogs.com/stlong/p/17654389.html