Android开发window安装Ubuntu虚拟机编译安卓aosp12源代码
Window安装Ubuntu虚拟机编译aosp安卓12源代码
1. 安装VMWare虚拟机,以及安装Ubuntu
1.1 下载安装VMWare虚拟机
1.2 下载安装Ubuntu
-
ubuntu下载地址:
- https://ubuntu.com/download/alternative-downloads
- 我选择下载20.04.6 LTS Desktop版本
-
安装ubuntu细节说明:
- 如果window内存32G以上可以给ubuntu大点内存,比如16G甚至更大,但至少也留个8G给window吧。
- 如果window只有8G内存,ubuntu最多分配4G。分配多了window很卡。
- 如果window只有4G内存的话,建议直接砸了换新的,如果还想试一下那分配个1G看看吧
2. 下载AOSP源码
2.1 下载源选择
-
如果能FQ访问Google的话,直接参考下面google这篇官方说明文档来吧
- https://source.android.google.cn/
- 这篇文档是google中文官方文档,可以直接访问,但是里面的源代码下载地址是google海外的
-
咱们是合法公民,老老实实使用国内镜像也能完成源代码下载和编译
- 清华大学镜像
- https://mirrors.tuna.tsinghua.edu.cn/help/AOSP/
- 提供了两种源代码下载方式,一种是使用每月更新的初始化包,另外一直是传统初始化方法(我们接下来使用这个方式)
- 中科大镜像
- 清华大学镜像
2.2 下载repo工具
-
下载安装git工具
sudo apt-get install git
-
配置git
- 配置邮箱:
git config --global user.email "xx@qq.com"
- 配置用户名:
git config --global user.name "xx"
- 配置邮箱:
-
创建bin目录,并添加到PATH环境变量
- 创建目录:
mkdir ~/bin
- 添加到PATH(仅当前窗口有效):
PATH=~/bin:$PATH
- 如果需要永久生效,可以配置到.bashrc配置文件里,将~/bin配置到PATH主要原因:
- 后续是将repo文件下载到这个bin目录下
- 然后给了repo可执行权限后,窗口可以执行运行repo
- 创建目录:
-
安装curl
sudo apt-get install curl
- 下载repo文件需要
-
下载repo,并设置权限
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
chmod a+x ~/bin/repo
- repo文件是什么??
- 其实repo文件就是一个python脚本
- 这个脚本逻辑首先是检测下载环境
- 然后下载git仓库集合,再根据这些仓库调用git clone把各个部分下载下来
- android源代码由几百个git仓库按照一定逻辑组成的,不可能手动一个个下载下来吧?
- 所以使用repo集中管理并执行这些git仓库,简单理解repo的作用就是这样的
-
安装python,repo初始化需要
sudo apt-get install python
2.3 下载AOSP源码
-
建立工作目录
mkdir aosp_12
cd aosp_12
-
配置git下载源
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo/'
- 也可以配置到~/.bashrc文件里面,让它永久生效
- 为什么是配置REPO_URL变量?
- 打开repo文件,搜索一下REPO_URL就关键字,就知道为什么了。
- 先从环境变量读取REPO_URL变量的值,读取不到的话默认是使用google源
-
初始化仓库(其实就是下载git地址)
- 下载所有分支git仓库:
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest
- 下载所有分支git仓库地址,这个比较耗时感觉也没必要,不过后续切换方便点?
- 下载12.0.0_r8分支git仓库:
repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-12.0.0_r8
- 添加-b参数下载指定分支的git地址
- android所有版本参考:
- 下载所有分支git仓库:
-
同步源码
repo sync
- 这步就是根据上一步下载下来的git地址去下载源代码了
- 这一步比较耗时需要好几个小时。如果失败了重新执行repo sync即可。
-
下载kernel源代码(应该不用下载,aosp12自带了模拟器的)
- 单独下载,内核源码有很多版本,比如:
- common是通用的Linux内核、msm是用于使用高通MSM芯片的Android设备
- goldfish是用于Android模拟器的内核源码
- 进去aosp_12目录的kernel目录下:
cd aosp_12 & cd kernel
git clone https://aosp.tuna.tsinghua.edu.cn/kernel/goldfish.git
cd goldfish
- 查看所有git分支:
git branch -a
- 选择goldfish3.4版本:
git checkout remotes/origin/android-goldfish-3.4
3. 编译源码
3.1 准备编译环境
- 安装 open-jdk8
sudo apt-get update
sudo apt-get install openjdk-8-jdk
- 安装第三方依赖库
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache libgl1-mesa-dev libxml2-utils xsltproc unzip libncurses5
3.2 给Ubuntu增加虚拟内存
- 需要增加虚拟内存的原因
- 编译android12至少需要16G以上的内存,如果你给Ubuntu的内存16G以上的,可能就不需要增加虚拟内存了
- 不然编译会报错了,提示内存不够。Exception in thread “main” java.lang.OutOfMemoryError: Java heap space
- 如何查看虚拟内存交换空间
- 首先查看是否已经存在交换空间:
free -m
- 会列表内存空间大小,交换区空间大小,默认有2G大小的swap交换空间
- 查看swap详情:
swapon -s
- 可以看到默认的swap是存放在根目录的swapfile文件
- 打开ubuntu桌面“文件”->点击其他位置->点击计算机 即可查看到
cd / & ls -a
也可以查看到swapfile文件
- 首先查看是否已经存在交换空间:
- 已存在swap交换空间的做法
- 停用交换文件:
sudo swapoff /swapfile
- 删除文件:
sudo rm /swapfile
- 新建新的swap空间,以32G为例:
sudo fallocate -l 32G /swapfile
- 查看文件信息:
ls -lh /swapfile
- 设置文件权限:
sudo chmod 600 /swapfile
- 挂载swapfile文件:
sudo mkswap /swapfile
- 激活启用:
sudo swapon /swapfile
- 再次查看内存使用情况以及交换空间情况:
free -m
- 把交换信息写入系统配置,不然Ubuntu重启后以上配置swap空间工作得重新做
sudo vi /etc/fstab
- 最后一行加入(如有就省略不加):
/swapfile swap swap defaults 0 0
- 按ESC键,接着:wq(英文冒号+wq)保存退出
- 再次查看内存使用情况以及交换空间情况:
free -m
- 还有错误后面讲解,还需要告诉Android编译系统怎么使用上这块虚拟交接空间!!
- 停用交换文件:
3.3 编译源代码
-
初始化环境
- 进去源码目录:
cd aosp_12
- 导入构建脚本环境:
source build/envsetup.sh
- 编译前删除build文件夹,和
make clean
、rm -rf out/
一样:make clobber
- 进去源码目录:
-
选择编译目标
- 列出选择编译目标:
lunch
- 然后输入对应的数字或者名称确定编译目标
- 只有在
source build/envsetup.sh
之后才能执行lunch,否则报错 - 所以编译前首次要做的基本都是先执行一次
source build/envsetup.sh
- 列出选择编译目标:
-
开始编译
- 这里我们不直接选序号了,直接lunch带上目录:
lunch sdk_phone_x86_64
- sdk_phone_x86_64可以从\aosp_12\build\make\target\product目录下找到
- sdk_phone_x86_64是带有手机模拟器的,aosp_x86_64在android12之后是不带模拟器的
- 开始真正编译了:
make -j4
- 这里我们不直接选序号了,直接lunch带上目录:
-
解决OOM内存不足的问题
- 创建了虚拟内存,为什么还会报OOM错误?
- 因为编译的时候这个虚拟内存根本就没有被利用到。
- make -j4 后新开一个cmd窗口执行 top 命令,可以查看KiB Swap大小确认是否用上
- 解决方法就是让编译的时候使用上我们的虚拟内存
- 第一步,终端输入命令:
sudo vi /etc/sysctl.conf
- 最后面添加,表示内存不足1G启动Swap:
vm.min_free_kbytes=1024000
- 具体设置多少才启动Swap,根据自己分配给ubuntu内存情况决定,我的ubuntu内存8G
- 保存退出,然后重启ubuntu
- 第二步,找到
aosp_12/build/soong/java/droidstubs.go
文件,双击打开 - 搜索“cmd.BuiltTool("metalava")”定位到代码处
- 新加语句:
Flag("-J-Xmx6114m").
- 保存退出,然后再次编译,最后应该能成功。过程中遇到什么问题再看情况解决吧。
- 第一步,终端输入命令:
- 创建了虚拟内存,为什么还会报OOM错误?
3.4 模拟器运行
- ERROR: x86_64 emulation currently requires hardware acceleration
- 模拟器需要硬件加速,我使用的虚拟机是VMware workstation
- 解决参考:https://blog.csdn.net/mvp_Dawn/article/details/107678057
- Ubuntu无法启动提示:此平台不支持虚拟化的 Intel VT-x/EPT