Android12 系统源码编译及踩坑全攻略

环境: Windows 11

虚拟机:VMware-workstation-full-17.6.2-24409262

Ubuntu:22.04

1. 代码下载

  • 在根目录下创建文件夹
bash 复制代码
mkdir ~/bin
  • 导入到环境变量
bash 复制代码
PATH=~/bin:$PATH
  • repo下载

Android源码包含数百个git库,光是下载这么多的git库就是一项繁重的任务,所以Google开发了repo,它是用于管理Android版本库的一个工具,使用了Python对git进行了一定的封装,简化了对多个Git版本库的管理。 下载AOSP前我们要先下载repo。

bash 复制代码
curl -sSL  'https://gerrit-googlesource.proxy.ustclug.org/git-repo/+/master/repo?format=TEXT' |base64 -d > ~/bin/repo

注意还要设置为清华源 (google官方的源访问不到的)

bash 复制代码
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'
  • 设置linux读写权限
bash 复制代码
chmod a+x ~/bin/repo
  • 修改repo URL,替换 REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'
bash 复制代码
vim ~/bin/repo
  • 配置git
bash 复制代码
git config --global user.name "####" 
git config --global user.email "####@example.com"
  • 新建代码存放目录
bash 复制代码
mkdir ~/code
cd ~/code
mkdir aosp_android12_r27
cd aosp_android12_r27
  • 知道对应的TAG,这里我们就可以repo init初始化仓库的所有配置信息,准备下载了
bash 复制代码
repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest -b  android-12.1.0_r27

如果报错:/usr/bin/env: "python": 没有那个文件或目录, 如果系统中已经安装了 Python 3,但 repo 仍然找不到 python,可能是因为 repo 默认使用 python 而不是 python3。你可以创建一个符号链接来解决这个问题: sudo ln -s /usr/bin/python3 /usr/bin/python

repo init 只是初始化仓库,并不会开始下载 AOSP 源码。你需要执行:

bash 复制代码
repo sync -j10

j10 代表使用10个线程下载,这个和你配置虚拟机的线程数和内存有关,线程数越多,相应占用内存越多,根据实际情况合理配置,-j$(nproc) 让 repo sync 使用所有可用 CPU 线程,加快同步速度。

