【Android】Ubuntu20.04编译Android 13并用模拟器运行

news2024/11/25 10:11:09

前言

一直好奇Android系统是怎么定制的,直到亲自走一遍Android系统编译流程才发现并没想象的复杂。

这就跟app开发一样,Google官方其实都提供了平台、文档、IDE及一些工具,咱们只要按照官方提供的指南来操作就行了。

如果Android没有提供这样一个开放的系统、完善的生态,咱们就不可能开发出各种 app以及各种定制的Android系统。

Android开发大体分两个方向,一个是App开发,一个是Framework开发。因为Android不同于iOS,Android是开源的,也就是你不仅可以开发app,还可以修改它的系统并移植到你自己的硬件平台上,比如手机、平板、车载系统等等。对后者来说,本质上也是开发app,只是你需要经常跟framework、hal层打交道。像小米、华为和oppo等。它们只是把Android原生的系统自带的lancher app、设置app、拍照app、商店app等等替换成了自家的app而已。

言规正传,下面分享一下在windows wsl虚拟机环境下如何编译Android源码,然后在Android模拟器上运行。这个过程并没有想象的那么顺利,需要自己踩些坑才能摸清门道。

硬件要求

以下是Google官方公布的最低硬件要求:

  • 如果是编译 Android 2.3.x (Gingerbread) 及更高版本(包括 master 分支),需要 64 位环境。如果是较低的版本,则可以在 32 位系统中进行编译。

  • 如果要检出代码,至少需要 250 GB 可用磁盘空间;如果要进行构建,则还需要 150 GB。如果要进行多次构建,则需要更多空间。
    注意:如果您要检出镜像,就需要更多空间,因为完整的 Android 开源项目 (AOSP) 镜像包含所有使用过的 Git 代码库。

  • 至少需要 16 GB 的可用 RAM,但 Google 建议提供 64 GB。

从 2021 年 6 月起,Google 使用 72 核机器,内置 RAM 为 64 GB,完整构建过程大约需要 40 分钟(增量构建只需几分钟时间,具体取决于修改了哪些文件)。相比之下,RAM 数量相近的 6 核机器执行完整构建过程需要 3 个小时。

软件要求

以下是Google官方公布的软件要求:

操作系统:Ubuntu 18.04及以上

自 2021 年 6 月 22 日起,Google将不再支持在 Windows 或 MacOS 上进行构建。

JDK
AOSP 中的 Android master 分支带有预构建版本的 OpenJDK;因此无需另行安装。
旧版 Android 需要单独安装 JDK。在 Ubuntu 上,请使用 OpenJDK。

主要软件包
AOSP master 分支带有预构建版本的 Make;因此无需另行安装。类似地,Git 是在搭建构建环境过程中安装的。

确保您的系统已安装 Python 3。

笔者编译环境

以下是笔者成功编译Android 13使用的硬件和软件环境:

物理机系统:Windows 11家庭版
CPU:Intel core i7
内存:32GB
硬盘: 1TGB Free。
虚拟机:Wsl2
虚拟机系统:Ubuntu 20.04.6 LTS

下载AOSP源码取决于网速,大约半小时左右。使用以上环境编译Android 13大约需要1个小时左右。

安装wsl2

如果你没有Linux物理机,那么就需要使用虚拟机。如果你的电脑是Window10或者11,建议使用windows官方的虚拟机软件wsl2(windows sub linux 2),wsl第一版没有linux完整内核,直到微软推出wsl2之后,更接近真实的linux操作系统。这比安装vmware虚拟机软件要简单方便得多,而且启动也非常快。

安装wsl比较简单,先在windows命令行输入:wsl -l -v看是否安装,没有的话就去Microsoft Store商店下载安装linux:

在这里插入图片描述
如果显示以下信息说明已经安装了wsl2。
在这里插入图片描述

安装wsl要注意不要安装在c盘,如果安装在c盘,虚拟机占用的磁盘空间就是c盘的空间,会导致你的系统盘空间不足。建议将wsl安装在一个独立的磁盘分区里,保证磁盘分区至少300GB的剩余空间。

Microsoft Store里点击安装会默认安装到c盘,不过没关系,后面可以迁移到其它盘。

