AOSP 编译真机镜像与AVD镜像

news2024/12/29 10:50:01

硬件设备当然是配置越高越好,虚拟机编译至少需要16G内存+300G硬盘空间

配置环境

  1. Ubuntu 最好,安装方式网上一大堆,自行搜索,本文是基于 Ubuntu 22.04.3 LTS

  2. 更新&&配置

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get -u dist-upgrade
    sudo dpkg --configure -a
    sudo apt-get -f install
    
  3. 配置 git

    sudo apt-get install git -y
    git config --global user.name "your name"
    git config --global user.email "your mail"
    
  4. 安装 Python

    python --version
    # 如果有则不需要安装
    sudo apt-get install python
    # python 找不到,需要执行
    sudo ln -s /usr/bin/python3 /usr/bin/python
    
  5. 执行如下命令安装jdk8

    sudo apt-get install openjdk-8-jdk -y
    
  6. 执行如下命令安装依赖项。
    AOSP编译依赖很多库,而这些Ubuntu系统可能没有自带,我们需要提前安装,避免编译一半报错浪费时间。

    sudo apt-get install git git-core gnupg flex bison gperf zip unzip curl m4 ccache build-essential gcc-multilib g++-multilib tofrodos python-markdown xsltproc zlib1g-dev zlib1g-dev:i386 x11proto-core-dev libc6-dev-i386 lib32ncurses5-dev libx11-dev lib32z-dev libxml2-utils libnss-sss:i386 libssl-dev libx11-dev:i386 libreadline6-dev:i386 libgl1-mesa-dev libncurses5 libncurses5-dev:i386 -y
    
  7. Ubuntu默认不允许普通用户使用USB,所以还应该配置Android USB设备能够被当前用户访问到,则需要执行如下命令

    注意:执行该命令需要翻墙

    wget -S -O - http://source.android.com/source/51-android.rules | sed "s/<username>/$USER/" | sudo tee >/dev/null /etc/udev/rules.d/51-android.rules; sudo udevadm control --reload-rules
    

    国内用户可执行如下命令

    wget -S -O - http://yunpstatic.oss-cn-beijing.aliyuncs.com/res/android/source/51-android.txt | sed "s/<username>/$USER/" | sudo tee >/dev/null /etc/udev/rules.d/51-android.rules; sudo udevadm control --reload-rules
    
  8. 装个看CPU、内存、缓存的htop

    sudo apt install htop -y
    

配置清华镜像

因为国外地址可能访问不了或者访问速度慢,我们需要添加国内数据源:

  1. 打开源列表

    sudo gedit /etc/apt/sources.list1
    
  2. 把清华源复制到源列表,之前的源不要动

    # tsinghua start
    deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
    deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted universe multiverse
    deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
    deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted universe multiverse
    deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
    deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse
    deb https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
    deb-src https://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted universe multiverse
    # tsinghua end
    
  3. 保存之后更新源

    sudo apt-get update
    sudo apt-get upgrade
    

下载源码

在线下载

  1. 安装repo工具

    mkdir ~/bin
    PATH=~/bin:$PATH
    
    curl https://storage.googleapis.com/git-repo-downloads/repo > ~/bin/repo
    #清华 repo
    # curl https://mirrors.tuna.tsinghua.edu.cn/git/git-repo > ~/bin/repo
    
    chmod a+x ~/bin/repo
    
  2. 下载AOSP源码

    #创建并初始化aosp仓库目录
    mkdir aosp
    cd aosp
    # -b android-13.0.0_r43 选择分支
    repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-13.0.0_r43 --repo-url=https://gerrit-googlesource.lug.ustc.edu.cn/git-repo
    # 下载失败执行
    # repo init -u https://aosp.tuna.tsinghua.edu.cn/platform/manifest -b android-13.0.0_r43
    
    #同步代码
    repo sync
    #如果你的机器足够好,可以指定更多的任务,如下命令演示使用8个任务同步代码
    repo sync -j8
    
    #推荐:后台去同步,ssh断开也没事。
    nohup repo sync -j8 >&sync.log &
    
    #如果 nohup 运行出错,可尝试如下方式
    #后台运行(关闭终端会停止)
    $repo sync -j8 >&sync.log &
    [1] 2074542
    # 找到后台的 job
    $ jobs
    [1]-  Running                 repo sync -j8 >&sync.log &
    # 当退出会话时,并不会终止被移除的 job
    $ disown %1
    
    # Tips:下载过程可能出现某些project找不到,可能是镜像问题,也可能是网的问题,
    # 试试可以单独同步该项目,支持-jN参数,-j4如:
    repo sync -j4 -c platform/frameworks/layoutlib
    

