配置Cuttlefish 虚拟 Android 设备

google 参考资料:

https://source.android.com/docs/setup/start?hl=zh-cn

https://source.android.com/docs/devices/cuttlefish/get-started?hl=zh-cn

Cuttlefish 开始

验证 KVM 可用性

Cuttlefish 是一种虚拟设备,依赖于宿主机上可用的虚拟化。

在宿主机上的终端中,确保可以在基于内核的虚拟机 (KVM) 上实现虚拟化:

grep -c -w "vmx\|svm" /proc/cpuinfo

此命令应返回一个非零值。

注意:在云端设备上,您可能需要按照特定于云端或特定于供应商的步骤来启用 KVM。对于 Google Compute Engine (GCE),请参阅嵌套虚拟化简介。

在 ARM 机器上运行时,最直接的方法就是检查 /dev/kvm

find /dev -name kvm

提示:您可以使用此命令来确认是否任何环境都支持 KVM。


启动 Cuttlefish

  1. 在终端窗口中,下载、构建并安装主机 Debian 软件包:

    $sudo apt install -y git devscripts equivs config-package-dev debhelper-compat golang curl
    $git clone https://github.com/google/android-cuttlefish
    $cd android-cuttlefish
    $for dir in base frontend; dopushd $dir# Install build dependenciessudo mk-build-deps -idpkg-buildpackage -uc -uspopd
    done
    $sudo dpkg -i ./cuttlefish-base_*_*64.deb || sudo apt-get install -f
    sudo dpkg -i ./cuttlefish-user_*_*64.deb || sudo apt-get install -f
    sudo usermod -aG kvm,cvdnetwork,render $USER
    sudo reboot
    

    重新启动操作会触发安装其他内核模块,并会应用 udev 规则。

  2. Cuttlefish 是 Android 开源平台 (AOSP) 的一部分。您可以在 Android 持续集成网站上找到虚拟设备的 build。如需查找所有 Android build 的索引,请前往 Android 持续集成网站:http://ci.android.com/。

  3. 输入分支名称。使用默认的 aosp-main 分支,或者使用通用系统映像 (GSI) 分支,例如 aosp-android13-gsi

  4. 前往 aosp_cf_x86_64_phone build 目标,然后点击 userdebug 以获取最新 build。

    提示:对于 ARM,请使用分支 aosp-main-throttled 和设备目标 aosp_cf_arm64_only_phone-trunk_staging-userdebug

  5. 点击 userdebug 下方的绿色框,以选择此 build。页面会显示 Details 面板,其中包含特定于此 build 的更多信息。在此面板中点击 Artifacts,即可查看附加到此 build 的所有工件的列表。

  6. 在“Artifacts”面板中,下载 Cuttlefish 的工件。

    1. 点击 aosp_cf_x86_64_phone-img-xxxxxx.zip 工件,该工件中包含设备映像。在文件名中,“xxxxxx”是此设备的 build ID。

    2. 在面板中向下滚动,然后下载 cvd-host_package.tar.gz。请务必从与映像相同的 build 中下载主机软件包。

  7. 在本地系统上,创建一个容器文件夹并解压软件包:

    $mkdir cf
    $cd cf
    $tar -xvf /path/to/cvd-host_package.tar.gz
    $unzip /path/to/aosp_cf_x86_64_phone-img-xxxxxx.zip
  8. 启动 Cuttlefish:

    HOME=$PWD ./bin/launch_cvd --daemon
    

验证 Cuttlefish 是否可通过 adb 显示

与实体设备类似,Cuttlefish 可通过 Android 调试桥 (adb) 显示。

在您启动 Cuttlefish 的同一文件夹中,运行以下命令,以便查看宿主机上通过 adb 显示的所有 Android 设备的列表:

./bin/adb devices

在网络中查看虚拟设备并与之互动

默认情况下,Cuttlefish 使用 --start_webrtc 进行启动。此代码通过宿主机上的端口 8443 支持 WebView。

如需查看虚拟设备并与之交互,请在网络浏览器中进入 https://localhost:8443

如需了解详情,请参阅 Cuttlefish:WebRTC 流式传输。

停止 Cuttlefish

请在您用于启动设备的同一目录内停止虚拟设备:

HOME=$PWD ./bin/stop_cvd

AOSP代码下载

$repo init -u https://android.googlesource.com/platform/manifest -b master --partial-clone --clone-filter=blob:limit=10M
或者
$repo init -u https://android.googlesource.com/platform/manifest -b master --partial-clone$repo sync -c --no-tags -j8

AOSP代码编译Cuttlefish

