AOSP学习(一)Ubuntu编译Android13系统源码

前言

做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

1675172744307.jpg

1.2.2、如果是Mac的话,给了一个新的硬盘,格式化的话选择区分大小写,不然Androidstudo去跑源码会莫名的报错

1675173592846.jpg

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 "zhangxiaoxiao@qq.com"
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
1675174640671.jpg

二、源码下载与编译

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'

1675178768113.jpg

如果需要某个特定的 Android 版本(Android 版本列表 ):

repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b android-13.0.0_r24

同步源码树(以后只需执行这条命令来同步):

repo sync

等待漫长的好几个小时,终于完成,成功会有这样提示

WechatIMG321.png

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
1675180175543.jpg

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/
WechatIMG322.png

启动模拟器

emulator
WechatIMG482.png

模拟器关闭时候,其实在后台还存在,需要自行关闭

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

1675256709006.jpg

下载完对应的驱动,并将压缩包放入已经下载好的源码根目录,解压后得到两个脚本文件,从源代码树的根目录运行附带的自解压脚本,然后确认您同意附带的许可协议的条款。二进制文件及其对应的 makefile 将会安装在源代码树的 vendor/ 层次结构中

# 我的目录/home/zhangxiaoxiao/aosp
extract-qcom-barbet.sh
extract-google_devices-barbet.sh
1675258441080.jpg

为了确保新安装的二进制文件在解压后能被有效采用,请使用以下命令删除所有之前 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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,686评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,668评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,160评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,736评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,847评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,043评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,129评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,872评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,318评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,645评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,777评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,470评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,126评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,861评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,095评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,589评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,687评论 2 351

推荐阅读更多精彩内容