编译 Android 版 Frp (Golang)| 内网穿透

技术 · 2024-02-16

今天遇到需要在 Android 上跑一个 Frp 来进行内网穿透,截止目前(2024 年 2 月 16 日)Frp 最新版为 v0.54.0,但很多公益 Frp 目前提供的服务端版本是 v0.51.0,和 v0.52 + 的客户端并不兼容,所以需要跑一个 v0.51.3 的客户端。

首先,在 Android 平台运行 CLI 软件的最佳选择当然是 Termux,而且 Termux 的官方仓库已经收录了 Frp,但 Termux 的官方仓库很贴心的更新到了 Frp v0.54.0,并且不提供旧版本。

因为 Frp 是使用 Golang 编写的软件,Golang 的跨 Linux 发行版做的向来不错,考虑到 Android 也算是 Linux 发行版,于是直接下载 Frp 官方的 frp_0.51.3_linux_arm64 包,果然可以直接运行。但存在一点小 Bug,Android 和常见的 Linux 发行版毕竟不一样,DNS 解析是由 Android 层面提供的。所以如果没做适配,解析域名时会报错(直接用 IP 不会),对于使用 stcp 其实不影响,但如果需要使用 xtcp 来 P2P 打洞,则无法解析 stun 地址。

所以还是需要编译一个安卓版本的 Frp,这里就开始持续遇到坑了。
首先根据 Google 的搜索结果,参考了这篇(https://www.wyr.me/post/737)2023 年 3 月份的教程,遇到的第一个坑是编译后提示:

note: module requires Go 1.20

Ubuntu 22.04 官方仓库中的 Golang 版本是 1.18,而编译 Frp v0.51.3 需要的最低 Golang 版本是 1.20。于是在 Golang 官网手动下载 1.20 版继续编译,成功生成 frpc_android_arm64 文件,复制到 Termux 中运行,结果和官方版的 frp_0.51.3_linux_arm64 一样,DNS 解析功能依然不行,看来在 X86 的 Golang 上编译出的 Frp 并未对 Android 做适配。

继续搜索 Termux 社区,发现有人提到 Termux 打包的 Golang 对这个问题做了优化,那就好办,直接在 Android 上用 Termux 的 Golang 编译 Frp 就好了。

## Termux 中安装 Golang
apt install golang

## 下载 Frp v0.51.3 的源码,直接下载对应版本的源码即可,也无需再用 Git 了
wget https://github.com/fatedier/frp/archive/refs/tags/v0.51.3.zip

## 解压源码并进入源码文件夹
unzip v0.51.3.zip
cd frp-0.51.3

## 开始编译
env CGO_ENABLED=0 GOOS=android GOARCH=arm64 go build -trimpath -ldflags "-s -w" -o ./release/frpc_android_arm64 ./cmd/frpc

成功生成 frpc_android_arm64 文件,再次运行,果然域名解析功能就正常了。

开发 安卓 网络
Theme Jasmine. 由 Cloudflare 提供 CDN 加速 ICP 20232321