运行 Anbox
概述
Anbox 運行時主要由兩個分開的實例構成:
- 容器管理器
- 會話管理器
容器管理器的工作是管理容器的建立,并在它的生命周期內維護它。它的職責是啟動我們用以運行 Android 系統的 LXC 環境。
會話管理器運行于登錄到 Linux 系統的用戶的會話內。它將通過一些 sockets 與運行在容器內的 Android 實例通信,并提供與 Linux 系統的集成。它還扮演多路復用器的角色,將 Android 應用映射為桌面環境的單個窗口。當前所有的應用窗口由相同的進程(會話管理器)所有。應用邏輯本身依然位于 Android 容器內的另外的進程中。
下圖展示了一個總體的架構:
應用映射
Android 應用被映射為桌面環境中單獨的窗口。這是通過插入 Android hwcomposer HAL
模塊來實現的,該模塊接收一組圖層以在屏幕上合成。Anbox 告訴 SurfaceFlinger 通過它的 hwcomposer 實現為每個應用獲得圖層,并把這與它從 Android WindowManager 接收的其它信息結合,來把獨立的圖層映射為應用。更多詳情請查看如下的實現:
- android/hwcomposer
- src/anbox/graphics/layer_composer.cpp
- src/anbox/wm/manager.cpp
編譯 Android 鏡像
對于 Anbox,我們使用的是 Android 的最小定制版本,但是基于 Android 開放源代碼項目
最近版本的所有工作。
要重新構建 Android 鏡像,你首先需要獲得所有相關的源碼。這將消耗你大量的磁盤空間(~40GB)。AOSP 建議至少要有 100 GB 的空閑磁盤空間。也可以查看 他們的 頁面。
一般來說,為了構建 Anbox Android 鏡像,位于 AOSP 工程的頁面 的指南是適用的。此處我們將不再專門描述通常如何構建 Android 系統,而只聚焦于 Anbox 所需的步驟。
獲得所有相關源碼
首先建立一個新的 workspace,你將在其中下載所有的源碼。
$ mkdir $HOME/anbox-work現在,通過下載 manifest 并啟動獲取源碼來初始化倉庫:
$ cd $HOME/anbox-work $ repo init -u https://github.com/anbox/platform_manifests.git -b anbox $ repo sync -j4依賴于你的網絡連接,這將消耗一些時間。
構建 Android
當所有的源碼都成功地下載之后,你就可以啟動構建 Android 本身了。
首先通過 envsetup.sh 腳本初始化環境。
$ . build/envsetup.sh然后使用 lunch 初始化構建。
$ lunch anbox_x86_64-userdebug支持的構建目標的完整類表如下:
- anbox_x86_64-userdebug
- anbox_armv7a_neon-userdebug
- anbox_arm64-userdebug
現在通過如下命令構建所有其它的東西:
$ make -j8一旦構建完成,我們需要獲取結果,并用它們創建適用于 Anbox 的鏡像文件。
$ cd $HOME/anbox-work/vendor/anbox $ scripts/create-package.sh \$PWD/../../out/target/product/x86_64/ramdisk.img \$PWD/../../out/target/product/x86_64/system.img這將在當前目錄下創建一個名為 android.img 的文件。
現在,你就可以在 Anbox 運行時中使用使用你的定制鏡像了。
以自己構建的 android.img 運行 Anbox
如果你已經在你的系統上安裝了 Anbox,你需要先停掉它。在通過 Anbox 安裝器腳本完成 Anbox 安裝并 snap 之后,Anbox 會自動啟動,查看主機的進程列表將看到如下內容:
$ ps -aux | grep anbox root 7113 0.0 0.0 766588 12308 ? Ssl 14:46 0:00 /snap/anbox/65/usr/bin/anbox container-manager --data-path=/var/snap/anbox/common/ --android-image=/snap/anbox/65/android.img --daemon hanpfei+ 8327 7.2 1.5 2464708 252328 ? Sl 14:49 0:01 /snap/anbox/65/usr/bin/anbox session-manager root 8339 0.0 0.0 36776 3616 ? Ss 14:49 0:00 /snap/anbox/current/libexec/lxc/lxc-monitord /var/snap/anbox/common/containers 14 root 8341 0.0 0.0 772888 8156 ? Ss 14:49 0:00 [lxc monitor] /var/snap/anbox/common/containers default 100000 8350 0.0 0.0 7920 5912 ? Ss 14:49 0:00 /system/bin/sh /anbox-init.sh 100000 8423 0.0 0.0 16728 9260 ? Sl 14:49 0:00 /system/bin/anboxd 110000 8877 0.8 0.5 1038888 95412 ? Sl 14:49 0:00 org.anbox.appmgr hanpfei+ 9094 0.0 0.0 19300 976 pts/21 S+ 14:49 0:00 grep --color=auto anbox此時,可以這樣做來停掉 Anbox:
$ sudo systemctl stop snap.anbox.container-manager再次查看主機的進程列表,將無法再看到 Anbox 相關的進程。
同時停掉它們是很重要的,容器管理器和會話管理器。
一旦兩個服務都被停掉了,你可以通過運行如下命令用定制的 android.img 啟動容器管理器:
$ datadir=$HOME/anbox-data $ mkdir -p $datadir/rootfs $ sudo anbox container-manager \--android-image=/path/to/android.img \--data-path=$datadir這將啟動容器管理器并在特定的數據路徑中設置容器根文件系統。
$ ls -alh $HOME/anbox-data total 20K drwxrwxr-x 5 ubuntu ubuntu 4,0K Feb 22 08:04 . drwxrwxr-x 16 ubuntu ubuntu 4,0K Feb 22 08:04 .. drwxr-xr-x 2 100000 100000 4,0K Feb 22 08:04 cache drwxr-xr-x 2 100000 100000 4,0K Feb 22 08:04 data drwxr-xr-x 2 root root 4,0K Feb 22 08:04 rootfs注意: 如果你查看 $HOME/anbox-data/rootfs 目錄,你將不會看到任何東西,因為容器管理派生了一個私有的掛載命名空間,它阻止了外面查看它的掛載點。
cache 和 data 目錄被綁定-掛載到 rootfs,位于 rootfs/data 和 rootfs/cache。
原文
原文
總結
- 上一篇: [转]I,P,B帧和PTS,DTS的关系
- 下一篇: 将应用打包为 Snaps