安卓平板运行PC级WPS和VS Code的探索

Termux是一个在安卓设备上模拟Linux终端的APP。借助这个终端,可以运行许多Linux程序;更进一步的,我们还可以在其上安装发行版并配置桌面环境,进而运行一些PC端应用(在华为最新的几款平板上,这个功能叫做“PC应用引擎”)。下面是探索的步骤

一、Termux的安装

可以在下面的地址获得apk,在安卓设备上通过apk的方式安装Termux。

安装以后,点击APP图标即可进入终端界面。初次进入时APP会自动下载一些依赖库,等待一两分钟即可完成下载安装。之后,就可以像普通的Linux终端那样对这个APP进行使用了。

二、termux的apt软件源更新+proot安装

参考: https://mirrors.tuna.tsinghua.edu.cn/help/termux/

如题。

最新版的Termux中包含了termux-change-repo这一指令,可以通过一个图形化的方式选择合适的软件源(如下图)。通过键盘方向键选择切换镜像组,随后选择中国大陆的镜像站即可(按空格选中,按回车确认,按左右方向键切换OK/Cancel)。

更新完软件源以后,使用下面的指令安装proot-distro这个容器软件,之后我们会使用它进行Linux发行版的安装。

1
apt install proot-distro

(其实理论上不做后面的步骤也可以,Termux自身已经包含了大量的Linux程序和运行时环境,可以进行一些如C++程序编译、python开发、web网站假设等一系列工作。安装Linux发行版主要是想装图形界面)

三、安装Fedora发行版

参考: https://wiki.termux.com/wiki/PRoot

如下图,proot-distro是一个Linux PRoot容器的管理软件,包含许多指令。

  • 使用proot-distro list可以列出当前可用的Linux发行版(包括已安装的和未安装的)
  • 使用proot-distro install <发行版名称>可以安装特定发行版
  • 使用proot-distro remove可以删除特定发行版
  • 要进入一个已经安装好的发行版,可用使用proot-distro login <发行版名称> --user <用户名>指令(其中--user参数是可选的。不加这一参数则登录到root用户)

下面我们来安装Fedora发行版:

1
proot-distro install fedora

这将会下载大约几十MB的文件,大约需要几分钟时间。

之后,使用下面的指令即可登录到刚刚安装的fedora发行版:

1
proot-distro login fedora

Fedora系统配置非root用户、软件源、bashrc设置、网络设置等过程和普通的Linux发行版一样,在网络上也有许多教程,此处略过。

四、安装LXQt桌面环境并配置VNC服务

在众多Linux桌面环境中,LXQt算是一个比较轻量级的存在了。其前身是LXDE,也是一个非常轻量级的桌面,随后有人使用Qt框架对其进行了重写,保留了原本的轻量级特性,但引入了更加现代的界面设计。

VNC是一种使用RFB(Remote Framebuffer)协议的屏幕画面分享及远程操作软件,分为服务端和客户端,在此我们使用它进行图形界面的显示。

上述这些软件在Fedora里的安装方法如下:

1
2
3
4
5
6
# 首先更新dnf缓存
sudo dnf makecache
# 然后安装LXQt相关的软件包
sudo dnf group install "LXQt Desktop" "LXQt Office" "Multimedia support for LXQt" "Applications for the LXQt Desktop"
# 最后安装vnc服务
sudo dnf install tigervnc-server xorg-x11-server-utils xterm

安装过程需要持续几十分钟,期间需要下载1G左右的数据。

安装完成后,我们还需要对VNC服务进行一些配置:

1、修改密码。终端输入下面这行指令,然后根据提示直接在终端内输入要使用的密码即可。

1
vncpasswd

2、修改位于~/.vnc/xstartup处的VNC配置文件,将下面这几行内容写入文件当中:

1
2
3
xrdb $HOME/.Xresources
xsetroot -solid grey
startlxqt &