预下载包的方式

  1. 在windows或者Linux上面通过迅雷下载 aosp-latest.tar

     #下载初始化包
    wget -c https://mirrors.tuna.tsinghua.edu.cn/aosp-monthly/aosp-latest.tar
    
  2. 解压预下载包

    # cd AOSP->解压得到的 AOSP 工程目录,这时 ls 的话什么也看不到,因为只有一个隐藏的 .repo 目录
    tar xf aosp-latest.tar
    
  3. 查看分支信息

    cd .repo/manifests 
    git branch -a
    
  4. 同步代码

    repo init -b android-13.0.0_r43
    repo sync # 正常同步一遍即可得到完整目录
    

下载驱动

  1. 根据机型查看可刷对应 android 版本的分支和 Build 号
    https://source.android.com/docs/setup/about/build-numbers?hl=zh-cn#source-code-tags-and-builds

  2. 根据 build 号选择对应设备的驱动
    https://developers.google.com/android/drivers?hl=zh-cn

  3. 将驱动文件下载并解压

    # 下载 pixel 6 驱动
    wget https://dl.google.com/dl/android/aosp/google_devices-oriole-tq2a.230505.002-9d23e4ab.tgz
    #解压
    tar xf google_devices-oriole-tq2a.230505.002-9d23e4ab.tgz
    # 解压后得到 extract-google_devices-oriole.sh 脚本
    # 切换到 android 源码 根目录 执行脚本,会将对应驱动 copy 到相应的 vendor 目录
    ./extract-google_devices-oriole.sh
    

下载内核

aosp 不包含内核代码,有需要可以单独下载,版本有很多,如:
# common → 通用linux内核、goldfish → Android模拟器内核、msm → 高通MSM芯片
mkdir kernel
cd kernel
git clone https://android.googlesource.com/kernel/goldfish
# 清华镜像
# git clone https://aosp.tuna.tsinghua.edu.cn/kernel/goldfish.git
cd goldfish
# 可以查看有哪些内核版本分支可以下载
git branch -a
# 下载对应版本内核代码
git checkout remotes/origin/android-goldfish-3.18
注:如需编译内核自行搜索

编译 AOSP

初始化编译环境,源码整编

编译目标的格式:BUILD-BUILDTYPE,比如上面的aosp_x86_64-eng的BUILD是aosp_x86_64,BUILDTYPE是eng。
BUILD指的是特定功能的组合的特定名称,即表示编译出的镜像可以运行在什么环境。
其中,aosp(Android Open Source Project)代表Android开源项目;arm表示系统是运行在arm架构的处理器上,arm64则是指64位arm架构处理器,x86则表示x86架构的处理器。
BUILD TYPE则指的是编译类型,通常有三种:
 	-user:代表这是编译出的系统镜像是可以用来正式发布到市场的版本,其权限是被限制的(如,没有root权限,不能dedug等)
	-userdebug:在user版本的基础上开放了root权限和debug权限。
	-eng:代表engineer,也就是所谓的开发工程师的版本,拥有最大的权限(root等),此外还附带了许多debug工具。
source build/envsetup.sh

# ② 删除out与中间文件,clean会删除本次设置生成的、clobber会删除所有配置生成的
make clobber

# 运行 lunch 后选择目标产物
# 也可以直接指定编译目标,如:lunch aosp_oriole-userdebug
# 还可以直接用序号,如:lunch 8,但不建议,因为不同的系统版本序号对应可能有偏差~
# ③ 选择编译目标,下述命令会进入菜单,选择相应的版本,输入序号回车
# 编译目标都采用 BUILD-BUILDTYPE 形式,BUILD 表示特定功能代号,BUILDTYPE是以下类型之一:
# user → 权限受限、适用于生产环境,没root权限,不能debug,adb默认处于停用状态;
# userdebug → 与user类似,但具备root权限和debug权限,一般用于调试真机。
# eng → 具有额外调试工具的开发配置,拥有最大的权限(root等),一般用于模拟器。
# 编译目标示例 → Pixel 3a XL的编译目标 → aosp_bonito-userdebug
lunch aosp_x86_64-eng

# ③ 开始编译,后面的-jN参数用来设置编译的并行任务数,CPU核心数为6,N值最好选6-12间
# 根据自己CPU核心数动态修改
make -j6

