Oct 25, 2025
3 min read
Android,

termux 一些操作

让 termux 支持访问安卓文件系统的能力:

termux-setup-storage

这个操作会在 termux $HOME 目录下生成一个 storage 文件夹,里面软链接安卓文件系统。

开启 ssh 服务,这样更方便使用电脑端操作手机。其实直接在 termux 中执行 sshd 就可以开启 ssh 服务了。

注意的是:

  1. termux 默认的 ssh 端口是 8022,不是 22
  2. 需要为 ssh 服务设置密码,否则无法登录,使用 passwd 命令设置密码。

所以整个 ssh 登录如下:

ssh -p 8022 root@手机IP

另外,adb 其实也可以作为传输文件的工具。这里不谈有线连接,只说 adb 无线连接。adb 似乎有一些 bug,就是有时候我们哪怕输入对了 ip 和 port ,adb 也会提示连接失败。

类似下面这种:

~ took 54s
❯ adb connect 192.168.1.150:39777
failed to connect to '192.168.1.150:39777': No route to host

~
❯ adb pair 192.168.1.150:41797
Enter pairing code: 164252
error: protocol fault (couldn't read status message): Undefined error: 0

如果不是专门做 android 开发的人,这种排查起来,完全没有头绪。如果 ip 能 ping 通,说明端口肯定对不上,但是手机确实显示这个端口。其实这里如果对 adb 了解的比较深的话,大概就知道是 adb server 出现问题。adb 是通过 adb server 来通信的。遇事不决,重启解决,我们可以重启 adb server 试试。

adb kill-server
adb start-server

现在我们有了 2 种方式向手机的 termux 传输文件:

  1. 使用 adb
  2. 使用 ssh

不过我不太喜欢 adb 命令,一般使用更方便的 scrcpy 来远程控制手机。

用 rust 写一个 web server 试一下。

#[tokio::main]
async fn main() {
    let app = Router::new()
        .route("/", get(root));

    let listener = tokio::net::TcpListener::bind("0.0.0.0:12123").await.unwrap();
    axum::serve(listener, app).await.unwrap();
}

async fn root() -> &'static str {
    "Hello, World!"
}

添加 target

rustup target install aarch64-linux-android

构建:

cargo build -r --target aarch64-linux-android

错误:

error: linking with `cc` failed: exit status: 1
// 省略部分输出
[-Wunused-command-line-argument]
          ld: unknown options: --as-needed -Bstatic -Bdynamic --eh-frame-hdr -z --gc-sections -z -z --strip-debug 
          clang: error: linker command failed with exit code 1 (use -v to see invocation)

原因是我的电脑默认链接器 cc(实际调用的是 Clang)在链接时传入了不被目标平台支持的参数,导致链接失败。

那要用哪个链接器呢?因为我们要交叉编译给Android, 而 Android 的交叉编译工具套件是 NDK。所以我们需要 NDK 提供的链接器。

我这里使用 brew 安装的 NDK,和自己下载的 NDK 路径不一样。

brew install android-ndk

使用 brew info android-ndk 查看安装路径。

❯ brew info android-ndk
==> android-ndk: 29
https://developer.android.com/ndk/index.html
Installed
/opt/homebrew/Caskroom/android-ndk/29 (3.3GB)
// 省略部分输出

我自己的 NDK 链接器路径是/opt/homebrew/Caskroom/android-ndk/29/AndroidNDK14206865.app/Contents/NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android29-clang

添加到 .cargo/config.toml 中:

[target.aarch64-linux-android]
linker = "/opt/homebrew/Caskroom/android-ndk/29/AndroidNDK14206865.app/Contents/NDK/toolchains/llvm/prebuilt/darwin-x86_64/bin/aarch64-linux-android29-clang"
rustflags = ["-C", "link-arg=-fuse-ld=lld"]

上面这个,其实和使用 rust 开发 android 基本一致,都是需要借助 NDK 提供的链接器来编译 rust 代码。因此我们如果开发 JNI 的话,也是差不多的。

如果没有意外,编译成功。

复制到手机上,可以选择 adb 或者scrcpy(把文件拖动到窗口默认就是传输文件),这样可能需要在termux 里通过 storage 目录去访问这个文件了。我这里选择使用 scp 命令直接复制到 $HOME 目录下。

scp -P 8022 ./target/aarch64-linux-android/release/tinyserver root@192.168.1.150:./

在 termux 上直接运行:

./tinyserver

termux 能运行很多服务器的软件,比如 nginx,apache,lighttpd 等。所以理论上其他语言的服务也一样能运行。 旧手机利用 termux 在家里当服务器还是不错的。