使用 Cuttlefish 虚拟 Android 设备
什么是 Cuttlefish?
cuttlefish?是一種可配置的虛擬 Android 設備,既可以遠程運行(使用第三方云產品,如 Google Cloud Engine),又可以在本地運行(在 Linux x86 機器上)。
Cuttlefish 的目標
- 使平臺和應用開發者不再依賴于物理硬件來開發和驗證代碼更改。
- 通過與核心框架保持高度一致,以高保真度為重點來復制真實設備的基于框架的行為。
- 支持 API 級別 28 之后的所有 API 級別。
- 在各個 API 級別達到一致的功能水平,與物理硬件上的行為保持一致。
-
實現規模化:
- 能夠并行運行多臺設備。
- 能夠并發執行測試,實現高保真度且入門成本較低。
-
提供可配置的設備,能夠調整設備類型、RAM、CPU 等。
Cuttlefish 與其他設備的對比情況
Cuttlefish 和 Android 模擬器
Cuttlefish 與?有許多相似之處,但 Cuttlefish 可以保證 Android 框架(無論這是純 AOSP,還是您自己的樹中的自定義實現)實現全保真。在實際應用中,這意味著 Cuttlefish 應該會在操作系統級別響應您的互動,就像使用相同的自定義或純 Android 操作系統源代碼構建的實體手機目標一樣。
Android 模擬器圍繞簡化應用開發的用例構建而成,它包含許多功能鉤子來迎合 Android 應用開發者的用例。如果您要使用您的自定義 Android 框架來構建模擬器,這可能會帶來一些挑戰。如果您需要能夠代表您的自定義平臺/框架代碼或 Android 樹形結構的虛擬設備,那么 Cuttlefish 虛擬設備是理想的選擇。它是用于表示當前 AOSP 開發狀態的規范設備。
Cuttlefish 和物理設備
Cuttlefish 虛擬設備與物理設備之間的主要區別在于硬件抽象層 (HAL) 級別,以及與任何自定義硬件互動的任何軟件。除了硬件專用實現之外,您應該會發現 Cuttlefish 和物理設備表現出在功能上等效的行為。
Cuttlefish 有哪些益處?
您可以像與任何可能用于調試的其他 Android 設備互動一樣與 Cuttlefish 互動。它會通過 adb 將自身注冊為正常設備,您可以像與物理設備互動一樣通過遠程桌面與之互動。Cuttlefish 的用例非常廣泛,涵蓋應用測試、自定義系統構建測試等。
由于 Cuttlefish 力求實現框架全保真,因此可用于對您的框架和/或應用進行功能測試,在測試中沒有無法模擬的物理硬件依賴項。
目前 Cuttlefish 通常如何用于測試?
Cuttlefish 在測試方面的一些常見應用包括:
- CTS
- 框架合規性
- 持續集成測試
- 自定義測試套件
我是否可以在云端托管 Cuttlefish?
可以,Cuttlefish 本身支持 Google Cloud,并計劃支持其他云平臺。
入門
如需獲得有關基于 AOSP 創建 Cuttlefish 實例的指導,請參閱入門指南。
Cuttlefish:GPU 圖形加速
Cuttlefish 的加速圖形模式會使用主機的物理圖形處理器 (GPU) 進行渲染,具體方法是將客戶機渲染命令傳遞給主機,在主機上運行渲染命令調用,然后將渲染后的結果傳遞回客戶機。
默認情況下,Cuttlefish 設備中的客戶機端渲染(例如界面和視頻播放)由 SwiftShader 處理。SwiftShader 是對 OpenGL API 和 Vulkan API 的軟件實現。由于 SwiftShader 是一種軟件實現,因此它為 Cuttlefish 提供了一種可在任何主機上運行的通用渲染解決方案。
不過,使用 SwiftShader 的性能不及使用正常設備。渲染是一種可大規模并行處理的并行問題,因為像素值是可以單獨計算的。圖形處理器 (GPU) 是通過加速渲染解決此問題的硬件單元。
要求
加速圖形模式要求主機具有以下驅動程序:
- 支持 EGL 的驅動程序(支持?GL_KHR_surfaceless_context?擴展程序)
- 支持 OpenGL ES 的驅動程序
- 支持 Vulkan 的驅動程序
使用加速圖形模式
GfxStream
若要使用 GfxStream 加速圖形模式,請使用?--gpu_mode=gfxstream?標記啟動本地 Cuttlefish 設備。使用此模式時,OpenGL 和 Vulkan API 調用會直接轉到主機。
launch_cvd --gpu_mode=gfxstreamVirgl
若要使用 Virgl 加速圖形模式,請使用?--gpu_mode=drm_virgl?標記啟動本地 Cuttlefish 設備。
launch_cvd --gpu_mode=drm_virgl使用 Virgl 加速圖形模式時,OpenGL API 調用會轉換為中間表示形式(請參閱?Gallium3D)。系統會將相應中間表示形式傳遞給主機,并且主機上的?virglrenderer?庫會將此中間表示形式重新轉換為 OpenGL API 調用。
注意:此模式不支持 Vulkan。
Cuttlefish:多租戶與 powerwashing
借助 Cuttlefish 多租戶功能,您的主機可以通過一次啟動調用來啟動多個虛擬客戶機設備。
這多個 Cuttlefish 虛擬機可以共用一些主機磁盤資源,從而節省磁盤空間。每個虛擬機都會獲得一個覆蓋 Android 分區(例如?super、userdata、boot)的不重復的磁盤疊加層。對客戶機磁盤的任何修改都將放置在客戶機專用的磁盤疊加層中,從而為每個 Cuttlefish 虛擬機提供其磁盤分區的寫入時復制視圖。當每個虛擬設備向其磁盤視圖寫入更多數據時,主機磁盤上的疊加層文件大小會增加,因為它們會捕獲原始狀態和當前狀態之間的增量。
疊加層文件可以重置,以將 Cuttlefish 磁盤恢復為其原始狀態。此過程稱為“PowerPowering”。
實例號
Cuttlefish 設備會在與其“實例號”相關聯的主機上創建并消耗資源。例如,對于實例號為?1?的 Cuttlefish 設備,其?adb?連接會通過位于端口?6520?的 TCP 服務器端套接字進行公開。當啟動多個實例時,它會在端口?6520?處為第一個設備創建 TCP 服務器端套接字,為第二個設備創建?6521,并遞增每個其他設備的端口號。
修改支持的實例的數量上限
必須為 Cuttlefish 虛擬機預先分配主機端資源(例如 TAP 網絡設備)。默認情況下,cuttlefish-common?Debian 軟件包會為?1?到?10?號實例預配資源。
如需進行更改,請在?/etc/default/cuttlefish-common?中修改?num_cvd_accounts,并通過執行以下命令來重啟?cuttlefish-common?服務:
sudo systemctl restart cuttlefish-common控制多租戶實例
本部分介紹了如何啟動、停止設備以及對設備執行 powerwash 操作。這適用于單租戶和多租戶?launch_cvd?調用。
啟動
如需同時啟動多個 Cuttlefish 設備,請使用?--num_instances=N?標記,其中?N?為要啟動的設備數量。默認情況下,將會從實例號為?1?的設備開始啟動。
launch_cvd --num_instances=N如需更改起始實例號,請執行以下某項操作:
-
添加?--base_instance_num=N?標記,并將?N?作為第一個實例號。
launch_cvd --base_instance_num=N -
使用與?vsoc-NN?匹配的用戶帳號啟動 Cuttlefish,其中?NN?為兩位數形式的基礎實例號。例如,如需使用用戶帳號?vsoc-01?啟動 Cuttlefish,請運行以下命令:
launch_cvd --base_instance_num=1
停止
注意:在多設備環境中使用時,停止程序會同時應用于所有設備。
如需停止上次?launch_cvd?調用啟動的所有設備,請運行以下命令:
stop_cvdpowerwashing
注意:“powerwashing”發生在您重啟虛擬設備時。在單設備環境或多設備環境中使用時,powerwashing 會同時應用于所有設備。
如需在原始狀態(構建后的狀態)下啟動設備,請使用?launch_cvd?命令添加?--resume=false?標記。
// Launch and interact with your devices launch_cvd --num_devices=N --daemon // Stop all your devices stop_cvd // Restart devices in their original states launch_cvd --daemon --num_devices=N --resume=falseCuttlefish:WebRTC 流式傳輸
借助 WebRTC 流式傳輸功能,用戶可通過瀏覽器遠程控制 Cuttlefish 虛擬設備,而無需在客戶端計算機上安裝任何其他軟件。WebRTC 流式傳輸功能的其他優勢包括:
- 編碼效率高于 VNC
- 瀏覽器內 ADB
- 可擴展協議(攝像頭數據流、麥克風、傳感器數據都可以通過 WebRTC 實現)
使用 WebRTC
如需在瀏覽器中使用 WebRTC 并與您的 Cuttlefish 設備互動,請執行以下操作:
如需使用 WebRTC 啟動設備,請在?launch_cvd?調用中添加?--start_webrtc=true?標記。
launch_cvd --start_webrtc=true
如需查看您可以連接的所有設備的列表,請讓瀏覽器指向?<https://localhost:8443>。
端口使用情況
WebRTC 除使用?TCP:8443?之外,還會使用其他端口建立連接并運行。 如果從與執行 Cuttlefish 的計算機不同的計算機進行連接,則必須在防火墻中允許這些端口。所需端口的列表如下:
- TCP:15550
- UDP:15550
- UDP:15551
- UDP:15552
- UDP:15553
- UDP:15554
- UDP:15555
- UDP:15556
- UDP:15557
- UDP:15558
Cuttlefish:運行穩定版 CTS
本頁介紹了如何運行兼容性測試套件 (CTS),以便根據 AOSP 源代碼評估虛擬設備。
構建 Cuttlefish
在運行 CTS 之前,請先構建要使用 CTS 測試的虛擬設備。對于 AOSP Cuttlefish,請執行以下操作:
source build/envsetup.sh lunch aosp_cf_x86_64_phone-userdebug make -j構建 CTS
CTS 是獨立于設備工件構建的。如需構建 CTS,請按照以下說明操作。
從構建 Cuttlefish 所在樹的根目錄中,運行以下命令:
source build/envsetup.sh m -j cts WITH_DEXPREOPT_BOOT_IMG_AND_SYSTEM_SERVER_ONLY=false TARGET_PRODUCT=aosp_x86_64啟動多租戶 Cuttlefish 實例
注意:如需詳細了解如何啟動多臺 Cuttlefish 設備,請參閱?Cuttlefish 多租戶與 powerwashing。
從構建 Cuttlefish 所在樹的根目錄中,運行以下命令:
source build/envsetup.sh lunch aosp_cf_x86_64_phone-userdebug launch_cvd --num_instances=8 --daemon啟動實例時,請驗證每臺設備是否都可以訪問?adb。
adb devices輸出應類似于以下示例輸出:
List of devices attached 127.0.0.1:6520 ?device 127.0.0.1:6521 ?device 127.0.0.1:6522 ?device 127.0.0.1:6523 ?device 127.0.0.1:6524 ?device 127.0.0.1:6525 ?device 127.0.0.1:6526 ?device 127.0.0.1:6527 ?device在 Cuttlefish 實例中啟用 Wi-Fi
如果未啟用 Wi-Fi,部分 CTS 測試會失敗。如需在本地托管的所有 Cuttlefish 設備上啟用 Wi-Fi,請按照以下說明操作。
從構建 Cuttlefish 所在樹的根目錄中,運行以下命令:
for SERIAL in adb devices | grep -E '127.+device$ | cut -f1'; do adb -s ${SERIAL} install -r -g tools/tradefederation/core/res/apks/wifiutil/WifiUtil.apk adb -s ${SERIAL} shell su root svc wifi enable adb -s ${SERIAL} shell am instrument -e method "connectToNetwork" -e scan_ssid "false" -e ssid "VirtWifi" -w com.android.tradefed.utils.wifi/.WifiUtil done運行 CTS 穩定版子集
并非在 Cuttlefish 上進行的所有 CTS 都會通過,因為某些測試更多是針對實體設備量身定制的。如需使用?cts-virtual-device-stable?測試計劃(用于跟蹤在虛擬平臺上運行穩定的最新功能)運行 CTS,請按照以下說明操作。
從構建 Cuttlefish 所在樹的根目錄中,運行以下命令:
source build/envsetup.sh lunch aosp_cf_x86_64_phone-userdebug cts-tradefed run cts-virtual-device-stable --no-enable-parameterized-modules --max-testcase-run-count 2 --retry-strategy RETRY_ANY_FAILURE --reboot-at-last-retry --shard-count 8預計運行該測試需要 20 到 25 分鐘時間,并顯示類似如下的總結:
=============== Summary =============== Total Run time: 22m 8s 184/184 modules completed Total Tests ? ? ? : 92483 PASSED ? ? ? ? ? ?: 92363 FAILED ? ? ? ? ? ?: 0 IGNORED ? ? ? ? ? : 71 ASSUMPTION_FAILURE: 49 Shard 0 used: [127.0.0.1:6522] Shard 1 used: [127.0.0.1:6525] Shard 2 used: [127.0.0.1:6524] Shard 3 used: [127.0.0.1:6521] Shard 4 used: [127.0.0.1:6520] Shard 5 used: [127.0.0.1:6527] Shard 6 used: [127.0.0.1:6526] Shard 7 used: [127.0.0.1:6523] ============== End of Results ==============清理
測試完成后,請停止虛擬設備。
從構建 Cuttlefish 所在樹的根目錄中,運行以下命令:
source build/envsetup.sh lunch aosp_cf_x86_64_phone-userdebug stop_cvd總結
以上是生活随笔為你收集整理的使用 Cuttlefish 虚拟 Android 设备的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android多开和虚拟化--Docke
- 下一篇: 使用Android高性能音频--Open