如果不慎安装到了c盘,可以将其迁移到其它盘,步骤如下:

关闭wsl:wsl --shutdown

查看wsl状态:wsl -l --all -v
在这里插入图片描述

如果状态是Stopped,将虚拟机镜像导出到E盘:

wsl --export Ubuntu-20.04 E:\wsl-ubuntu20.04.tar
大约需要几分钟时间。

注销当前分发版
wsl --unregister Ubuntu-20.04

查看wsl状态:
wsl -l -v
( 如果显示"适用于 Linux 的 Windows 子系统没有已安装的分发版"则继续以下步骤)

重新导入并安装到E:\wsl-ubuntu20.04
wsl --import Ubuntu-20.04 E:\wsl-ubuntu20.04 E:\wsl-ubuntu20.04.tar --version 2

设置默认登陆用户为安装时用户名
ubuntu2004 config --default-user [Username]

删除tar文件(可选)
del E:\wsl-ubuntu20.04.tar

启动wsl

启动wsl有两种方式,一种是使用命令:wsl,另一种是在cmd窗口上面点击:
在这里插入图片描述
然后就进入了Utbuntu系统中,这跟Ubuntu系统几乎是一样的:
在这里插入图片描述
这是没有图形界面的Ubuntu,图形界面不是必须的,编译Android的所有操作都可以在这个命令行环境下进行。

设置Ubuntu软件更新源

接下来需要通过apt get install安装很多软件(也就是一些命令),这些软件会翻墙下载,为了避免翻墙,需要设置软件更新源为国内的源,建议使用阿的云的源:

备份旧源:
sudo cp/etc/apt/sources.list /etc/apt/sources.list.bak

设置新源:
sudo vim /etc/apt/sources.list

粘贴以下内容并保存:

deb http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-security main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-updates main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-proposed main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse
deb-src http://mirrors.aliyun.com/ubuntu/ focal-backports main restricted universe multiverse

设置 Linux 构建环境

安装所需的软件包 (Ubuntu 18.04及以上)

sudo apt-get install git-core gnupg flex bison build-essential zip curl zlib1g-dev libc6-dev-i386 libncurses5 lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z1-dev libgl1-mesa-dev libxml2-utils xsltproc unzip fontconfig

安装Git

运行git命令,如果没有安装按提示操作即可。

安装Repo启动器

repo是Google为了管理Aosp源码提供的一个命令行软件,简化了git的一些操作,并不是用来取代git的。

安装命令:

 sudo apt-get update
 sudo apt-get install repo

或者:

export REPO=$(mktemp /tmp/repo.XXXXXXXXX)
curl -o ${REPO} https://storage.googleapis.com/git-repo-downloads/repo
gpg --recv-key 8BB9AD793E8E6153AF0F9A4416530D5E920F5C65
curl -s https://storage.googleapis.com/git-repo-downloads/repo.asc | gpg --verify - ${REPO} && install -m 755 ${REPO} ~/bin/repo

如果以上方式都无法安装,还可以通过手动下载repo,然后将其拷贝到/bin目录下。

验证Repo启动器:

运行repo version命令验证
在这里插入图片描述
如果显示以上信息则是正常的。这只是一个repo启动器,还没有初始化。

初始化Repo

创建一个空目录来存放Aosp源码,比如Aosp:

mkdir Aosp
cd Aosp

后面所有在Linux中完成的命令,工作目录都不会变,即在刚刚创建的Aosp根目录下

使用repo init初始化仓库,初始化时需要指定代码库地址,也就是manifest结尾的一个地址,因为这个库比较大,而且在国外,所以建议使用清华大学的Aosp镜像。初始化repo,同时设置需要签出的分支是android-13.0.0_r60,也可以使用master或者其它分支代替。

初始化命令:

 repo init -u https://mirrors.tuna.tsinghua.edu.cn/git/AOSP/platform/manifest -b android-13.0.0_r60

-u参数指定仓库地址,-b指定要checkout的分支。

这一步只是初始化repo,还没有正式下载Aosp源码,它会下载一些repo命令相关的文件。

如果收到报错:/usr/bin/env 'python' no such file or directory”,说明python命令没找到,需要将python3建立软链接:

