下载源码

本文示例的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

unzip commandlinetools-linux-11076708_latest.zip

其次,通过sdkmanager下载android SDK,Android NDK,以及build-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.

1diff --git a/app/build.gradle b/app/build.gradle 2index 5f70921..72e5275 100644 3--- a/app/build.gradle 4+++ b/app/build.gradle 5@@ -23,7 +23,7 @@ android { 6 enable true 7 reset() 8 9- include "x86", "x86_64", "armeabi-v7a", "arm64-v8a" 10+ include "arm64-v8a" 11 universalApk true 12 } 13 14@@ -42,6 +42,7 @@ android { 15 optimizeCode true 16 } 17 } 18+ ndkVersion '26.3.11579264' 19 } 20 21 dependencies {

其次,准备好gradle源,修改termux-x1/gradle/wrapper/gradle-wrapper.properties文件配置

1--- a/gradle/wrapper/gradle-wrapper.properties 2+++ b/gradle/wrapper/gradle-wrapper.properties 3@@ -1,7 +1,7 @@ 4 distributionBase=GRADLE_USER_HOME 5 distributionPath=wrapper/dists 6 distributionSha256Sum=194717442575a6f96e1c1befa2c30e9a4fc90f701d7aee33eb879b79e7ff05c0 7-distributionUrl=https\://services.gradle.org/distributions/gradle-8.7-all.zip 8+distributionUrl=https\://mirrors.cloud.tencent.com/gradle/gradle-8.7-all.zip 9 networkTimeout=10000 10 validateDistributionUrl=true 11 zipStoreBase=GRADLE_USER_HOME

再次,设置ANDROID_HOME环境变量

export ANDROID_HOME=/tmp/Android/Sdk

最后,交叉编译,编译debug版本,若要编译release版本,将目标改为assembleRelease。

cd termux-x11/

./gradlew assembleDebug

编译后生成了两个主要apk文件

./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签名工具。

  • 密钥证书:在Android系统工程”build/target/product/security”目录下,密钥文件platform.pk8,证书文件platform.x509.pem

  • 签名工具:在Android Studio下载的build-tools目录下,/tmp/Android/Sdk/build-tools/34.0.0/apksigner

1apksigner sign --key platform.pk8 -cert platform.x509.pem shell-loader/build/outputs/apk/debug/shell-loader-debug.apk 2adb install shell-loader/build/outputs/apk/debug/shell-loader-debug.apk

由于shell-loader未定义为Android的application,因此无法在Android中启动。

功能验证

部署

首先使用adb connect连接至Android环境中,然后部署termux-x11和shell-loader,以及键盘映射配置文件等

1# 安装termux-x11 2adb install app/build/outputs/apk/debug/app-arm64-v8a-debug.apk 3# 拷贝shell-loader 4adb push shell-loader/build/outputs/apk/debug/shell-loader-debug.apk /sdcard/Download/ 5adb shell install -m555 /sdcard/Download/shell-loader-debug.apk /tmp/ 6 7# in linux,安装键盘映射文件 8tar zcf share.X11.tar.gz /usr/share/X11/ 9adb push share.X11.tar.gz /sdcard/Download 10adb shell tar -C /tmp -zxf /sdcard/Download/share.X11.tar.gz

运行

使用图形界面操作启动termux-x11,使用命令行方式启动shell-loader,shell-loader的启动步骤如下:

1adb shell 2# run in android,可写入一个脚本中执行 3export XKB_CONFIG_ROOT=/tmp/usr/share/X11/xkb 4export CLASSPATH=/tmp/shell-loader-debug.apk 5exec /system/bin/app_process / com.termux.x11.Loader

注意,shell-loader拉起来的X11 Server监听路径为/tmp/.X11-unix/X0,X11 client程序需能访问该路径

在linux环境下运行client,如xterm

1export DISPLAY=:0 2xterm