如果遇到以下报错(未遇到忽略 # 中的内容):

#####################################################

bash 复制代码
Downloading Repo source from https://gerrit.googlesource.com/git-repo
fatal: Cannot get https://gerrit.googlesource.com/git-repo/clone.bundle
fatal: error [Errno 101] Network is unreachable
fatal: cloning the git-repo repository failed, will remove '.repo/repo' 

● 原因:gerrit.googlesource.com 在某些地区可能被限制访问。 ● 解决方法: 使用镜像源下载 Repo 工具:

bash 复制代码
curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo -o ~/bin/repo
chmod a+x ~/bin/repo

设置 Repo 工具使用镜像源:

bash 复制代码
export REPO_URL='https://mirrors.tuna.tsinghua.edu.cn/git/git-repo'

然后再重新执行 repo init...继续下载

如果下载过程中 卡住了(下载任务仍在执行,网速却像没有下载一样),可以终止下载,重新执行下载脚本即可

#####################################################

  • 下载有时候会出错,所以我们这里使用脚本进行自动下载,失败后会自动重新下载 创建 download.sh下载脚本
bash 复制代码
touch download.sh

内容如下:

bash 复制代码
#!/bin/bash
repo sync -j4
while [ $? -ne 0 ]
do
echo "======sync failed ,re-sync again======"
sleep 3
repo sync -j4
done

授予文件执行权限

bash 复制代码
sudo chmod a+x download.sh

执行脚本 开始下载

bash 复制代码
./download.sh

等待下载完成即可....

2. 编译、模拟器

  • 配置编译环境
bash 复制代码
sudo apt-get install git-core gnupg flex bison gperf build-essential zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig python3
  • 文本编辑器,或者vim打开,找到最后一行,添加 sdk_phone_x86_64-eng \

有些产品,比如bonito,在lunch选择之后,即使编译成功了执行emulator,也不会有模拟器出来,因为不带有模拟器的image。所以android12上,我们需要添加模拟器的选择,先修改mk文件

bash 复制代码
vim build/make/target/product/AndroidProducts.mk
  • 在最后一行添加
bash 复制代码
     aosp_x86_64-eng \
     aosp_x86-eng \
+    sdk_phone_x86_64-eng \
  • 初始化编译环境(尽量用 source 因为使用 . 在后续编译阶段可能会报错!)
bash 复制代码
source build/envsetup.sh

bash 复制代码
. build/envsetup.sh
  • 选择需要编译的机型
bash 复制代码
lunch sdk_phone_x86_64-eng
  • 最后开始执行编译,查看一下你的cpu现成最大数量,我的是16,这里不执行满,防止卡死

这里大概需要编译3-4个小时

bash 复制代码
make -j12

等待编译结束

  • 编译成功后执行,启动模拟器,加上-writable-system 参数可以成功执行 adb remount,后续修改系统文件能用到
bash 复制代码
emulator -writable-system

如果你能成功启动模拟器,甚好!But,如果启动失败 请继续往下看...

按照下面两个文章把自己的电脑配置一下,该关的关,该改的改 ↓

修改完,不出意外的话,就能正常打开模拟器了~


关于修改源码后再编译运行

要把 out/target/product/emulator_x86_64/ 下的一些镜像文件删除了: product.imgsystem.imgsystem_ext.imgvendor.img 或者在 out/target/product/emulator_x86_64/ 目录下搜索 .img 全部删除 修改源码后 执行 m -j8 编译,然后继续启动模拟器看效果。

关闭虚拟机后,下次打开继续运行模拟器

bash 复制代码
//先初始化环境
source build/envsetup.sh

//选择上次编译过的机型
lunch sdk_phone_x86_64-eng

//启动模拟器
emulator -writable-system

注意不要lunch 错了,lunch 其他的要从头开始编译,而且还没有模拟器!!! 也不要执行make clean,这会把编译的文件全部清理了!!!

ok,开始愉快的 Android Framework 之旅吧 :)


再补充一个

Windows 如何与Ubuntu 传输文件

  1. 在Windows上下载 FileZilla filezilla-project.org/download.ph... 然后傻瓜式安装完毕

  2. 在Ubuntu 安装SSH服务 在虚拟机上安装SSH服务。对于Ubuntu系统,可以使用以下命令:

bash 复制代码
sudo apt-get install openssh-server

安装完成后,启动SSH服务:

bash 复制代码
sudo service ssh start

使用以下命令查看虚拟机的IP地址:

bash 复制代码
ifconfig
  1. 如何使用
  • 在 FileZilla 上方输入 主机IP 、用户名(@前面的是用户名,如上图我的是xaye)、密码、端口号 22
  • 连接,右键 右边文件下载,即可下载到左边的当前目录下,点击左边的文件右键上传,即可上传到Ubuntu的当前显示目录下

结束!

相关推荐
奋斗的小鹰30 分钟前
Android中使用Glide加载图片闪烁问题
android·glide
Wgllss37 分钟前
金三银四,分享N年前准备的面试真经,可能适用绝大部分人
android·架构·android jetpack
CL_IN38 分钟前
如何将聚水潭·奇门平台数据高效集成到MySQL
android·数据库·mysql
pengyu1 小时前
系统化掌握Flutter组件之Draggable/DragTarget
android·flutter·dart
_祝你今天愉快1 小时前
Android源码学习之开机动画
android·源码
Yang-Never2 小时前
OpenGL ES ->帧缓冲对象(Frame Buffer Object)离屏渲染获取纹理贴图
android·开发语言·kotlin·android studio·贴图
Andy.Zeng3 小时前
Android StrictMode 使用与原理深度解析
android·性能优化·kotlin·代码规范·内存泄漏·strictmode·耗时检测
Andy.Zeng3 小时前
《Android应用性能优化全解析:常见问题与解决方案》
android·性能优化
kfepiza3 小时前
android用java设置button之间的间距 笔记250311
android·java·前端