sudo ln -s /usr/bin/python3 /usr/bin/python

然后重新跑一下repo init xxx命令即可。

在这里插入图片描述

显示repo has been initialized说明初始化成功。

下载Android源码

repo sync

运行以上命令之后,开始下载Aosp源码,源代码文件会下载到当前工作目录下。源代码有一百多个G,大约需要30分钟左右。

这一步通常是比较顺利的,因为使用的大陆的镜像,还是比较快的。

下载完成之后,目录是这样:
在这里插入图片描述
其中,packeages/apps就是系统自带的一些app的源码。比如Launcher3就是系统默认的桌面app。
在这里插入图片描述

构建Android系统

(一)、 初始化脚本环境:

source build/envsetup.sh

. build/envsetup.sh

(二)、选择构建目标:

lunch sdk_pc_x86_64-userdebug

如果使用不带参数的lanch命令会提示你选择目标:

在这里插入图片描述在这里插入图片描述

所有构建目标都采用 BUILD-BUILDTYPE 形式,其中 BUILD 是表示特定功能组合的代号。BUILDTYPE 是以下类型之一:

构建类型使用情况
user权限受限;适用于生产环境
userdebug与“user”类似,但具有 root 权限和调试功能;是进行调试时的首选编译类型
eng具有额外调试工具的开发配置

因为要编译成模拟器运行的Android镜像,模拟器的环境是x86_64。所以要选择x86_64,userdebug后缀表示是可以调试的版本。

本例中,选择的是sdk_pc_x86_64-userdebug

注意不要选择aosp_x86_64-eng,经验证发现编译之后没有userdata.img文件,不知道为什么。

(三)、开始构建:

m

输入m命令回车即可。m是make的缩写,表示开始执行构建脚本。

这一步大概是1~2小时,视你的硬件配置而定。

编译过程会显示进度,如果显示100%说明编译完成了。
在这里插入图片描述
以上是编译成功的提示。

然后在out/target/product目录就可以看到编译后生成了一个文件夹:emulator64_x86_64,
里面是模拟器镜像等文件:
在这里插入图片描述
可以看到其中包含了Android系统的三个镜像:system.imgramdisk.imguserdata.img

红色那个zip文件是笔者通过镜像打包命令打包出来的,编译完成时是没有的,打包命令在后面会介绍。

(四)、编译报错处理

编译过程中,如果出现错误码137说明是内存不足导致的:
在这里插入图片描述
解决方式:可以使用free命令查看Ubuntu的内存,如果发现跟物理机内存不一致,修改成跟物理机一致即可。如果使用wsl,可以在windows用户根目录下创建.wslconfig文件,内容如下:

[wsl2]
memory=32GB # Limits VM memory in WSL 2 
processors=12 # Makes the WSL 2 VM use 12 virtual processors
localhostForwarding=true # Boolean specifying if ports bound to wildcard or localhost in the WSL 2 VM should be connectable from the host via localhost:port.

编译成功之后,运行emulator命令启动模拟器并运行编译之后的系统:

emulator

在这里插入图片描述
如果报以上这个error:ProbeKVM: This user doesn’t have permissions to use KVM (/dev/kvm).
需要添加权限:sudo chmod -R 777 /dev/kvm

在Window上运行

上面使用emulator命令是在Ubuntu中运行模拟器,会比较卡,画面也不停闪烁。建议在Windows系统中使用Android Studio创建的模拟器运行。

先打包Android镜像:

Android13以下使用命令:

make sdk sdk_repo

在Android13及以上使用命令:

make emu_img_zip

打包完成后会生成sdk-repo-linux-system-images为前缀的 AVD 映像 zip 文件,比如我的路径是:
Aosp/out/target/product/emulator64_x86_64/sdk-repo-linux-system-images-eng.devnn.zip

将其就地解压或者拷贝到Window系统的某个文件夹下再解压。

笔者选择拷贝到D盘,解压后的位置是:D:\Downloads\sdk-repo-linux-system-images-eng.devnn

然后在Android Studio中创建一个模拟器,随便取个名字为 Pixel_5_WSL

