Win 11 通过WSL 安装子系统Ubuntu 20.0.4 进行编译构建Android Aosp 源码

2023-11-16

准备工作

  1. 存放源码的空间大于 400G
  2. 内存不能低于8G, 本地16G
  3. 安装 wsl_update_x64.msi ,处理 Ununtu 安装后无法正常启动,可通过 https://github.com/wxp109761/WSL2 进行下载

win11(家庭版) 通过WSL安装 虚拟子系统 ubuntu20.0.4

  1. 打开电脑 启用或关闭Windows 功能
    额外勾选 Windows 虚拟监控平台适用于Linux的Windows 子系统虚拟机平台,然后点击确定,如图,然后点击确定,进行重启。
    在这里插入图片描述

  2. 打开 Microsoft Score应用程序,搜索 WSL, 选择安装ubuntu,我这边选择的是 Ubuntu 20.04.4 LTS,安装完成后如果不想将C盘作为挂载的虚拟硬盘先不要打开 Ubuntu,需要移动 Ubuntu的位置,保存在其他盘,在其他盘进行启动,详见步骤3;如果默认安装在C盘,会默认分配250G 挂载到 Ubuntu
    在这里插入图片描述

  3. 管理员模式打开Windows 终端(PowerShell),指令执行如图

    cd C:\Program Files\WindowsApps\  #进入Ubuntu 安装的根目录

    dir CanonicalGroupLimited*  #列出以CanonicalGroupLimited 开头的文件

    dir .\CanonicalGroupLimited.Ubuntu20.04LTS_2004.4.5.0_x64__79rhkp1fndgsc\  #通过tab键补全命名以CanonicalGroupLimited 开头的路径,并罗列该文件夹下所有的子文件,看哪个文件夹包含 ubuntu2004.exe 可执行文件

    mkdir e:\ubuntu20.04 #在对应盘符下创建一个存放ubuntu的路径,我这边在 e 盘下创建了对应的目录

    copy .\CanonicalGroupLimited.Ubuntu20.04LTS_2004.4.5.0_x64__79rhkp1fndgsc\* e:\ubuntu20.04\  #将包含ubuntu2004.exe 文件的文件夹下面的所有文件复制到你所创建的目录,原有的Ubuntu 在Microsoft Score中进行卸载了

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

  1. 双击E:\ubuntu20.04\ubuntu2004.exe 打开Ubuntu(保证wsl_update_x64.msi 已安装,否则会报0x800701bc 错误),按照提示 输入用户名和密码即可。

扩大挂载的虚拟硬盘

SWL默认给虚拟硬盘分配的空间为256G,在后续的源码编译时会提示硬盘空间不够,需要开始时扩大所挂载的虚拟硬盘空间

  1. 找到WSL ubuntu 安装的路径(前面步骤已经移动到e:\ubuntu20.04),即需要找到文件 ext4.vhdx 的位置,管理员模式打开Windows 终端(PowerShell),执行指令
   wsl --shutdown  #终止WSL 实例

   Get-AppxPackage -Name "*<Ubuntu-20.04>*" | Select PackageFamilyName #如果不知道 *ext4.vhdx* 的路径,可以用该指令进行检索

   diskpart  #可以对挂载磁盘进行操作
   
   Select vdisk file="<pathToVHD>"  #pathToVHD代表ext4.vhdx的路径,选择挂载的虚拟盘,本地执行 Select vdisk file="E:\ubuntu20.04\ext4.vhdx"

   detail vdisk  #查看挂载的虚拟盘的大小,默认256G

   expand vdisk maximum=<你需要的大小> #设置你想要的虚拟盘大小,本地执行 expand vdisk maximum=352000

   detail vdisk  #再次查看分配的虚拟盘大小
   
   exit #退出diskpart
  1. 双击 E:\ubuntu20.04\ubuntu2004.exe 打开 WSL 实例,ubuntu 中执行如下指令,进行重新挂载
    df -h  #查看当前的挂载情况

    sudo mount -t devtmpfs none /dev

    mount | grep ext4

    sudo resize2fs /dev/sdX <sizeInMegabytes>M  #X可能代表a,b,c,sizeInMegabytes代表扩展后的大小,与前面保持一致即可,本地执行sudo resize2fs /dev/sdb 352000M

    df -h 查看分配的虚拟硬盘扩容完成