并赋予上述文件可执行权限(chmod +x ~/.vnc/xstartup

3、创建VNC启动脚本。在家目录下创建文件start_lxqt_with_vncserver.sh并写入下面的内容:

1
2
3
4
5
6
#!/bin/bash
# First we must stop the previous VNC session
vncserver -kill :2
rm /tmp/.X*-lock
# Then we start a new VNC session
vncserver -depth 24 :2

并赋予上述文件可执行权限(chmod +x ~/start_lxqt_with_vncserver.sh)。

这个启动脚本中,vncserver -kill :2rm /tmp/.X*-lock两行内容是为了避免先前启动的VNC服务未关闭造成的一些问题,vncserver -depth 24 :2表示以24位色彩深度在:2端口上启动VNC服务。

为了使用这个桌面,我们也需要在设备上安装一个VNC客户端。在VNC viewer官网上提供了安卓版的下载链接,从这里我们下载VNC viewer并安装即可。

4、启动VNC服务。这一步直接运行刚刚我们编写好的启动脚本即可(./start_lxqt_with_vncserver.sh)。控制台会有一些输出,大致如下:

5、启动VNC客户端。现在我们暂时退出Termux的终端(记得挂后台,别被清理了),打开刚刚安装的VNC viewer,点击右下角的加号创建一个新的session,其中主机地址填写localhost:2127.0.0.1:2,密码填写前面第一步中设置的密码,即可连接。

启动后的界面大致是下面这个样子。VNC viewer内支持鼠标和键盘操作(就像PC那样)。

五、WPS arm linux版的安装过程

参考: https://www.linuxcapable.com/how-to-install-wps-office-on-fedora-linux/

首先从WPS官网上下载Linux版的WPS安装包(rpm格式): https://www.wps.cn/product/wpslinux#

在这以后,直接使用rpm -ivh <package_name.rpm> 并不能安装,因为一些依赖库的缺失会导致报错。但是可以使用下面的指令安装:

1
2
3
4
# 首先切到WPS安装包的下载目录
cd <WPS安装包的下载目录>
# 然后使用dnf安装。注意指令中的通配符。
sudo dnf install wps-office*.rpm

这会自动安装依赖库,并同时从本地rpm文件中安装WPS。

之后,使用wps指令即可启动WPS主程序。

但是更推荐的是启动LXQT桌面并通过VNC view连接到这个桌面以后,通过LXQT桌面管理器的launcher启动WPS主程序。

六、VS Code的安装和启动

和WPS相反,VScode的安装非常简单,只需要一行指令:

1
sudo dnf install code

要启动vscode,可以直接使用code指令。然而在我的termux-fedora环境中,这一指令并不能正确启动vscode,添加--verbose选项以后得到的报错信息中提到:

1
2
[cyclin@localhost]~$ code --verbose
[5987:0521/102754.483405:FATAL:setuid_sandbox_host.cc(158)] The SUID sandbox helper binary was found, but is not configured correctly. Rather than run without sandboxing I'm aborting now. You need to make sure that /usr/share/code/chrome-sandbox is owned by root and has mode 4755

按这个报错信息的说法,我需要给chrome沙箱文件/usr/share/code/chrome-sandbox赋予4755权限。当我这么做以后,问题依然没有解决,推测可能是termux的chroot环境所导致的。

所以我们可以尝试绕过上述chrome沙箱,直接启动vscode。指令如下:

1
code --no-sandbox

可以把上述指令封装为vscode指令以便下一次启动。

七、一些报错的解决:

根据 https://github.com/termux/termux-packages/issues/10871 ,首先在 $PREFIX/lib下创建libssl.so.1.1的软连接

1
2
3
cd $PREFIX/lib
ln -s openssl-1.1/libcrypto.so.1.1 libcrypto.so.1.1;
ln -s openssl-1.1/libssl.so.1.1 libssl.so.1.1

从而保证curl的依赖库可以被link。
随后使用apt full-upgrade进行全局更新。

(2)使用proot-distro安装linux发行版以后dnf更新缓存失败、curl无法解析主机名( “curl error (6) could not resolve host”,但是可以根据ip获取信息)的解决方法:

经过排查,大约是DNS配置的问题。尝试在/etc/resolv.conf中增加了一些DNS服务器,但是错误仍未解决。

最后,在/etc/hosts中将一些网站的DNS写死(yum软件源用https://mirrors4.tuna.tsinghua.edu.cn,在hosts中添加这一主机并配置ip为101.6.15.130)

1
2
101.6.15.130  mirrors4.tuna.tsinghua.edu.cn
101.6.15.130 bfdmirrors4.a.s.tuna.tsinghua.edu.cn

这样至少可以保证更新软件源缓存时是没有问题的。

之后安装一下net-tools这个软件包,DNS的问题似乎就解决好了。