Hello world from Xiaomi 5 Pro!
前略,进入新学期之后,我经常需要将工作环境搬到电源短缺的地方,然后连接远程工作。目前的主力机是去年购入的浸水者,经常工作一个半小时就快倒下,实在是叫人叫苦不迭。
那么iPad怎么样呢?如果只是让它在电源短缺的地方应一下急,那还是可以的。与此同时,iOS平台上也确实有诸如Pyto等设施,似乎接上蓝牙键盘万事大吉!但实际情况比这要糟糕得多。首当其冲的一点就是iOS对于开发者——程序开发者——极不友好,为了开发就得考虑买果家的MacOS生态。如果你不买,那苹果希望你“安分守己地”待在一个消费者的位置上。这样一个“苹果-开发者-消费者”的关系图景简直是某种消费主义下“国王-贵族-平民”的翻版。从而,iPad对我来说是质量不错的消费品不假,但就关系性而言是我不能忍受的。
虽然如此,由于我在一年半以前通过“仔细的对比和咨询”已经入手了一块iPad,我还是进行了诸多尝试。这些尝试非常痛苦,因为在整个过程中都能感受到苹果的不情愿和“这也不许那也不许”,而各种资料也在搞“甄士隐贾雨村”之把戏。在我最后一次尝试UTM——在iOS上运行虚拟机——发现它居然只能分配512MB内存之后,我就决定和它说再见了。但是其3,000左右的价格依然非常诱人。与它相比,便宜且可用的主流轻薄本——如有低温焊接问题的联想小新——都需要3,500 ~ 4,500;而RPi之类的开发平台,虽然本身的定价在约500-1,000,但考虑诸多外设成本,总价也需要到2,000左右,并且需要较长的开发时间和学习成本。如何在有限的预算下解决我的需求呢?
就在我已经在搜索“RPi diy laptop”之类的关键词然后大摇其头的时候,这个视频进入了我的视野:
【小米平板5写代码超强体验!Termux-X11 + VSCode】 https://www.bilibili.com/video/BV1CR4y1z7sW/?share_source=copy_web
Linux desktop over Android pad! 完美符合我的需求,这太惊艳了!
中略,经过三天的高强度折腾之后,我终于成功在全新小米平板5Pro上以3,000出头的预算完成了全套环境。虽然不能说完美,但是已经可用于普通作业了。
本文中所采用的方法主要参考了下面三个来源:
【ivon的部落格:Termux X11:手機的X伺服器使用教學】https://ivonblog.com/posts/termux-x11/
【udroid Wiki】https://udroid-rc.gitbook.io/udroid-wiki/udroid-landing/readme
【UBUNTU 22.04 JAMMY WITH Termux-x11 FAST GUI】https://github.com/RandomCoderOrg/ubuntu-on-android/discussions/152
1. 怎么办 #
1.1. Termux #
首先是安装
Termux和
Termux-X11。Termux是Android下的终端模拟器,不需要root,可以通过termux-setup-storage
直接操作外部存储。自带包管理系统apt/pkg
,可以参考
TUNA用termux-change-repo
换源。
termux-change-repo
apt update
apt install git wget nano
Termux-X11则是Termux的扩展,提供了基于XWayland的Android前端。它分成两个部分,一是工作在Termux内的,为termux-x11-{version}.deb
;另一部分为Android APP,二者的关系类似于XClient/XServer。
apt install x11-repo xwayland
# copy your termux-x11.deb from somewhere else
apt install ./termux-x11-{version}.deb
二者结合实际上已经可以运行XFce4-session了。需要注意,Android 12以上会给占用过高的进程发SIGKILL。为了解决这个问题,我们需要借助 adb把Phantom Process Killer关掉。
# on your computer, with tablet linked
adb devices
adb shell "/system/bin/device_config set_sync_disabled_for_tests persistent"
adb shell "/system/bin/device_config put activity_manager max_phantom_processes 2147483647"
adb shell "/system/bin/device_config put global settings_enable_monitor_phantom_procs false"
但是Termux支持的包毕竟有限,因此下一步是安装整个系统。
1.2. Ubuntu 设置 #
由于购机不足7天无法解锁Bootloader进而root系统,我们选择
PRoot。PRoot为我们提供了在用户态chroot
的能力,使得在Android设备上非root运行Linux分发版成为可能。对此,Termux提供了proot-distro
一键式管理器。
apt install proot proot-distro
proot-distro list
proot-distro install ubuntu
proot-distro login ubuntu
root@localhost:#
除了proot-distro之外,
udroid也是可选项。但是它一方面只有ubuntu这一选项,另一方面在sudo
上有着比proot-distro更严重的问题。因此我最终依然选择了proot-distro。
在用proot-distro
登录了ubuntu之后,我们首先进行一些基础设置。
apt update
apt install nano sudo
useradd -m -s /bin/bash {your_username}
passwd # set root passwd
passwd {your_username}
echo "{your_username} ALL=(ALL) ALL" >> /etc/sudoers
su {your_username}
这样我们就设置好了接下来会用的个人账户。注意到由于proot下systemd不存在,因此我们无法使用usergroup来实现sudo。类似地,后续一些需要自启动的daemon也需要手动设置。之后,我们可以直接用
proot-distro login --user {your_username} ubuntu
来使用个人账户登录。
接下来安装Desktop GUI。注意,由于systemd不存在(万恶之源),因此最新的Gnome3完全跑不起来。我们的选项主要集中在XFce4,Mate和KDE上。
sudo apt update
sudo apt upgrade
sudo apt install dbus-x11
# For xfce4 users
sudo apt install xfce4 xfce4-goodies
# For Mate users
sudo apt install ubuntu-mate-desktop mate-desktop-environment mate-terminal
sudo apt install ubuntu-mate-lightdm-theme
# For KDE users
# Please refer to https://github.com/kde-yyds/termux-x11-plasma-installer
这样其实已经可以把GUI跑起来了
# In termux
export XDG_RUNTIME_DIR=${TMPDIR}
termux-x11 &
proot-distro login --user {your_username} --shared_tmp ubuntu
# In Ubuntu
export DISPLAY=:0
# For xfce4 users
dbus_launch --exit-with-session startxfce4
# For Mate users
dbus_launch --exit-with-session mate-session
然后在Android中打开termux-x11 App,即可开始使用!
1.3 杂项 #
这里是一些或多或少需要workaround的项目。
首先是音频输出。我们需要用pulseaudio把音频转发出去。
# In termux
apt install pulseaudio
# Before proot-distro login
pulseaudio --start --load="module-native-protocol-tcp auth-ip-acl=127.0.0.1 auth-anonymous=1" --exit-idle-time=-1
pacmd load-module module-native-protocol-tcp auth-ip-acl=127.0.0.1 auth-anonymous=1
# In Ubuntu, before starting your X session
export PULSE_SERVER=127.0.0.1
pulseaudio --start --disable-shm=1 --exit-idle-time=-1
然后是浏览器。由于Ubuntu把firefox和chromium(乃至VSCode)全都交给了snap,而snap完全不能工作,我们需要把snap卸载,然后make APTITUDE great again!具体来说
sudo apt install software-properties-common
sudo apt remove --purge snapd gnome-software-plugin-snap
snap
echo '
Package: *
Pin: release o=LP-PPA-mozillateam
Pin-Priority: 1001
Package: firefox
Pin: version 1:1snap1-0ubuntu2
Pin-Priority: -1
' | sudo tee /etc/apt/preferences.d/mozilla-firefox
sudo add-apt-repository ppa:mozillateam/ppa
sudo apt install firefox
而chromium要更麻烦一点,需要添加debian的源。参见 这里。
相比之下,VSCode就比较友好,可以直接从 官网选择Arm平台的包安装。
需要注意的是VSCode和chromium都是chromium内核,在proot下运行需要开启–no-sandbox
和–disable-gpu
选项。以VSCode为例,具体来说
sudo nano /usr/share/applications/code.desktop
# In nano
...
Exec=/usr/share/code/code --no-sandbox --disable-gpu --unity-launch %F
^^^^^^^^^^^^ ^^^^^^^^^^^^^
...
Exec=/usr/share/code/code --no-sandbox --disable-gpu --new-window %F
^^^^^^^^^^^^ ^^^^^^^^^^^^^
...
最后是区域设置和输入法。这里以IBus为例。
# locale
sudo apt install locales
locale-gen zh_CN.UTF8
update-locale zh_CN.UTF8
# input method
sudo apt install ibus ibus-cluster ibus-gtk ibus-gtk3
sudo apt install ibus-pinyin
sudo apt install im-switch
imconfig -n ibus
特别注意,由于systemd不存在(三度),我们需要让ibus-daemon
在X session起来之后自启动。我这里使用Mate自带的启动项设置,加入了
ibus-daemon --xim -d
在此之余,我们还需要在.bashrc
中添加如下项才能让输入法正确工作:
# manage input method
export GTK_IM_MODULE=ibus
export XMODIFIERS=@im=ibus
export QT_IM_MODULE=ibus
2. 使用体验总结 #
Pros:
- Type-C 万岁!
- 与作为上位机(?)的PC交互比较方便——至少比iTunes好多了。
- 工具丰富,使用流畅,视觉效果尚可。
Cons:
- Android会拦截许多快捷键,比如Alt-Tab。
- termux-x11对触控这一操作模式的翻译做得并不完美。
有一些潜在的bug,比如oh-my-zsh之后居然会把alsa lib干碎……(Upd 23.03.27:这一条在换了TUNA源之后离奇修好了,真是神秘……)
但总体而言,这一次Ubuntu over Android的体验还是远超预期,开源社区的丰富踩坑经验也让之前还在和iOS搏斗的我如沐春风。预计接下来还会多进行一些尝试,比如把KDE跑起来……
这次就到这里吧,下次见!