Swap 扩大处理

虚拟机安装时会默认安装实际物理内存的一半,本地 16G 内存,给虚拟机分配的内存约为8G, 虚拟内存不够,编译时会报错,无法构建成功,需要使用 swap 将部分硬盘当作内存使用。Ubuntu 中执行如下指令。

    free -m  #查看当前 *swap* 的大小

    sudo swapoff /var/swap

    sudo rm /var/swap

    sudo fallocate -l 16G /var/swap

    sudo chmod 600 /var/swap

    sudo mkswap /var/swap

    sudo swapon /var/swap

    sudo vim /etc/fstab  #编辑/etc/fstab 添加如下内容,
        /var/swap  swap  swap  defaults  0  0   

    :: 源码编译构建时可以新开 *Ubuntu* 命令窗口,执行 top 指令,可以查看修改后的 *SWAP*是否被使用,如果未被使用,进行如下处理,最好直接做如下处理
    sudo vim /etc/sysctl.conf  #编辑/etc/sysctl.conf ,当内存剩余设定值时启用 *SWAP*, 
        vm.min_free_kbytes=1500000   #当内存为1.5G时启用SWAP内存
针对swap 挂载重启失效的问题做如下处理:

每次重启之后执行 sudo swapon /var/swap 指令进行挂载,或按照下面的步骤进行自动挂载

 sudo vim /etc/systemd/system/rc-local.service ##创建systemd的服务脚本
## 在/etc/systemd/system/rc-local.service 中添加如下内容:

[Unit]
Description=/etc/rc.local Compatibility
ConditionPathExists=/etc/rc.local

[Service]
Type=forking
ExecStart=/etc/rc.local start
TimeoutSec=0
StandardOutput=tty
RemainAfterExit=yes
SysVStartPriority=99

[Install]
WantedBy=multi-user.target
sudo vim /etc/rc.local  ## 创建rc.local 文件
### 在rc.local 文件中添加如下内容

#!/bin/sh -e
# 
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

# 开机启动的命令
swapon /var/swap ## 开机进行 swap 挂载

exit 0
sudo systemctl enable rc-local.service ## 启动创建的服务

sudo chmod +x /etc/rc.local  ## 给/etc/rc.local 权限

安装更新编译时依赖

    sudo apt update

    sudo apt install python-is-python3   #Ubuntu默认安装python3,编译时会提示没有python,执行该指令处理没有python的情况

    mkdir ~/bin

    PATH=~/bin:$PATH

    curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo  

    chmod a+x ~/bin/repo
    
    sudo apt install apt-file  #检索下是否有libncurse.s0.5,如果没有,安装依赖libncurses5
    sudo apt-file find libncurse.s0.5
    sudo apt install libncurses5

    sudo apt 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  ## 安装需要的依赖包