在windows命令行中启动模拟器并加载刚才打包的Android系统:

 emulator -avd Pixel_5_WSL -sysdir D:\Downloads\sdk-repo-linux-system-images-eng.devnn\x86_64 -dns-server 8.8.8.8,114.114.114.114 -verbose

上面这个emulator命令是android sdk的tools目录下的。已将tools目录添到环境变量path中。

运行效果如下:
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

到这里为止,就将Andriod 13编译完成并成功运行了。

当然我们可以定制我们的Android系统,只要修改相应源码重新打包即可。

比如最常见的是将自己的app作为系统启动的默认Launcher。开发完成之后修改对应mk文件,重新打包即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/781008.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

15 QMessageBox消息对话框

错误提示对话框 信息提示对话框 循环对话框 默认是Yes和No,可以修改属性。第5个参数关联回车键 QMessageBox::Save | QMessageBox::Cancel 可以通过捕获按键获取点击结果 警告提示 代码: //QMessageBox 消息对话框//错误提示QMessageBox::critical(th…

11 spring-boot的MVC配置原理

11.1 spring-boot为MVC提供的自动配置 1.ContentNegotiatingViewResolver视图解析器; 2.静态资源或者支持WebJars; 3.自动注册类型转换器:比如说前台提交user的字段,后台自动封装的意思; 4.HttpMessageConverters&…

计算机视觉(一)图像预处理

本章内容 图像显示与存储原理颜色空间RGB颜色空间CMY(K)颜色空间HSV颜色空间CIE-XYZ颜色空间 图片存储原理主流颜色空间 图像增强的目标图像处理方法点运算:基于直方图的对比度增强直方图 :对数据空间(bin)…

了解 3DS MAX 3D摄像机跟踪设置:第 1 部分

这是一个关于使用行业标准插件 RayFire 在 3ds Max 中破坏元素的新系列。在本教程的第一部分中,我将向您展示如何在 RayFire 中使用在 3ds Max 中拆除元素的最基本操作和方法。 推荐: NSDT场景编辑器助你快速搭建可二次开发的3D应用场景 1. 准备场景 步…

使用Gin框架搭配WebSocket完成实时聊天

文章目录 前言实时聊天聊天功能测试发送信息 前言 在写项目的时候,需要完成实时聊天的功能,于是简单的学习下WebSocket,想知道WebSocket是什么的小伙伴可以去网上别的地方学习一下。 要实现实时聊天,网上的大部分内容都是Spring…

【MI】ModuleNotFoundError: No module named ‘braindecode.datautil.signalproc‘

使用HGD数据集时,需要从braindecode中调用 一直显示ModuleNotFoundError 以为是导入braindecode的版本太新了,于是在braindecode官网上找代码对应版本,一直找不到,最后从github上找到了代码的使用指南 GitHub - braindecode/br…

(学习笔记)HTTP Keep-Alive和TCP Keep-Alive

HTTP的Keep-Alive HTTP协议采用的是[请求-应答]模式,也就是客户端发起请求,服务端才会响应请求,一来一回这个样子。 由于HTTP是基于TCP传输协议实现的,客户端与服务端需要进行HTTP通信前,需要先建立TCP连接&#xff…

redis的常用命令和数据结构

