基于 ClashMetaForAndroid 定制的 V2Board 订阅客户端,集成了 V2Board 账号登录、订阅自动同步、多域名回退、多账号管理等功能,同时完整保留原版 Clash Meta 的代理能力。
当前版本:v2.0.22
- 账号登录 — 首次安装自动跳转 V2Board 登录页,登录状态持久化(基于 localStorage),无需重复登录
- 多账号管理 — 支持多个 V2Board 账号,通过邮箱自动识别:
- 同一邮箱 → 自动更新对应订阅配置
- 不同邮箱 → 自动创建新订阅(蓝星、蓝星1、蓝星2...)并激活
- 订阅自动同步 — 支持自定义同步间隔,后台静默完成
- 多域名自动回退 — 内置域名不可用时自动探测备用域名,保障可用性
- 账户信息展示 — 主页卡片实时显示:
- 运行状态 + 上下行流量(简写格式:↑1.2M ↓3.4G)
- 代理模式(Rule/Direct/Global)
- 套餐名称、到期时间、余额
- 帮助/知识库 — 内置 V2Board 知识库与关于页面
- 支持 Shadowsocks、VMess、VLESS、Trojan、Hysteria2、TUIC、WireGuard 等主流协议
- 基于 mihomo 内核,兼容 Clash Meta 配置格式
- TUN 模式全局代理(需 VPN 权限)
- 规则路由、DNS 覆盖、Fake-IP 等高级功能
- 支持 GeoIP / GeoSite 数据库进行地域分流
ClashMetaForAndroid/
├── app/ # 主应用模块
│ └── src/main/
│ ├── java/ # Activity、Service、工具类
│ ├── res/ # 资源文件
│ └── assets/ # 内置资源(about.html、geo 数据)
├── core/ # 核心代理模块
│ └── src/
│ ├── foss/golang/ # Go 原生代码(mihomo 内核,外部依赖不修改)
│ │ └── clash/
│ │ ├── adapter/
│ │ │ ├── inbound/ # 入站适配器(HTTP/HTTPS/SOCKS5)
│ │ │ ├── outbound/ # 出站协议(VLESS/VMess/Trojan/Shadowsocks等)
│ │ │ ├── outboundgroup/ # 出站组(负载均衡/故障转移/URL测试)
│ │ │ └── provider/ # 订阅提供者
│ │ ├── common/ # 公共工具(缓存、并发、网络工具)
│ │ │ ├── arc/ # ARC 缓存
│ │ │ ├── atomic/ # 原子操作
│ │ │ ├── lru/ # LRU 缓存
│ │ │ ├── net/ # 网络工具
│ │ │ └── pool/ # 对象池
│ │ ├── component/ # 组件(加密、证书、DNS等)
│ │ │ ├── age/ # age 加密
│ │ │ ├── ca/ # CA 证书管理
│ │ │ ├── cidr/ # CIDR 处理
│ │ │ ├── dialer/ # 拨号器
│ │ │ ├── fakeip/ # Fake-IP
│ │ │ └── geodata/ # GeoIP/GeoSite
│ │ ├── config/ # 配置解析
│ │ ├── constant/ # 常量定义
│ │ ├── dns/ # DNS 模块
│ │ ├── hub/ # 核心 Hub
│ │ ├── log/ # 日志系统
│ │ ├── rule/ # 规则引擎
│ │ ├── tunnel/ # 隧道模块
│ │ └── transport/ # 传输层(WebSocket/HTTP2/QUIC)
│ ├── main/golang/ # Go JNI 桥接层(可修改)
│ │ └── native/
│ │ ├── optimize/ # 网络优化(TCP参数/连接池/DNS缓存)
│ │ │ ├── socket_optimize.go # Socket 参数优化
│ │ │ ├── tcp_pool.go # TCP 连接池
│ │ │ ├── hook.go # 优化钩子
│ │ │ └── optimizer.go # 优化器主类
│ │ ├── bridge.c # C 桥接
│ │ ├── delegate/ # 代理委托
│ │ ├── main.go # Go 入口
│ │ └── tun.go # TUN 模块
│ └── main/cpp/ # C JNI 桥接层
├── service/ # 后台服务模块
│ └── src/main/java/ # ClashService、TunService、ProfileManager
├── design/ # UI 设计模块
│ └── src/main/
│ ├── java/ # Design 类(Activity UI 层)
│ └── res/ # 布局、样式、国际化资源
├── common/ # 公共工具模块
├── v2board/ # V2Board 集成模块
│ └── src/main/java/ # 配置管理、会话、同步逻辑
└── hideapi/ # Android 隐藏 API 访问
| 目录 | 说明 | 是否可修改 |
|---|---|---|
app/ |
Android 主应用模块 | ✅ 可修改 |
core/src/foss/golang/ |
mihomo 内核代码(Git 子模块) | ❌ 外部依赖,不修改 |
core/src/main/golang/ |
Go JNI 桥接层和优化代码 | ✅ 可修改 |
core/src/main/cpp/ |
C/C++ JNI 桥接层 | ✅ 可修改 |
service/ |
后台服务模块 | ✅ 可修改 |
design/ |
UI 设计模块 | ✅ 可修改 |
v2board/ |
V2Board 集成模块 | ✅ 可修改 |
| 依赖 | 版本要求 |
|---|---|
| Android SDK | compileSdk 35,minSdk 21 |
| JDK | OpenJDK 11+ |
| NDK | 29.0.14206865 |
| Go | 1.20+ |
| CMake | 3.0+ |
| Gradle | 8.8.0+ |
git clone --recurse-submodules https://github.com/<your-org>/ClashMetaForAndroid.git
cd ClashMetaForAndroid如已克隆但未拉取子模块:
git submodule update --init --recursive
在项目根目录创建 local.properties:
# Android SDK 路径(必填)
sdk.dir=/path/to/android-sdk
# 自定义应用包名(可选)
custom.application.id=com.my.compile.clash
# 去掉包名后缀(可选,设为 true 后包名不再带 .alpha/.meta 后缀)
remove.suffix=true编辑项目根目录的 v2board.properties 文件(与 build.gradle.kts 同级):
# 主服务端 URL(必填,用于 API 调用)
v2board.server.url=https://your-domain.com
# 备用域名列表(可选,逗号分隔,主域名不可用时自动逐个探测)
v2board.server.domains=https://domain1.com,https://domain2.com,https://domain3.com
# 订阅同步间隔(可选,单位:分钟,默认 1440 = 24 小时)
v2board.sync.interval=1440
# 应用显示名称(可选,仅用于内部标识)
v2board.app.name=蓝星网络多域名通过 v2board.server.domains 字段配置,多个 URL 用英文逗号 , 分隔,不要有空格。
配置示例(实际项目中的写法):
# 主域名 + 2 个备用域名
v2board.server.domains=https://jc.lxseek.com,https://go.lxkjzh.top,https://cdn.lxkjzh.top域名回退逻辑(运行时自动执行):
1. 优先使用用户登录后动态获取的后端地址(serverUrl)
2. 若为空,使用 v2board.server.url 作为主域名
3. 若主域名不通,依次尝试 v2board.server.domains 中的每个域名
4. 全部失败 → 提示用户检查网络
注意:修改此文件后需重新编译 APK 才能生效。配置在构建时注入
BuildConfig,运行时由ConfigManager从 assets 中读取,两者保持一致。
创建 signing.properties:
keystore.password=<password>
key.alias=<alias>
key.password=<password>签名文件放置于项目根目录,命名为 release.keystore。
配置优先级:GitHub Secrets > .env 文件
如果设置了 GitHub Secrets,会使用 Secrets 的值;否则从 .env 文件读取。
方法一:使用 GitHub Secrets(推荐)
在 GitHub 仓库的 Settings → Secrets and variables → Actions 中添加以下 Secrets:
| Secret 名称 | 值 |
|---|---|
SIGNING_STORE_PASSWORD |
密钥库密码(如 ojbkxc) |
SIGNING_KEY_ALIAS |
密钥别名(如 ojbkxc) |
SIGNING_KEY_PASSWORD |
密钥密码(如 ojbkxc) |
V2BOARD_SERVER_URL |
前端域名(如 jc.lxseek.com) |
V2BOARD_SERVER_DOMAINS |
域名列表(如 jc.lxseek.com) |
方法二:使用 .env 文件(适用于本地测试)
创建 .env 文件:
SIGNING_STORE_PASSWORD=ojbkxc
SIGNING_KEY_ALIAS=ojbkxc
SIGNING_KEY_PASSWORD=ojbkxc
V2BOARD_SERVER_URL=jc.lxseek.com
V2BOARD_SERVER_DOMAINS=jc.lxseek.com注意:
- CI 会自动生成签名密钥库,无需手动上传
release.keystore文件- 确保三个签名配置的值完全一致(建议都使用相同的值)
在 app/src/main/assets/v2board.properties 中配置:
v2board.server.url=jc.lxseek.com
v2board.server.domains=jc.lxseek.com,backup.lxseek.com注意:域名可以不带
https://前缀,系统会自动添加。
在 GitHub Secrets 中添加:
| Secret 名称 | 值示例 |
|---|---|
V2BOARD_SERVER_URL |
jc.lxseek.com |
V2BOARD_SERVER_DOMAINS |
jc.lxseek.com,backup.lxseek.com |
注意:域名可以不带
https://前缀,系统会自动添加。
# Alpha 版本
./gradlew app:assembleAlphaRelease
# Meta 版本
./gradlew app:assembleMetaRelease编译产物输出至 app/release/ 目录。
首次安装
→ 启动 App → 检测 hasEverLoggedIn = false
→ 打开 V2Board 登录页(WebView)
→ 用户登录 → JS Bridge 捕获 auth_data
→ 保存到 SharedPreferences → hasEverLoggedIn = true
→ 自动同步订阅 → 进入主页
再次启动
→ 检测 hasEverLoggedIn = true → 直接进入主页
→ 不发起任何网络请求
→ 点击 Logo 进入账户时才加载 WebView
WebView 加载时
→ 在 onPageStarted 中自动注入已保存的 auth_data 到 localStorage
→ 前端路由守卫检查到登录状态 → 自动跳转仪表盘
→ 无需用户重新登录
用户 A ([email protected]) 首次登录
→ 创建订阅配置:蓝星
→ 自动激活
用户 B ([email protected]) 登录
→ 检测到邮箱不同 → 创建订阅配置:蓝星1
→ 自动激活为当前配置
用户 A 再次登录(切换回)
→ 检测到邮箱相同 → 更新订阅配置:蓝星
→ 自动激活
注意:订阅命名基于
v2board.properties中的v2board.app.name配置,默认为"蓝星"。
1. 优先使用 config.serverUrl(已探测成功的域名或登录后动态获取的后端地址)
2. 其次使用 ConfigManager 中的主域名(v2board.server.url,仅作为首次启动 fallback)
3. 最后使用 v2board.properties 中的域名列表(v2board.server.domains)逐个探测
4. 全部失败 → 提示用户检查网络或配置
| 文件 | 职责 |
|---|---|
ConfigManager.kt |
统一配置管理,从 v2board.properties 读取配置 |
V2BoardConfig.kt |
多域名配置、同步间隔管理 |
V2BoardSession.kt |
登录态持久化(SharedPreferences、localStorage 注入)、邮箱→订阅 UUID 映射 |
V2BoardSync.kt |
域名回退、API 调用、单例管理、fetchSubscribeUrl / fetchUserInfo |
V2BoardActivity.kt |
WebView 壳(登录/用户中心/套餐/关于/知识库)、JS Bridge 实现 |
V2BoardAutoSync.kt |
订阅自动同步到 Profile、多账号检测与配置创建/更新 |
V2BoardDesign.kt |
WebView UI 层、配置 |
域名更新地址应返回如下格式的 JSON:
{
"domains": ["https://new-domain1.com", "https://new-domain2.com"],
"update_url": "https://new-update-server.com"
}项目通过 Gradle productFlavors 提供两个变体:
| 变体 | 包名后缀 | 说明 |
|---|---|---|
alpha |
.alpha |
默认变体,开发/测试使用 |
meta |
.meta |
发布变体 |
可通过 local.properties 中 remove.suffix=true 去掉包名后缀。
| 组件 | 用途 |
|---|---|
| mihomo | 代理核心引擎(Git 子模块) |
| OkHttp | 网络请求(V2Board API、订阅同步) |
| Room | 本地数据库(代理选择、导入记录) |
| Kotlin Serialization | JSON 序列化 |
| kaidl | AIDL 接口代码生成 |
| AndroidX | 基础 UI 组件 |
本项目基于 GPLv3 许可证发布。
贡献代码即表示您同意将代码合并至项目的闭源分支,其余条款遵循 GPLv3 协议。详见 CONTRIBUTING.md。
- 多账号支持:通过邮箱自动识别用户,同一邮箱更新订阅,不同邮箱创建新订阅配置
- 登录优化:WebView 加载时自动注入 localStorage,消除重复登录需求
- UI 优化:主界面卡片布局优化,流量显示简写格式(↑1.2M ↓3.4G)
- 信息同步:切换账号后自动重新获取用户信息(套餐、到期时间、余额)
- 编译修复:移除废弃的 WebView API,适配最新 Android SDK
- 网络优化:
- TCP 参数增强:添加 TCP_QUICKACK(快速ACK响应)、SO_KEEPALIVE(连接保活)、增大缓冲区(256KB/128KB)
- 连接超时控制:添加 15 秒默认超时,避免无限等待
- DNS 缓存预热:支持并行预取多个域名的 DNS 解析结果
- 首次登录引导:新增欢迎弹窗,点击"知道了"后自动打开登录页面
- UI 细节优化:
- 运行状态卡片右侧显示套餐名称和到期日期
- 代理模式卡片只显示模式名称
- 配置卡片显示激活状态(配置:已激活/未激活)
- 图标替换:运行状态图标从打勾改为闪电图标