拉取代码,编译构建

  1. Ubuntu 命令窗口创建存放源码的路径,进入到源码路径下执行如下指令
    git config --global user.name "xxxxxxx"

    git config --global user.email "xxx@xx.com"

    repo init -u https://android.googlesource.com/platform/manifest  #官方初始化基线,由于墙无法正常初始化,使用下面的指令进行初始化

    repo init -u git://mirrors.ustc.edu.cn/aosp/platform/manifest  #中科大镜像源,如果提示无法连接到 gerrit.googlesource.com,可以执行 vim ~/bin/repo 编辑该文件,将 REPO_URL 的链接替换为: REPO_URL = 'https://gerrit-googlesource.proxy.ustclug.org/git-repo'
    
    repo sync #同步代码,末尾可以加 -jX,eg:repo sync -j4  X代表同步代码时开辟的线程数,建议不要 repo sync -j4

    ::代码同步完成后,进行编译构建
    . build/envsetup.sh  #或者 source build/envsetup.sh
    lunch  #lunch后会罗列所有的分支,输入序号选择你要编译的分支,或者直接 lunch <分支名>;本地执行 lunch aosp_x86_64-eng
    make -j12  #进行编译,建议不要过大,make -j8
  1. 编译报错OOM ,进行如下操作
    vim /build/soong/java/droidstubs.go,搜索“cmd.BuiltTool(“metalava”)”定位到代码处,然后新加语句: Flag(“-J-Xmx6114m”).
    如果编译过程中其他报错,多进行几次编译,最后应该就能构建成功了
    请添加图片描述
    如有侵权,请联系处理,感谢
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Win 11 通过WSL 安装子系统Ubuntu 20.0.4 进行编译构建Android Aosp 源码 的相关文章

  • 具有自定义源集的 Android Gradle 风格 - gradle 文件应该是什么样子?

    我有一个旧的 eclipse 项目 我已经转移到 android studio 并设置为使用flavor 它似乎工作得很好 直到我开始尝试在我的风格之间使用不同的 java 文件 我的项目设置是这样的 ProjectRoot acitonb
  • 当不支持 Google Play 应用内结算 V.3 时

    在 Google Play 的应用内结算 V 3 中 有一个选项可以检查用户设备是否支持它 使用是否支持计费 http developer android com google play billing versions html meth
  • 使用 Android Firebase 堆栈推送通知

    我开发了使用 Firebase 接收推送通知的 Android 应用程序 我的代码基于 Firebase Google 官方文档 https firebase google com docs cloud messaging android
  • 使用 sed 更新 xml 属性(Windows + cygwin 和 Linux)?

    我需要使用 sed 命令对 xml 文件进行更新 但我在这方面遇到了麻烦 它需要在 Windows 使用 cygwin 和 Linux 上运行 XML 具有以下元素
  • Android Fragment onCreateView 与手势

    我正在尝试在片段中使用手势 我在 FragmentActivity 中有以下内容来处理我的详细信息片段 我试图发生的情况是 当在视图上检测到滑动时 将该视图内的数据替换为上一个或下一个条目 如果有更好的方法来处理这个问题 我完全同意 然而
  • Android:使 Dialog 周围的所有内容都比默认值更暗

    我有一个具有以下样式的自定义对话框 它显示了一个无边框对话框 后面的任何内容都会 稍微 变暗 我的设计师希望背后的一切都比 Android 的默认设置更暗 但不是完全黑色 有这样的设置吗 我能想到的唯一解决方法是使用全屏活动而不是对话框 只
  • 像 WhatsApp 一样发送图片

    我做了一个聊天应用程序 我想添加照片 文件共享我的应用程序中的概念与 WhatsApp 相同 我已经使用该应用程序制作了Xmpp Openfire目前我正在使用此功能进行照片共享 但它并不完全可靠 public void sendFile
  • 如何从android中的外部存储中获取所选文件的文件路径?

    我在选择文件的文件路径时遇到问题 我搜索了整个堆栈溢出 但问题没有解决 从设备中选择文件的代码如下所示 Intent intent new Intent Intent ACTION GET CONTENT intent setType in
  • android中listview显示数据库中的数据

    我是安卓新手 我想知道如何在列表视图中显示数据库中的数据 它不会向数据库添加数据 我只是显示我们存储在数据库中的任何内容 请帮助我实现这一目标 提前致谢 使用这些课程可能会对您有所帮助 用于数据库创建 package com example
  • 仅在单个端口 8080 上转发到本地主机(Windows)可能吗? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我知道如何在 Windows 上使用 xampp 设置本地网络服务器 我在主机文件 c windows system32 drivers etc ho
  • 如何使用应用程序接口将蓝牙套接字传递给另一个活动

    因此 根据我收集的信息 套接字连接既不可序列化 也不可分割 但我需要将蓝牙连接传递给另一个活动 我不想作为中间人编写服务 所以请不要将此作为解决方案发布 我听说有一种方法可以使用自定义应用程序接口来传递这些类型的对象 但我一生都找不到这样的
  • 如何验证文件名称在 Windows 中是否有效?

    是否有一个 Windows API 函数可以将字符串值传递给该函数 该函数将返回一个指示文件名是否有效的值 我需要验证文件名是否有效 并且我正在寻找一种简单的方法来完成此操作 而无需重新发明轮子 我正在直接使用 C 但针对的是 Win32
  • Glass 语音命令给定列表中最接近的匹配项

    使用 Glass 您可以通过 确定 Glass 菜单启动应用程序 它似乎会选择最接近的匹配项 除非命令相距数英里 并且您可以明显看到命令列表 无论如何 是否可以从应用程序内或从语音提示 在初始应用程序触发后 给出类似的列表并返回最接近的匹配
  • Windows 上的递归移动命令

    我需要做一个 sh 的 bat 副本 我不太了解 Windows cmd 在 Linux 上我可以做 mv or rsync a SOURCE DEST remove sent files ignore existing whole fil
  • 如何在 Android 上将动态 alpha 遮罩应用于文本

    I want to make a dynamic alpha mask with drawable shapes as circles or whatever and apply it to a drawed text on Android
  • 在 Nougat 7.1.1 中点击应用程序快捷方式时出现应用程序未安装错误

    我在向现有应用程序添加静态应用程序快捷方式时遇到一些问题 我按照以下步骤操作https developer android com guide topics ui shortcuts html https developer android
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https
  • Android AdMob:addView 在返回活动之前不会显示广告

    我正在尝试在游戏顶部添加横幅广告 我的活动使用带有自定义 SurfaceView 的relativelayout 我希望广告与 SurfaceView 重叠 广告会加载并可点击 但不会绘制到屏幕上 当我离开活动并返回时 会绘制广告 例如 通
  • 无法使用 wget 在 CentOS 机器上安装 oracle jdk

    我想在CentOS上安装oracle java jdk 8 我无法安装 java jdk 因为当我尝试使用命令安装 java jdk 时 root ADARSH PROD1 wget no cookies no check certific
  • 如何在布局编辑器中模拟沉浸式模式

    我想在布局编辑器中全屏查看我的布局 我正在使用 eclipse 插件 我已经通过选择隐藏了 ActionBar NoActionBar组合中的主题 但导航栏是一个不同的故事 AFAIK 它只能使用代码中的标志来隐藏 我需要在活动 xml 文