Cuttlefish编译: 
$source build/envsetup.sh 
$lunch aosp_cf_x86_64_phone-trunk_staging-userdebug 
$m 

启动自己编译的 Cuttlefish

启动 Cuttlefish:

$launch_cvd --daemon

在网络浏览器中前往 https://localhost:8443,以连接到 Cuttlefish 设备。您会看到刚刚构建的 Android 设备的视频串流。

更改

按照以下示例更改列表更新源代码。

  1. 从检出分支的根目录(aosp/ 目录)导航至 frameworks/native Git 项目:

    cd frameworks/native
    
  2. 使用以下命令启动临时项目:

    repo start <some-name> .
    
  3. 修改位于以下位置的 SurfaceFlinger.cpp,以纳入更改列表中的更新:

    aosp/frameworks/native/services/surfaceflinger/SurfaceFlinger.cpp
    
  4. 找到以下行:

    onCompositionPresented(pacesetterId, frameTargeters, presentTime);
    
  5. 将这两行代码替换为以下内容:

    onCompositionPresented(pacesetterId, frameTargeters, presentTime);
    mClientColorMatrix = mat4(vec4{1.0f, 0.0f, 0.0f, 0.0f}, vec4{0.0f, -1.0f, 0.0f, 0.0f},vec4{0.0f, 0.0f, -1.0f, 0.0f}, vec4{0.0f, 1.0f, 1.0f, 1.0f});
    updateColorMatrixLocked();
    
  6. 构建代码:

    m
    
  7. 在设备上更新 build:

    adb root
    adb remount
    adb sync
    adb reboot
    

验证您是否在所选设备上看到类似于图 1 的颜色变化。

图 1. 成功更改颜色之后的屏幕外观

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Laravel 使用Excel导出的文件中,指定列数据格式为日期,方便后期的数据筛选操作

背景 最近&#xff0c;后台运营人员要求导出的 Excel 文件&#xff0c; 要求能够满足对于 [下单日期] 的筛选操作&#xff0c;即满足在年份、月份上的选择 通过了解&#xff0c;发现&#xff1a; 先前导出的文件&#xff0c;默认列数据都是字符串&#xff08;文本&#xff09;格…

bia文件中码偏差对实时PPP解算分析

1. 码偏差对定位影响 码偏差对未知收敛时间有影响&#xff0c;对最终精度影响不大&#xff08;权比1000:1&#xff09;

前端工程化14-git merge 以及 git rebase。

rebase会把当前分支的 commit 放到公共分支的最后面,所以叫变基。就好像从公共分支又重新拉出来这个分支一样。 举例&#xff1a; 如果从 master 拉个feature分支出来,然后提交了几个 commit,这个时候刚好有人把他开发的东西合并到 master 了,这个时候 master 就比你拉分支的…

【Hot100】LeetCode—295. 数据流的中位数

目录 1- 思路① 添加元素实现② 计算实现 2- 实现⭐295. 数据流的中位数——题解思路 原题链接&#xff1a;295. 数据流的中位数 1- 思路 利用优先级队列实现一个大顶堆和一个小顶堆大顶堆用来存放较小的元素&#xff0c;小顶堆用来存放较大的元素 ① 添加元素实现 如果当前…

JVM知识总结(双亲委派机制)

文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 文章收录在网站&#xff1a;http://hardyfish.top/ 双亲委派机制 双亲委派类加载过程 当App尝试加载一个类时&#x…

haproxy基础

HAProxy (High Availability Proxy) 是一款强大的开源负载均衡器和代理服务器。它主要用于提高 Web 应用程序和服务的可用性和性能。HAProxy 可以在 TCP 和 HTTP 层面上工作&#xff0c;并且支持多种负载均衡算法&#xff0c;广泛应用于高流量网站和大型分布式系统中。 社区版…

【数学建模】简单的优化模型-6 血管分支

背景&#xff1a;机体提供能量维持血液在血管中的流动&#xff0c;给血管壁以营养&#xff1b;克服血液流动的阻力&#xff0c;能量消耗与血管的几何形状有关。在长期进化中动物血管的几何形状已经在能量消耗最小原则下达到最优化。 问题&#xff1a;在能量消耗最小原则下&…

现代卷积神经网络

经典的CNN架构 一、早期的CNN架构 LeNet LeNet&#xff0c;&#xff08;也称为LeNet-5&#xff0c;5代表使用了2个卷积层和3个全连接层&#xff09;是一个经典的卷积神经网络架构&#xff0c;最初由Yann LeCun等人开发用于MNIST数据集手写数字&#xff08;灰度图像 输入通道…

nuPlan环境配置和开环及闭环评测

