A frp client for Android
一个Android的frp客户端
简体中文 | English
如果您想更换frp内核,可以通过Github Actions或通过Android Studio编译
下述密钥相关步骤可选,若跳过该步骤将会使用Android公开的默认调试密钥进行签名
- fork本项目
- (可选) 将您的apk签名密钥文件转为base64,以下为Linux示例
base64 -w 0 keystore.jks > keystore.jks.base64- (可选) 转到Github项目的此页面:Settings > Secrets and variables > Actions > Repository secrets
- (可选) 添加以下四个环境变量:
KEY_ALIASKEY_PASSWORDSTORE_FILESTORE_PASSWORD其中STORE_FILE的内容为步骤2的base64,其他环境变量内容请根据您的密钥文件自行填写 - 在Actions页面的Android CI手动触发或Push提交自动触发编译,手动触发时可输入指定的frp内核版本号tag进行下载(如v0.65.0),留空和自动触发时下载最新版本
- (可选) 在项目根目录创建apk签名密钥设置文件
keystore.properties, 内容参考同级的keystore.example.properties - 参考脚本说明运行
build_frp_binaries脚本从frp源代码编译(需要Go和Android NDK环境),或运行update_frp_binaries脚本下载预编译内核文件 - 使用Android Studio进行编译打包
通过Go交叉编译直接由frp源代码构建为Android原生库,利用Android NDK的Clang工具链实现跨平台编译(GOOS=android),支持arm64-v8a、armeabi-v7a、x86_64三种架构
项目不是在代码里调用so中的方法,而是把so作为一个可执行文件,然后通过shell去执行对应的命令
在 frpc 配置中添加 loginFailExit = false 可以设置第一次登陆失败后不退出,实现多次重试。
可以适用于如下情况:开机自启动时,网络还未准备好,frpc 开始连接但失败,若不设置该选项则 frpc 会直接退出
所有架构现均使用 GOOS=android 编译的 frp 内核,可有效解决 DNS 解析失败的问题。如仍遇到 DNS 相关问题,建议在配置文件使用 dnsServer 指定 DNS 服务器
Android 17+ 新增了 ACCESS_LOCAL_NETWORK 权限要求,访问局域网资源需要用户明确授权。首次启动引导页会提示授予该权限,也可以在系统设置中手动开启。若未授予此权限,frp 将无法与局域网内的设备进行通信
App 按照原生 Android 规范设计,然而部分国产系统拥有更严格的后台管控,请手动在系统设置内打开相应开关。例如 ColorOS 16 退到后台会断开连接,在【应用设置->耗电管理->完全允许后台行为】之后恢复正常
简单来说:不能,请你参考上面的编译方法自行更换内核并编译Apk
由于Android 10+ 移除了应用主目录的执行权限,因此无法动态下载并运行新的frp内核文件,只能在安装包内置需要的内核版本。
用户的需求是不确定的,难以通过有限的内置版本满足所有用户,因此推荐用户自行编译以内置所需的内核版本。
当然也有其他的方案,例如
- NekoBoxForAndroid开发了插件系统,可以将二进制文件分离出来作为Apk插件安装
- termux通过一些技巧实现了在受限环境下执行二进制文件
但是这些方案都比较复杂,本人精力与能力有限,暂时无法实现
需在设置中打开「在收到广播时启动/关闭」对应开关:
# 启动所有已开启自启动的配置
adb shell am broadcast -a io.github.acedroidx.frp.START io.github.acedroidx.frp
# 停止所有已开启自启动的配置
adb shell am broadcast -a io.github.acedroidx.frp.STOP io.github.acedroidx.frp
# 仅操作指定配置(带参数示例)
adb shell am broadcast -a io.github.acedroidx.frp.START -e TYPE frpc -e NAME example.toml io.github.acedroidx.frp
adb shell am broadcast -a io.github.acedroidx.frp.STOP -e TYPE frpc -e NAME example.toml io.github.acedroidx.frp使用前请在「设置 -> frp 配置读写接口」开启读/写开关,注意可能的配置密码泄露等安全风险。 通过 ContentProvider 写入新配置时,该配置会自动开启自启动(Auto-start),无需手动设置。
# 列出全部配置(需要开启“允许读取”)
adb shell content query --uri content://io.github.acedroidx.frp.config
# 读取单个配置(需要开启“允许读取”)
adb shell content read --uri content://io.github.acedroidx.frp.config/frpc/example.toml
# 写入单个配置(需要开启“允许写入”)
# 将本地 example.toml 覆盖写入设备上的配置文件,部分设备可能需要先执行删除命令再写入
adb shell content write --uri content://io.github.acedroidx.frp.config/frpc/example.toml < example.toml
# 删除单个配置(需要开启“允许写入”)
adb shell content delete --uri content://io.github.acedroidx.frp.config/frpc/example.toml- 应用内快速验证:在主页配置列表长按“编辑”按钮,会用第三方应用通过 ContentProvider 打开该配置文件,同样需要先在设置中开启读/写开关。