随机推荐

  • 医学图像配准软件 ANTs(Advanced Normalization Tools)的安装和使用说明

    本文是关于医学图像配准软件 ANTs Advanced Normalization Tools 的安装和使用说明 ANTs ANTs 是 Advanced Normalization Tools 的缩写 是基于 C 语言的一个医学图像处理的
  • 利用openslide-python处理病理

    参考 博客总结https www jianshu com p bd5b572b5269 官方文档 https openslide org api python module openslide 获取元信息 如每个像素有多少微米 import
  • 杭电ACM 第2036题

    include
  • Linux 定时备份mysql数据并同步到其他mysql服务器中

    备份还原操作 导出数据库 usr bin mysqldump u root pwd database gt database sql 导入数据库 mysql u root p database lt database sql 备份到压缩文件
  • Android 实现WebView

    activity main xml
  • Git首次提交代码到仓库步骤(资料)

    第一步 登陆码云 第二步 创建一个 新的项目 第三步 创建成功后到这个页面 Git 全局设置 git config global user name 意米 git config global user email 142453222851
  • 数据结构<1>时间复杂度详解和leetcode例题

    文章目录 什么是时间复杂度和空间复杂度 前言 算法效率 时间复杂度的计算 空间复杂度的计算 oj练习 什么是时间复杂度和空间复杂度 前言 算法效率 算法效率分析分为两种 第一种是时间效率 第二种是空间效率 时间效率被称为时间复杂度 而空间效
  • Java与WCF交互(一):Java客户端调用WCF服务

    第一步 生成WCF服务 新建WCF解决方案 分别添加三个项目 HelloTimeService 类库 HelloTimehost 控制台程序 HelloTimeClient 控制台程序 项目结构如图 各个项目的主要代码 service Ho
  • 无人机的基本知识

    一 无人机的定义 无人驾驶飞机是指由动力驱动 不搭载操作人员的一种空中飞行器 它依靠空气动力为飞行器提供升力 能够自主或遥控飞行 能携带多种任务设备 执行多种任务 可一次性或多次重复使用的无人驾驶航空器 简称无人机 Unmanned Aer
  • Java Web JSP开发模型

    看之前先点赞 1 JSP开发模型 为了方便使用JSP技术 SUN公司玮JSP技术提供了两种开发模型 JSP Mode1 和 JSP Mode2 JSP Mode1 JSP Mode2 我们将按照Model2思想来完成用户注册功能 1 创建项
  • LUA延时控制

    LUA延时控制 与C 交互实现 其它可参考方式 Lua封装延时执行函数 LUA的延时调用功能 Sleep Function 与C 交互实现 通过C 提供Sleep函数给LUA调用即可 可以任意实现 比如超过5秒再提示相应倒计时功能 if f
  • 听说你搞过架构设计?来,我这里有个系统设计一下...

    V xin ruyuan0330 获得600 页原创精品文章汇总PDF 目录 一 前情提示 二 选择性订阅部分核心数据 三 RabbitMQ的queue与exchange的绑定回顾 四 direct exchange实现消息路由 五 按需订
  • 【云原生

    目录 K8s 控制器 Replicaset 一 Replicaset 控制器 概念 原理解读 1 1 Replicaset 概述 1 2 Replicaset 工作原理 如何管理 Pod 二 Replicaset 资源清单文件编写技巧 三
  • centos 启用远程日志功能_CentOS7下搭建Rsyslog Server记录远程主机系统日志

    rsyslog是一个快速处理收集系统日志的开源程序 提供了高性能 安全功能和模块化设计 rsyslog 是syslog 的升级版 它将多种来源输入输出转换结果到目的地 rsyslog被广泛用于Linux系统以通过TCP UDP协议转发或接收
  • yaml数组解析_YAML详解

    1 YAML简介 YAML 即YAML Ain t Markup Language的缩写 YAML 是一种简洁的非标记语言 YAML以数据为中心 使用空白 缩进 分行组织数据 从而使得表示更加简洁易读 YAML的在线Demo这个YAML转化
  • 使用卷积神经网络(CNN)算法进行多变量时间序列预测的实战教程(Python)

    使用卷积神经网络 CNN 算法进行多变量时间序列预测的实战教程 Python 深度学习在多变量时间序列预测中展现了广泛的应用前景 其中卷积神经网络是最为经典的算法之一 本篇文章将通过一个实例 介绍如何使用卷积神经网络算法来预测交通流量情况
  • 21道常见Transformer面试题(GPT4帮你搞定)

    最近看到一篇关于Transfomer的面试题 写的挺好的 美中不足的是回答的有点简单 刚好我PLUS还没过期 就想着将问题放给无所不能的GPT4来解答 有什么问题欢迎留言私信我好及时修改 不能误人子弟嘿嘿 接下来一起瞧瞧吧 目录部分 按需查
  • Android学习之路3——数据库SQLite的使用以及Android申请权限

    Android学习之路3 数据库SQLite的使用以及Android申请权限 一 实验题目 数据存储 学习SQLite数据库的使用 学习ContentProvider的使用 复习Android的界面编程 二 实现内容 进入程序 可以选择单选
  • 【OpenCV】用Python进行缺陷检测和展示

    目录 OpenCV 使用Python进行缺陷检测和展示 图片数据预处理 展示检测结果 效果展示 完整代码如下 OpenCV 使用Python进行缺陷检测和展示 在工业生产中 为了保证产品质量 通常需要对生产线上的产品进行缺陷检测 在数字图像
  • Win 11 通过WSL 安装子系统Ubuntu 20.0.4 进行编译构建Android Aosp 源码

    Win 11 通过WSL 安装子系统Ubuntu 20 0 4 进行编译构建Android Aosp 源码 准备工作 win11 家庭版 通过WSL安装 虚拟子系统 ubuntu20 0 4 扩大挂载的虚拟硬盘 Swap 扩大处理 针对sw