# 也可以把输出结果打印到log文件中:
make -j6 2>&1 | tee make_build.log

# 编译成功后会生成out目录,比如这里的:~/aosp/out/target/product/bonito

 #推荐这个命令,后台运行。
 # 参考 https://blog.csdn.net/qq_33215865/article/details/88075462
nohup make -j6 >& make_build.log &

#如果 nohup 运行出错,可尝试如下方式
#后台运行(关闭终端会停止)
$make >& make.log &
[2] 2074542
# 找到后台的 job
$ jobs
[2]-  Running                 make &> make.log &
# 当退出会话时,并不会终止被移除的 job
$ disown %2

源码单编

整编一般会耗费几小时,有时可能只是修改了其中某个应用模块,只需单独编译这个模块,以设置模块为例:

source build/envsetup.sh

lunch aosp_x86_64-eng
# 进入模块目录
cd package/apps/Setting

# 编译单独模块的可选指令如下:
# mm → 编译当前目录下的模块,不编译依赖模块
# mmm → 编译指定目录下的模块,不编译依赖模块
# mma → 编译当前目录下的模块及其依赖项
# mmmma → 编译指定路径下所有模块,切包含依赖
mm

# 编译成功会提示生成文件的存放路径,除了生成Setting.odex外,还会在
# priv-app/Settings目录下生成Settings.apk,可直接 adb push 或 adb install
# 安装APK验证效果,也可以使用 make snod 命令重新打包生成 system.img,运行模拟器查看

编译 AVD (Android 虚拟机镜像)

需要先全量编译一次,直接编译 make emu_img_zip 最后会报 data 目录找不到错误
# 全量编译
source build/envsetup.sh
lunch sdk_pc_x86_64-userdebug
make clobber
make >& make-sdk_pc_x86_64-userdebug.log &

# 加上 emu_img_zip  再次增量编译(很快)
source build/envsetup.sh
lunch sdk_pc_x86_64-userdebug
make emu_img_zip >& emu_img_zip.log &

编译产物镜像打包

真机镜像打包

真机(piexl6)需要的镜像文件如下:
android-info.txt pvmfw.img system_other.img vendor.img
boot.img super_empty.img vbmeta.img vendor_boot.img
dtbo.img system.img vbmeta_system.img vendor_dlkm.img
product.img system_ext.img vbmeta_vendor.img(可能没有)

zip pixel6-img.zip android-info.txt pvmfw.img system_other.img vendor.img boot.img super_empty.img vbmeta.img vendor_boot.img dtbo.img system.img vbmeta_system.img vendor_dlkm.img product.img system_ext.img vbmeta_vendor.img

AVD 镜像打包

编译完会在生成 out\target\product\emulator64_x86_64\sdk-repo-linux-system-images-eng.zip
直接复制解压,替换 AVD 原有镜像

  1. 替换android-sdk\system-images\android-33\google_apis 下的整个 x86_64
  2. 替换后先 wipe data
    在这里插入图片描述
  3. 然后在 cold boot now
    在这里插入图片描述

