前言
做Android应用好多年,一直对AOSP无所知,都不知道什么东西,目前车载那么火,就想介入进去,开始尝试去编译一下系统源码,然后去看了一下Android官网,目前最新的版本还不支持mac和window,只支持ubuntu,去整了个硬盘准备刷个系统,可能是Macmini原因,一直没能成功,很尴尬,最后整了虚拟机。
整个过程挺麻烦的,我下载是Android13最新的源码,因为源码需要翻墙,我用清华的镜像,下载倒是挺快,没有像别人说的两三天,但也有半天,编译也用了半天,过程有很多很多坑,记录下来给大家分享一下,一起学习。
一、构建环境搭建
1.1、准备工作
VMWare:https://www.vmware.com/products/fusion/fusion-evaluation.html
Ubuntu镜像:http://mirrors.aliyun.com/ubuntu-releases/
1.2、VMWare安装Ubuntu
1.2.1、我的电脑是Mac,所以下载的是VMWare Fusion虚拟机,Android官网建议ubuntu版本选择18.0.4,给的内存大小尽量给大一些,我是16G,给了12G,磁盘大小给了500G
1.2.2、如果是Mac的话,给了一个新的硬盘,格式化的话选择区分大小写,不然Androidstudo去跑源码会莫名的报错
1.3、下载git与Python3
1.3.1、git安装与下载
安装git:
sudo apt install git
安装依赖工具:
sudo apt install git-core libssl-dev libffi-dev gnupg flex bison gperf build-essential zip 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 unzip
设置git身份,添加自己的邮箱和姓名:
git config --global user.email "[email protected]"
git config --global user.name "zhangxiaoxiao"
1.3.2、Python3的安装与切换
下载Python3:
sudo apt install python3
配置update-alternatives,用于切换当前使用的python版本,需要设置软链:
sudo update-alternatives --install /usr/bin/python python /usr/bin/python2.7(python2安装地址) 2(权重号)
sudo update-alternatives --install /usr/bin/python python /usr/bin/python3.7(python3的安装地址) 3(权重号)
切换Python版本:
sudo update-alternatives --config python
二、源码下载与编译
AOSP(Android Open Source Project)是Google开放的Android 开源项目,中文官网为:https://source.android.google.cn/ AOSP通俗来讲就是一个Android系统源码项目,通过它可以定制 Android 操作系统,国内手机厂商都是在此基础上开发的定制系统。因为要墙,如果无法连接Google服务器获取AOSP源码,可以从 清华大学镜像站或者 中科大镜像。我用的是中科的例子
2.1、下载 repo 工具
创建bin,并加入到PATH中:
mkdir ~/bin
PATH=~/bin:$PATH
安装curl库:
sudo apt-get install curl
下载repo并设置权限
curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
## 如果上述 URL 不可访问,可以用下面的:
## curl -sSL 'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo
chmod a+x ~/bin/repo
2.2、下载源码
然后建立一个工作目录(名字任意)
mkdir aosp
cd aosp
初始化仓库:
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest
## 如果提示无法连接到 gerrit.googlesource.com,可以编辑 ~/bin/repo,把 REPO_URL 一行替换成下面的:
## REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'
如果需要某个特定的 Android 版本(Android 版本列表 ):
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-13.0.0_r24
同步源码树(以后只需执行这条命令来同步):
repo sync
等待漫长的好几个小时,终于完成,成功会有这样提示
2.3、安装构建环境
安装 jdk8
sudo apt-get update
sudo apt-get install openjdk-8-jdk
安装依赖:
sudo apt-get install libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev g++-multilib
sudo apt-get install -y git flex bison gperf build-essential libncurses5-dev:i386
sudo apt-get install tofrodos python-markdown libxml2-utils xsltproc zlib1g-dev:i386
sudo apt-get install dpkg-dev libsdl1.2-dev libesd0-dev
sudo apt-get install git-core gnupg flex bison gperf build-essential
sudo apt-get install zip curl zlib1g-dev gcc-multilib g++-multilib
sudo apt-get install libc6-dev-i386
sudo apt-get install lib32ncurses5-dev x11proto-core-dev libx11-dev
sudo apt-get install libgl1-mesa-dev libxml2-utils xsltproc unzip m4
sudo apt-get install lib32z-dev ccache
sudo apt-get install libssl-dev
安装 sudo apt-get install libesd0-dev 会报 Unable to locate package libesd0-dev 这个错,解决办法
sudo gedit /etc/apt/sources.list //在行尾添加如下两行的内容
deb http://us.archive.ubuntu.com/ubuntu/ xenial main universe
deb-src http://us.archive.ubuntu.com/ubuntu/ xenial main universe
2.4、编译
使用envsetup.sh脚本初始化环境:
source build/envsetup.sh
选择用lunch构建哪个目标,根据设备选择需要的目标,该设备可以是google官方提供的,根据google提供的驱动地址下载:https://developers.google.cn/android/drivers或者可以用电脑模拟器“sdk_phone_x86_64”,我这边没有设备使用的是电脑模拟器
lunch sdk_phone_x86_64
构建代码
m j8(8等于核数*2)
其他指令说明
- croot: Changes directory to the top of the tree.
- m: Makes from the top of the tree.
- mm: Builds all of the modules in the current directory.
- mmm: Builds all of the modules in the supplied directories.
- cgrep: Greps on all local C/C++ files.
- jgrep: Greps on all local Java files.
- resgrep: Greps on all local res/*.xml files.
- godir: Go to the directory containing a file.
- clean - m clean 会删除此配置的所有输出和中间文件。此内容与 rm -rf out/ 相同
其中mmm指令就是用来编译指定目录.通常来说,每个目录只包含一个模块.比如这里我们要编译Setting 模块,执行指令:
mmm packages/apps/Settings/
启动模拟器
emulator
模拟器关闭时候,其实在后台还存在,需要自行关闭
pkill qemu
三、自定义ROM真机刷机
USB 调试配置:(设备USB能连上电脑虚拟机则不用管,如果不是用虚拟机能连上电脑也忽略)https://developer.android.google.cn/studio/run/device.html#setting-up
驱动下载:https://developers.google.cn/android/drivers#angleropr6.170623.019
下载完对应的驱动,并将压缩包放入已经下载好的源码根目录,解压后得到两个脚本文件,从源代码树的根目录运行附带的自解压脚本,然后确认您同意附带的许可协议的条款。二进制文件及其对应的 makefile 将会安装在源代码树的 vendor/ 层次结构中
# 我的目录/home/zhangxiaoxiao/aosp
extract-qcom-barbet.sh
extract-google_devices-barbet.sh
为了确保新安装的二进制文件在解压后能被有效采用,请使用以下命令删除所有之前 build 的已有输出:
make clobber
进入Bootloader模式:(解BL锁)
adb reboot bootloader
查看连接设备:
fastboot devices
刷机:
fastboot flashall -w
四、过程报错收集
无法安装libesd0-dev
解决办法:
sudo vim /etc/apt/sources.list //在行尾添加如下两行的内容
deb http://us.archive.ubuntu.com/ubuntu/ xenial main universe
deb-src http://us.archive.ubuntu.com/ubuntu/ xenial main universe
更新软件源并重新安装:
sudo apt-get update && sudo apt-get install libesd0-dev
内存不够,新版本要求16G,可能是你开的线程太多了。比如make -j8 这种。还有一种原因是可能没有设置swap交换区,就是把磁盘空间当作临时内存,注意的点是,设置完成需要重启虚拟机或电脑。
//查看内存大小
free -m
//创建交换分区的文件:增加16G大小的交换分区,则命令写法如下,其中的 count 等于想要的块大小
dd if=/dev/zero of=/home/swapfile bs=1M count=16384
//设置交换分区文件,建立swap的文件系统
mkswap /home/swapfile
//立即启用交换分区文件
swapon /home/swapfile
//如果要使系统开机时自启用,要在文件/etc/fstab中添加一行
/home/swapfile swap swap defaults 0 0
KVM的虚拟化需要硬件支持报错
//报错信息
INFO | Android emulator version 31.3.9.0 (build_id 9070145) (CL:N/A)
INFO | Storing crashdata in: /tmp/android-zhangxiaoxiao/emu-crash.db, detection is enabled
INFO | Duplicate loglines will be removed, if you wish to see each indiviudal line launch with the -log-nofilter flag.
ERROR | x86_64 emulation currently requires hardware acceleration!
CPU acceleration status: KVM requires a CPU that supports vmx or svm
//安装kvm解决办法参考如下
https://help.ubuntu.com/community/KVM/Installation
//模拟器参考
https://blog.csdn.net/mvp_Dawn/article/details/107678057
make完不能直接emulator启动电脑模拟器,会报错,lunch aosp_x86-eng这个版本不行,Android12改掉了会报错
ERROR | Failed to create Vulkan instance.
qemu-system-x86_64: Could not open '/home/zhangxiaoxiao/aosp/out/target/product/generic_x86_64/userdata-qemu.img': No such file or directory
//解决办法
lunch sdk_phone_x86_64
感谢
https://www.jianshu.com/p/6dee223ac93e
https://blog.csdn.net/kfyzjd2008/article/details/124267159
https://www.jianshu.com/p/53941de91c77
https://www.pudn.com/news/62599ce6be9ad24cfab6def3.html
https://www.cnblogs.com/caoxinyu/p/10568480.html