环境配置 下载nuplan mini 数据集 nuPlan Maps nuPlan Mini Split 解压并按照制定目录结构存储 ./nuplan/ |-- maps -- nuplan-v1.1-- splits-- mini为了不修改代码, 需软链目录 ln -s ./nuplan /data/sets/ 下载nuplan镜像 docker pull horizonrobotics/nuplan:cuda11.8.0…

Golang | Leetcode Golang题解之第327题区间和的个数

题目&#xff1a; 题解&#xff1a; func countRangeSum(nums []int, lower, upper int) int {var mergeCount func([]int) intmergeCount func(arr []int) int {n : len(arr)if n < 1 {return 0}n1 : append([]int(nil), arr[:n/2]...)n2 : append([]int(nil), arr[n/2:]…

Flink 实时数仓(八)【DWS 层搭建(二)流量域、用户域、交易域搭建】

前言 今天的任务是完成流量域最后一个需求、用户域的两个需求以及交易域的部分需求&#xff1b; 1、流量域页面浏览各窗口汇总表 任务&#xff1a;从 Kafka 页面日志主题读取数据&#xff0c;统计当日的首页和商品详情页独立访客数。 注意&#xff1a;一般我们谈到访客&…

H264基本原理

文章目录 引子 - 为什么要视频压缩I、 P、 B帧GOP图像序列H264编码介绍其它为什么视频格式一般为YUVH264 画质级别 参考资料 引子 - 为什么要视频压缩 一张为720x480的图像&#xff0c;用YUV420P的格式来表示&#xff0c; 其大小为&#xff1a; 720 * 480 * 1.5 约等于0.5MB。…

【深度学习与NLP】——注意力机制

1 注意力机制 1.1 学习目标 了解什么是注意力计算规则以及常见的计算规则.了解什么是注意力机制及其作用.掌握注意力机制的实现步骤. 什么是注意力: 我们观察事物时&#xff0c;之所以能够快速判断一种事物(当然允许判断是错误的), 是因为我们大脑能够很快把注意力放在事物最具…

使用Python和Flask构建简单的RESTful API

目录 环境准备 创建Flask应用 运行Flask应用 扩展功能&#xff1a;处理POST请求 注意事项 在Web开发中&#xff0c;RESTful API是一种广泛使用的架构风格&#xff0c;它允许客户端和服务器之间通过HTTP请求进行通信。Python的Flask框架以其轻量级和易于上手的特点&#xf…

XML动态sql查询当前时间之前的信息报错

如图&#xff0c;sql语句在数据库里可以正常运行但是再XML文件不可以正常运行&#xff0c;报错。 原因&#xff1a;在XML中小于号"<"是会被默认认定成文一个标签的开始&#xff0c;所以用小于号就会报错。 解决办法&#xff1a; 1.把表达式反过来改成大于号 2…

linux 源码部署polardb-x 错误汇总

前言 在linux 源码部署polardb-x 遇到不少错误&#xff0c;特在此做个汇总。 问题列表 CN 启动报错 Failed to init new TCP 详细错误如下 Caused by: Failed to init new TCP. XClientPool to my_polarx#267b21d8127.0.0.1:33660 now 0 TCP(0 aging), 0 sessions(0 runni…

MySQL的字符集配置

MySQL的字符集配置 创建database创建表插入数据查看字符集配置查看字符集的比较规则关于字符集的配置总结 创建database create database dbtest1; show databases;use dbtest1;创建表 create table employees(id int,name varchar(15));插入数据 insert into employees valu…

PDF转换器推荐:轻松将图片批量转为PDF

高质量的图片与文档管理已经逐渐成为了我们日常工作中不可或缺的一部分。为了防止图片在传输的过程中被压缩&#xff0c;我经常将他们转换为PDF格式。这次我给你推荐几个我常用的图片转PDF的小工具吧。 1.福昕PDF转换大师 链接一下>>https://www.pdf365.cn/pdf2word/ …

牛客JS题(三十二)Proxy计数器

注释很详细&#xff0c;直接上代码 涉及知识点&#xff1a; Proxy的基础使用set、deleteProperty及deleteProperty用法 题干&#xff1a; 我的答案 <!DOCTYPE html> <html><head><meta charsetutf-8></head><body><script type"t…

【C++】类和对象 ——中

1. 赋值运算符重载 1.1 运算符重载 • 当运算符被⽤于类类型的对象时&#xff0c;C语⾔允许我们通过运算符重载的形式指定新的含义。C规定类类型对象使⽤运算符时&#xff0c;必须转换成调⽤对应运算符重载&#xff0c;若没有对应的运算符重载&#xff0c;则会编译报错。 •…