目录 redis的基本特征 Redis操作命令行 redis的数据结构 Redis的基本特征 键值型,value支持多种不同的数据结构,功能丰富 单线程,每个命令具备原子性 低延迟,速快(基于内存,IO多路复用,良好…

第 109 场 LeetCode 双周赛

A 检查数组是否是好的 暴力: 排序后遍历判断 class Solution { public:bool isGood(vector<int> &nums) {sort(nums.begin(), nums.end());for (int i 0; i < nums.size() - 1; i)if (nums[i] ! i 1)return false;return nums.back() nums.size() - 1;} };B 将…

npm(基础)

基础-是什么 深度-为什么 #npm基础 - 现代前端开发模式 ##很多年前的前端,是什么样子? ##补充一下 ###Node SDK(software develop kit):Node jdk() IDE(集成dev env):VSCode ####有了npm,我们就可以创建一个工程环境 npm - 理解成一个包管理下载的工具 每一个npm管理…

树莓派刷机和登入

1.打开映像工具 2.选择映像文件写入 3.拔出卡插入树莓派上电 4.树莓派登入 1.HDMI视频线&#xff0c;连接到显示屏幕 2.串口登录 修改系统配置&#xff0c;启用串口登录树莓派 &#xff08;1) 打开SD卡根目录的"config.txt文件"&#xff0c;停止蓝牙&#xff0c;…

Pytorch深度学习------TensorBoard的使用

文章目录 1.什么是TensorBoard2.安装3.启动4.Pytorch 使用 TensorBoard4.1 写入数据4.2 写入图像 1.什么是TensorBoard TensorBoard是一个工具&#xff0c;主要用于数据可视化&#xff0c;用大白话的语言来说就是可以记录在机器学习中表格数据、非表格数据&#xff08;图片、文…

信息与通信工程学科面试准备——通信原理|推免/复试/补充

目录 1. 加性高斯白噪声 加性噪声 白噪声 2. 窄带随机过程 2.1 正弦波加窄带随机过程 3. 信道类型 4.多径传播 5. 频率选择性衰落与相关带宽 6.信道容量&#xff08;连续信道的信道容量&#xff09; 7.调制的目的和分类 7.1 目的 7.2 方式 7.3 作用(正弦波调制) …

08_堆学习

目录 一、堆的核心概述2、内存细分 二、设置堆内存大小与OOM1、设置堆内存大小2、OOM的说明 三、年轻代与老年代2、如何查看一个程序新生代和老年代的比例 四、图解对象分配过程1、图解对象分配过程2、对象分配特殊情况3、常用优化工具概述与 Jprofiler的演示 五、Minor GC、Ma…

MATLAB 自定义最小二乘法拟合直线点云(具体过程)方法二 (27)

MATLAB 自定义最小二乘法拟合直线点云(具体过程)方法二 (27) 一、算法简介二、算法实现1.代码(注释详细)2.效果展示一、算法简介 最小二乘法拟合直线,可以将离散的点云表达为一条规则的数学直线, 这里使用的直线方程为y = kx+b 这里提供具体的实现流程,展示如何进行最…

实现外部缓存-Redis

目录 实现 RedisTemplate RedisTemplate的序列化 RedisSerializer 创建Redis缓存配置类 测试使用 创建配置类 创建注解测试实体 创建配置文件 创建单元测试类进行测试 实现 RedisTemplate XXXTemplate 是 Spring 的一大设计特色&#xff0c;其中&#xff0c;RedisTe…

Linux笔记——进程管理与网络监控技术讲解

系列文章目录 Linux笔记——磁盘进行分区与挂载介绍 Linux笔记——管道相关命令以及shell编程 文章目录 系列文章目录 前言 一 进程管理 1 简介 2 系统执行进程的情况 3 查看进程树 4 服务管理 4.1 服务的运行级别 4.2 chkconfig 4.3 systemctl管理指令 4.4 针…

【文档智能】ERNIE-Layout

前言 这是百度在2022年的一篇工作&#xff1a;ERNIE-Layout。该工作通过增强布局知识的预训练模型&#xff0c;以学习更好的表示&#xff0c;结合文本、布局和图像的特征。旨在利用文档布局相关信息&#xff0c;进行文档理解&#xff0c;进一步提高文档信息抽取的性能。 1、文…

FPGA_学习_13_方差计算小模块

测距器件APD的性能与器件本身的温度、施加在APD的偏置电压息息相关。 在不同的温度下&#xff0c;APD的偏压对测距性能的影响非常大。 要确定一个合适的APD的偏压Vopt&#xff0c;首先你要知道当前温度下&#xff0c;APD的击穿电压Vbr&#xff0c;一般来讲&#xff0c;Vopt Vb…

【Zerotier】通过docker自建PLANET服务器

在如今全球互联的时代&#xff0c;我们对于互联网的依赖程度越来越高。然而&#xff0c;传统的网络连接方式在某些情况下可能会受到一些限制&#xff0c;例如局域网的范围限制、防火墙的阻断或者设备所处的多层NAT等。但是&#xff0c;现在有一个名为ZeroTier的工具出现了&…