配置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; do
       pushd $dir
       # Install build dependencies
       sudo mk-build-deps -i
       dpkg-buildpackage -uc -us
       popd
    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:

    bash 复制代码
    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. 找到以下行:

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

    bash 复制代码
    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. 成功更改颜色之后的屏幕外观

相关推荐
Wgllss1 小时前
雷电雨效果:Kotlin+Compose+协程+Flow 实现天气UI
android·架构·android jetpack
用户207038619493 小时前
Compose 可点击文本:ClickableText Compose 中的 ClickableSpan
android
常利兵3 小时前
Kotlin作用域函数全解:run/with/apply/let/also与this/it的魔法对决
android·开发语言·kotlin
幼稚园的山代王3 小时前
Kotlin-基础语法练习一
android·开发语言·kotlin
闻不多3 小时前
用llamaindex搭建GAR遇到400
android·运维·服务器
阿华的代码王国3 小时前
【Android】适配器与外部事件的交互
android·xml·java·前端·后端·交互
跨界混迹车辆网的Android工程师4 小时前
实现Android图片手势缩放功能的完整自定义View方案,结合了多种手势交互功能
android·交互
wyjcxyyy4 小时前
打靶日记-PHPSerialize
android
安卓开发者15 小时前
Android RxJava 组合操作符实战:优雅处理多数据源
android·rxjava
阿华的代码王国15 小时前
【Android】RecyclerView复用CheckBox的异常状态
android·xml·java·前端·后端