版本比较

密钥

  • 该行被添加。
  • 该行被删除。
  • 格式已经改变。
目录
minLevel1
maxLevel23
outlinefalse
styledefault
typelistseparatorbrackets
printabletrue

背景介绍

请先读本段!请先读本段!请先读本段!

本文是在OpenFDE上实现linux窗口和Android窗口融合的一种方案预研和设想,因为方案有些复杂,这段文字作为一个前情提要,描述一下背景知识,不然直接开始容易让人懵逼。

...

Termux 是一个 Android 终端应用程序和 Linux 环境。直观的来看,Termux 是运行在 Android 上的 terminal,不需要root,运行于内部存储(不在SD卡上),目录位于本应用的file目录,配置了相应的环境变量,包安装命令是pkg install xxx,实际是一个封装APT的脚本。

源码地址:https://github.com/termux/termux-app

...

环境变量配置:

...

安装库路径:/data/data/com.termux/files/usr/lib

...

当你使用termux作为终端来安装和运行程序时,应该是从代码仓库编译https://github.com/termux/termux-packages ,并发布到apt源的程序。

Termux-packages该项目包含用于构建 Termux Android 应用程序包的脚本和补丁。简单对比了一下补丁文件,项目构建的方式主要是将linux的编译选项改为Android,如果原本项目就支持Android编译,即可以最简单的直接编译出程序,否则就要先安装在Android上本来不存在的依赖。

Termux-X11 是一个成熟的 X 服务器。它是使用 Android NDK 构建的,并针对与 Termux 一起使用进行了优化。

...

代码块
public class CmdEntryPoint extends ICmdEntryInterface.Stub {
    public static final String ACTION_START = "com.termux.x11.CmdEntryPoint.ACTION_START";
    public static final int PORT = 7892;
    public static final byte[] MAGIC = "0xDEADBEEF".getBytes();
    private static final Handler handler;
    public static Context ctx;
     ...

笔者理解Termux-x11有两条运行线:

  • termux-->app_process-->com.termux.x11.CmdEntryPoint-->startserver

  • termux-x11-->SurfaceView-->com.termux.x11.ICmdEntryInterface.windowChanged-->xserver

两条线的最后代码都是在termux-x11,并且两条线不互相干扰,server启动后不置入SurfaceView,不显示图像,server也可以正常在后台运行。

...

简单描述这个问题:将termux、termux-x11安装启动xserver的过程,做到用户无感知,交互正常,不需要pkg安装,也不需要命令行操作。

(?笔者认为的关键是,解决环境变量,库依赖的问题)

可能的最终形态:

  1. 改成普通安卓service或者系统安卓service,运行在后台;

  2. 提供一个融合应用的入口,类似VNC的《Fusion Linux Application》,用户启动后再拉起server,列出X程序,点击X程序再启动linux端的连接。

...

FDE上要实现的窗口融合效果是Linux的每个X程序跟安卓的每个应用显示效果一致,使自己的程序独有窗口。当我们能够将每个X程序的图像从xserver的合成器中分离出来的时候,方案的前置条件就成立了。当然具体实现还要从以下几个方面着手。

1. 显示重定向

显示重定向是最容易理解的,就是把X程序对应用窗口的显示内容转到另一个单独的buffer中,FDE再把这个buffer拿去安卓中做显示,即是output的处理。

...

  1. connection建立过程,window创建过程,window的详细参数;

  2. window分类,哪些需要新窗口显示,哪些在内部处理;

  3. 优化damage机制;

  4. ....

2. 事件重定向

Compositor扩展并没有处理事件重定向,意思就是说他不重定向输入事件。他会将OverlayWindow 的所有输入直接传到下层窗口,相当于什么也没做。

...

  1. 缩放时处理Randr;

  2. 坐标系转换;

  3. 快捷键捕获;

  4. 文本输入移植ibus?;

  5. ...

3. 安卓端实现

相较于Xserver的改动,安卓的实现简单,在VNC上的处理都可以直接移植,遗留有一个activity多栈未解决,也不是马上必须要解决的。

...

每个X程序独占一个screen,所有X程序的input,output不产生关系,唯一需要处理焦点切换。

未来需要做的事 ACTION

  1. 改造termux/termux-x11;

  2. 重定向后buffer的生命周期管理或者说X程序生命周期的管理;

  3. 事件重定向的坐标转换,窗口ConfigreNotify;

  4. 复杂输入事件需要验证,比如组合事件是否能直接生效;

  5. 探究另一种可能的实现方式:Xserver多screen。

...