下载源码
本文示例的termux-x11仓库提交后为05bebd4(2024-4-9)
git clone https://github.com/termux/termux-x11
安装编译环境
特别强调,操作系统硬件平台必须为x86_64,否则,编译可能报错,如:在arm64 CPU环境下,提示“build-tools/34.0.0/aidl: 6: Syntax error: Unterminated quoted string”等错误
以ubuntu-22.04为例。
下载java sdk
至少需要jdk 17版本,否则编译出错
sudo apt install openjdk-17-jdk
下载交叉编译环境
首先,在Download Android Studio官网上下载命令行工具,本案例采用linux版本(commandlinetools-linux-11076708_latest.zip),将其解压至编译系统中,解压后目录名为cmdline-tools
...
mkdir -p //tmp/Android/Sdk/
cmdline-tools/bin/sdkmanager --sdk_root=/tmp/Android/Sdk "platforms;android-34"
cmdline-tools/bin/sdkmanager --sdk_root=/tmp/Android/Sdk "ndk;26.3.11579264"
cmdline-tools/bin/sdkmanager --sdk_root=/tmp/Android/Sdk "build-tools;34.0.0"
交叉编译
首先,修改配置文件,主要是termux-x11/app/build.gradle文件,只编译arm64-v8a版本,ndk指定为26版本,默认使用的sdk为android-14.
...
./shell-loader/build/outputs/apk/debug/shell-loader-debug.apk
./app/build/outputs/apk/debug/app-arm64-v8a-debug.apk
数字签名
shell-loader在debug版本中未签名,无法直接安装,由于shell-loader使用了android:sharedUserId="android.uid.system",需要使用Android系统的证书和密钥(platform.pk8和platform.x509.pem)签名。Android SDK Build Tools提供了apksigner签名工具。
...
由于shell-loader未定义为Android的application,因此无法在Android中启动。
功能验证
部署
首先使用adb connect连接至Android环境中,然后部署termux-x11和shell-loader,以及键盘映射配置文件等
代码块 | ||
---|---|---|
| ||
# 安装termux-x11
adb install app/build/outputs/apk/debug/app-arm64-v8a-debug.apk
# 拷贝shell-loader
adb push shell-loader/build/outputs/apk/debug/shell-loader-debug.apk /sdcard/Download/
adb shell install -m555 /sdcard/Download/shell-loader-debug.apk /tmp/
# in linux,安装键盘映射文件
tar zcf share.X11.tar.gz /usr/share/X11/
adb push share.X11.tar.gz /sdcard/Download
adb shell tar -C /tmp -zxf /sdcard/Download/share.X11.tar.gz |
运行
使用图形界面操作启动termux-x11,使用命令行方式启动shell-loader,shell-loader的启动步骤如下:
代码块 | ||
---|---|---|
| ||
adb shell
# run in android,可写入一个脚本中执行
export XKB_CONFIG_ROOT=/tmp/usr/share/X11/xkb
export CLASSPATH=/tmp/shell-loader-debug.apk
exec /system/bin/app_process / com.termux.x11.Loader |
注意,shell-loader拉起来的X11 Server监听路径为/tmp/.X11-unix/X0,X11 client程序需能访问该路径
在linux环境下运行client,如xterm
代码块 | ||
---|---|---|
| ||
export DISPLAY=:0
xterm |