增量编译完也可以复制相应的镜像进行替换

  1. avd-镜像全 copy

    tar czvf avd-img.tar.gz ./data/* advancedFeatures.ini system/build.prop encryptionkey.img kernel-ranchu ramdisk.img system.img system-qemu.img userdata.img vendor.img vendor-qemu.img VerifiedBootParams.textproto >& tar-avd.log
    
  2. AVD 需要替换的镜像:
    system-qemu.img(替换 system.img), vender-qemu.img(替换 vender.img)
    ramdisk.img,kernel-ranchu,system/build.prop

    tar czvf avd-img.tar.gz system-qemu.img vender-qemu.img ramdisk.img kernel-ranchu system/build.prop
    
  3. 进入AVD manger,刚才创建或者替换好的 AVD,先 Wipe Data 一下,然后 Cold Boot。

repo 切换分支

cd .repo/manifests
# 查看当前分支
repo info
# 切换分支
repo init -b android-13.0.0_r43
# 同步代码
repo sync
# 可已选择后台执行
$repo sync >& sync_13_r43.log &
$jobs
[1]+  Running                 repo sync &> sync_13_r43.log &
$disown %1

Pixel 6 编译配置

Android 版本:android-13.0.0_r43
Pixel 6 对应驱动级镜像
BuildID:TQ2A.230505.002
Pixel 6 驱动:https://dl.google.com/dl/android/aosp/google_devices-oriole-tq2a.230505.002-9d23e4ab.tgz
原厂镜像:https://dl.google.com/dl/android/aosp/oriole-tq2a.230505.002-factory-6294af63.zip

source build/envsetup.sh 
lunch aosp_oriole-userdebug
make clobber
make >& make-aosp_oriole-userdebug.log &

编译产物打包后,替换原厂镜像 image-oriole-tq2a.230505.002 中的相关文件,然后刷机即可

# 在镜像目录文件夹中
# 进入 bootloader 模式
adb reboot bootloader

# 如果没有 unlock 的话,先解锁
fastboot flashing unlock

# 执行刷机 或者 flash-all.sh
flash-all.bat

参考文献

  1. Android模拟器中替换库和img
  2. 回滚机制降级
  3. 安装原始设备制造商 (OEM) USB 驱动程序
  4. Nexus 和 Pixel 设备的出厂映像 和刷机方法
  5. 详细的android目录说明
  6. 镜像文件说明

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

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

相关文章

云服务器搭建Zookeeper集群

文章目录 1.集群配置2.zookeeper的群起脚本3. Zookeeper节点的创建和删除相关4. Zookeeper的选举机制 1.集群配置 Zookeeper的集群个数最好保证是奇数个数&#xff0c;因为Zookeeper的选举过程有一个“半数机制”。 5台服务器&#xff0c;可以设置Zookeeper的集群为3或者5&…

世界前沿技术发展报告2023《世界航空技术发展报告》(二)军用飞机技术

&#xff08;二&#xff09;军用飞机技术 1.作战飞机1.1 美俄对第五代战斗机进行升级改进1.2 美欧第六代战斗机技术取得新进展1.3 美国B-21隐身轰炸机正式亮相 2.支援飞机2.1 美国空军拟研制翼身融合布局运输/加油机2.2 美欧厂商积极参加北约未来预警机技术研究项目2.3 美国空军…

FPGA时序分析与约束(7)——通过Tcl扩展SDC

一、概述 术语“Synopsys公司设计约束”&#xff08;又名SDC&#xff0c;Synopsys Design Constraints&#xff09;用于描述对时序、功率和面积的设计要求&#xff0c;是EDA工具中用于综合、STA和布局布线最常用的格式。本文介绍时序约束的历史概要和SDC的描述。 二、时序约束…

【计算机网络】TCP协议

文章目录 1. TCP报文的结构2. TCP的发送缓冲区和接收缓冲区3. 确保可靠性序列号和确认序列号确认应答超时重传连接管理1️⃣三次握手建立连接2️⃣四次挥手断开连接 4. 提高性能流量控制滑动窗口拥塞控制延迟应答捎带应答 5. 面向字节流6. TCP/UDP对比 概念&#xff1a;TCP&…

threejs(7)-精通粒子特效

一、初识Points与点材质 // 设置点材质 const pointsMaterial new THREE.PointsMaterial(); import * as THREE from "three"; // 导入轨道控制器 import { OrbitControls } from "three/examples/jsm/controls/OrbitControls"; // 导入动画库 import gsa…

854算法之线性表

周小伦说的建议王道的所有算法题最好都写一下啊&#xff0c;尤其是树的&#xff0c;排序相关的要写一下&#xff0c;然后还有链表&#xff0c;链表有一些反转链表啊一些经典的代码肯定要背的呀&#xff0c;比如说&#xff0c;三种遍历的递归和非递归&#xff0c;怎么找树的宽度…

【C程序设计】用心浇灌<C程序>

目录 数据类型 整数类型 实例 浮点类型 void 类型 类型转换 数据类型 在 C 语言中&#xff0c;数据类型指的是用于声明不同类型的变量或函数的一个广泛的系统。变量的类型决定了变量存储占用的空间&#xff0c;以及如何解释存储的位模式。 C 中的类型可分为以下几种&…

服务端推送、 server sent event、sse、springboot+sse

SSE(server-sent events) SSE全称server-sent events&#xff0c;翻译过来是服务端发送事件&#xff0c;通常的http请求&#xff0c;客户端请求&#xff0c;服务端返回响应&#xff0c;一次只能返回一个值&#xff1b;SSE使用的http协议&#xff0c;客户端请求后&#xff0c;服…

bbr 的 “最优操作点”

最近做一组测试&#xff0c;我复现了一组结果准备阐释另一个事。先看这个测试结果&#xff1a; 常规的一个 wrk2(expected_latency_timing 改为 actual_latency_timing 计数) 压 nginx 的测试&#xff0c;调整 -R 参数&#xff0c;Req/sec 同步增加&#xff0c;当 Req/sec 不…

(免费领源码) Asp.Net#SQL Server校园在线投票系统10557-计算机毕业设计项目选题推荐

摘 要 随着互联网大趋势的到来&#xff0c;社会的方方面面&#xff0c;各行各业都在考虑利用互联网作为媒介将自己的信息更及时有效地推广出去&#xff0c;而其中最好的方式就是建立网络管理系统&#xff0c;并对其进行信息管理。由于现在网络的发达&#xff0c;校园投票通过网…

液氮恒温器主要特点

恒温器是直接或间接控制一个或多个热源和冷源来维持所要求的温度的一种装置。 主要特点 更宽温区&#xff1a;液氮恒温器的温区宽度扩展到了80K~500K&#xff0c;为液氮温区实验用户提供更宽温区解决方案。 操作更简单&#xff1a;液氮恒温器在样品更换、液氮填充、控制液氮…

UI自动化概念 + Web自动化测试框架介绍

1.UI自动化测试概念:我们先明确什么是UI UI&#xff0c;即(User Interface简称UI用户界面)是系统和用户之间进行交互和信息交换的媒介 UI自动化测试: Web自动化测试和移动自动化测试都属于UI自动化测试&#xff0c;UI自动化测试就是借助自动化工具对程序UI层进行自动化的测试 …

【分享】RAR压缩包的密码可以取消吗?

在日常工作中&#xff0c;我们可能经常用到RAR文件&#xff0c;RAR作为一种常见的压缩文件格式&#xff0c;可以将一个或多个文件压缩成单个文件&#xff0c;方便传输和保存。 RAR文件还可以设置“打开密码”&#xff0c;这样只有输入正确的密码才能打开压缩包里面的文件&…

SpringBoot 快速实现 api 加密

在项目中&#xff0c;为了保证数据的安全&#xff0c;我们常常会对传递的数据进行加密。常用的加密算法包括对称加密&#xff08;AES&#xff09;和非对称加密&#xff08;RSA&#xff09;&#xff0c;博主选取码云上最简单的API加密项目进行下面的讲解。 下面请出我们的最亮的…

5 个编写高效 Makefile 文件的最佳实践

在软件开发过程中&#xff0c;Makefile是一个非常重要的工具&#xff0c;它可以帮助我们自动化构建、编译、测试和部署。然而&#xff0c;编写高效的Makefile文件并不是一件容易的事情。在本文中&#xff0c;我们将讨论如何编写高效的Makefile文件&#xff0c;以提高我们的开发…

【Bug——VMware Workstation】虚拟机桥接网络没有 VMnet0

此时 没有VMnet0用来桥接网络。 接下来进行解决 1.找到安装VM的路径&#xff0c;在安装的目录里面找到如图所示的三个文件&#xff1a; 2.依次点击鼠标右键 将这三个文件依次安装如图所示&#xff1a; 二.windows下的操作 1.首先 找到电脑的控制面板->网络和internet->…

二维码智慧门牌管理系统升级解决方案:采集计划精细化管理的艺术

文章目录 前言一、采集计划的定义和配置流程二、多采集计划配置策略三、采集计划的实践应用 前言 在数字化时代&#xff0c;建设智慧城市需要借助各种先进的技术工具。其中&#xff0c;二维码智慧门牌管理系统在城市管理、资源调配和公众服务等方面扮演着举足轻重的角色。关键…

不容错过的Spring框架解析,掌握开发中的关键技术

Spring 原理 它是一个全面的、企业应用开发一站式的解决方案&#xff0c;贯穿表现层、业务层、持久层。但是 Spring仍然可以和其他的框架无缝整合。 Spring 特点 轻量级 控制反转 面向切面 容器 框架集合 Spring特征 Spring 核心组件 Spring 常用模块 Spring 主要包 Spring …

Self-Supervised MultiModal Versatile Networks

方法 视觉-音频空间S v a _{va} va​&#xff0c;嵌入z v , v a t _{v,vat} v,vat​ 体会 一篇文章只有一张图&#xff0c;笑死人。作者且未回复问题

体育竞技分析

体育竞技分析是一项重要的工作&#xff0c;它通过对运动员的数据进行收集、处理和分析&#xff0c;可以帮助教练和球队做出更明智的决策。Python作为一种强大的编程语言&#xff0c;提供了丰富的库和工具&#xff0c;可以用于体育竞技数据的分析和可视化。本文将介绍如何使用Py…