一个免 root 的 Android 弱网/流量管控工具:按应用限制网速、模拟丢包、强制指定 WiFi 或移动数据(甚至断网)。适合弱网测试、应用测试、流量管控等场景。
| 功能 | 说明 |
|---|---|
| 按应用限速 | 分别设置每个应用的 下载/上传 速度上限(KB/s,0 = 不限) |
| 丢包模拟 | 分别设置 下载/上传 方向的丢包率(0–50%),TCP 自动触发重传,QUIC/UDP 表现为真实弱网 |
| 指定网络 | 每个应用可独立选择:跟随系统 / 仅 WiFi / 仅移动数据 / 完全断网 |
| 弱网预设 | 内置 2G / 3G / 弱网 / 恶劣 一键预设 |
| 实时统计 | 每应用「实时速率 | 限速」并排显示、总会话数 |
┌──────────┐ ┌─────────────────────────────────────────┐ ┌──────────┐
│ 被管控 App │──▶│ NetBrake 本地 VPN (TUN) │──▶│ WiFi │
└──────────┘ │ ┌─────────────────────────────────────┐ │ ├──────────┤
│ │ Engine │ │ │ 移动数据 │
其他 App ────▶│ │ · IP/TCP/UDP 解析 │ │ └──────────┘
(不受影响) │ │ · 简化 TCP 栈(握手/重传/窗口) │ │
│ │ · 令牌桶限速(上下行独立) │ │
│ │ · 随机丢包(上下行独立) │ │
│ │ · ConnectionOwnerUid 识别应用 │ │
│ │ · socket protect + bindSocket 选网 │ │
│ └─────────────────────────────────────┘ │
└─────────────────────────────────────────┘
- 通过
VpnService.Builder.addAllowedApplication()只把被勾选的应用流量导入 TUN,其他应用完全不受影响。 - 引擎在 TUN 上对应用侧实现了一个极简 TCP 栈(SYN 握手、序号/确认、RTO 与快速重传、零窗口探测、窗口缩放),远端方向用真实 socket 转发。
- 限速 = 双向令牌桶 + TCP 接收窗口收缩(应用拥塞窗口随之收缩,是真正的带宽限制而非丢包降速)。
- 丢包 = 按方向随机丢弃 IP 包;TCP 由协议栈自动重传,效果与真实网络丢包一致。
- 指定网络 = 出站 socket 先
protect()(防 VPN 回环)再Network.bindSocket()绑定 WiFi 或蜂窝;网络切换/丢失时自动断开旧连接,应用重连即走新网络。 - 断网 = 静默丢弃该应用全部包(含 TCP SYN),表现为无网络。
- 到 Releases 下载
NetBrake-<版本>.apk,直接安装 - 系统要求:Android 10(API 29)及以上
- 首次开启时系统会弹出「VPN 连接请求」,请点击「确定」
Release APK 默认使用 debug 签名(方便免配置直接安装)。debug keystore 由构建环境自动生成, 各次发布的签名并不相同,因此跨版本升级需要先卸载旧版。若 fork 本项目并在仓库 Secrets 中配置
KEYSTORE_BASE64/KEYSTORE_PASSWORD/KEY_ALIAS/KEY_PASSWORD,发布流程会改用正式签名,届时可直接覆盖升级。
- 打开 NetBrake → 「添加应用」→ 选择要管控的应用
- 设置规则(限速 / 丢包 / 网络),保存
- 打开顶部总开关,允许 VPN
- 修改规则即时生效;管控应用列表变化会自动重建 VPN
- 左滑规则条目可直接删除(删错了点「撤销」即可恢复)
# Android Studio: 直接打开工程,Run 即可
# 命令行(需 JDK 17+、Android SDK:platforms;android-34 与 build-tools;34.0.0):
./gradlew assembleDebug国内网络环境已在 settings.gradle 中配置了阿里云/腾讯云的 Maven 镜像。
- 仅 IPv4 转发:IPv6 流量全部导入 TUN 后静默丢弃,防止应用通过 v6 绕过管控(v6-only 环境下应用将无法联网)。
- ICMP 黑洞:ping 不通属于预期现象(TCP/UDP 不受影响)。
- IP 分片丢弃:极少数超大 UDP 包(>MTU 且应用不分片的场景)会被丢弃。
- DNS:由系统代发的查询无法归属到具体应用,按「不限速不丢包」直接转发(可正常解析)。转发时仅对 VPN 下发的私网段 DNS 快照做重映射:网络切换 / 「仅 WiFi/仅流量」后私网快照服务器(路由器地址、运营商内网 DNS)在出站网络不可达时,自动改用该网络自己的 DNS,避免解析超时表现为断网;公网 DNS 在任何网络都可达、保持原样,应用自选的 DNS(公共 DNS、局域网自定义解析器等)也一律原样转发,不受影响。
- 性能:纯 Kotlin 用户态转发,千兆带宽上限受限;限速/弱网模拟场景(≤ 数十 Mbps)完全够用。
- 指定网络的边界:Android 不允许普通应用创建任意的 per-app 路由,本工具的「仅 WiFi/仅流量」基于 socket 绑定实现,覆盖 TCP/UDP 全部流量;强制 WiFi 但 WiFi 不可用时应用表现为无法联网(符合预期)。
- 局域网发现:mDNS/SSDP/广播类设备发现依赖收发组播/广播,这类流量不走代理引擎——Android 13+(API 33)通过 VPN 路由排除留其在物理网络原生收发,发现正常,但组播/广播不参与限速/丢包管控(局域网单播仍受管控);子网定向广播(如
x.y.z.255)不在路由排除范围内,会进引擎按快速失败丢弃。Android 12 及以下无排除路由能力,被管控期间应用收不到任何局域网组播/广播通告,发现类功能不可用(单播访问局域网设备不受影响)。 - 若系统 ROM 限制
getConnectionOwnerUid,极少数连接可能无法识别归属应用,此时按「不限速」放行(保底可用,不会断网)。
app/src/main/java/com/netbrake/app/
├── App.kt # Application 入口
├── data/
│ ├── Rules.kt # 规则模型 + JSON 持久化仓库
│ └── AppList.kt # 已安装应用枚举
├── vpn/
│ ├── VpnBrakeService.kt # VpnService + 前台服务 + TUN 建立
│ └── EngineHolder.kt # UI<->引擎桥
├── core/
│ ├── Engine.kt # 转发引擎主体(TUN 读写/分发/UID 识别)
│ ├── IpPacket.kt # IPv4/TCP/UDP 解析与构造(含校验和)
│ ├── TcpSession.kt # 简化 TCP 栈 + socket 转发
│ ├── UdpFlow.kt # UDP 转发流
│ ├── TokenBucket.kt # 令牌桶限速
│ ├── NetworkHub.kt # WiFi/蜂窝网络追踪与 socket 绑定
│ └── Stats.kt # 流量统计
└── ui/
├── MainActivity.kt # 主页(总开关/规则列表/实时速率)
├── AppPickerActivity.kt # 应用选择器(搜索/系统应用)
├── RuleEditActivity.kt # 规则编辑(网络/限速/丢包/预设)
└── RulesAdapter.kt # 列表适配器
MIT © kegechen
本工具仅提供本机网络管控能力,请在自己拥有或已获授权的设备上使用。