1.问题:

  1. 多用户设计

    1. 每个用户启动一个android 容器,在登录时,根据不同用户启动不同容器。缺点:共有数据要多次挂载给多个用户使用?

    2. 所有用户共用一个android容器,在登录时,根据不同用户挂载不同的数据目录到容器中?缺点:切换用户时,需要保持多个用户共同使用私有数据就会冲突。

    3. 共享的app共用问题:将私有app和共享app分别安装到不同目录,启动时一起挂载到容器中。

  2. 宿主机上的设备,如USB key如何映射到android中?目前USB mouse还未找到方法如何映射到android container.

  3. 支持卸载android环境,包括自定义的host desktop environment.

  4. 视频解码加速共用问题,显卡一般支持多路同时解码(总解码能力是固定的)。

    1. amd显卡的vce句柄最大同时支持16个,rx460 解码能力能支持h264 120 fps * 1920*1080 . 具体参考:https://github.com/obsproject/obs-amd-encoder/wiki/Hardware-VCE3.4

  5. 支持退出登录,和切换用户。android launcher发送退出指令,hosted desktop environment响应命令。

  6. 编写或配置登陆管理器(Display manager) https://gnu-linux.readthedocs.io/zh/latest/Chapter02/50_login.manager.html 不展示其他desktop environment。/etc/X11/default-display-manager 配置了默认的display manager。

    1. 将其他desktop environment文件隐藏。缺点:卸载android 环境后要复原。

    2. 将gdm读取destkop entry配置文件的路径修改?如果不支持配置,需要修改代码。

    3. 配置成自动登录。跳过输入密码和选择desktop environment步骤

2. 实现

1sudo apt install kwin-x11

2.1 退出登录实现方案

目前维持android 桌面一直展示的原因是/bin/custom_de.sh 脚本中的startscreen.sh命令是一个前台进程(类似于gnome-session),如果该进程退出,桌面控制权就会退还给display name程序(一般是gdm).

基于上述原理,编写程序——android-session,该程序功能如下:

  1. 启动kwin;

  2. 通过docker api启动redroid容器,

  3. 启动startscreen.sh 

  4. 循环监听dbus消息,如果收到logout消息,则kill 上述由自己启动的子进程,再退出。