问题描述: - UI快速显示切换到新节点,但后台代理仍使用原节点 - 根本原因:异步操作未等待完成,导致竞态条件 - UI更新(<5ms) vs 后台操作(100-500ms) 时间差导致不同步 解决方案 - 完全重构(方案1): 1️⃣ 新增统一的节点切换方法 kr_performNodeSwitch() - 包含完整的异步/等待机制 - 显示加载状态反馈 - 失败时自动恢复 - 返回success/failure标识 2️⃣ 修改所有节点选择点 (4个InkWell位置) - 从同步改为async/await - 调用统一的kr_performNodeSwitch()方法 - 仅在成功后关闭列表窗口 3️⃣ 简化kr_selectNode()方法 - 从70行减少到3行 - 现在只是委托给kr_performNodeSwitch() - 保持向后兼容性 修改文件: - lib/app/modules/kr_home/controllers/kr_home_controller.dart * 新增kr_performNodeSwitch()方法(+93行) * 简化kr_selectNode()方法(-67行) * 新增KRCommonUtil导入 - lib/app/modules/kr_home/views/kr_home_node_list_view.dart * 修改4个InkWell的onTap处理 * 添加async/await和错误处理 * 全部更新为统一的节点切换调用 编译验证: ✅ 通过 - kr_home_controller.dart: 无错误 - kr_home_node_list_view.dart: 无新增错误 测试验证: - ✅ UI显示加载状态 - ✅ 等待后台完成后关闭列表 - ✅ 失败时显示错误提示并恢复 - ✅ 实际代理确实切换到新节点 - ✅ 无重复调用问题 (cherry picked from commit c0c86dcb43d69e452d729a82a07db4cd34597082)
LighthouseApp 技术文档
欢迎查阅 LighthouseApp 技术文档。本目录包含项目的架构设计、开发指南和故障排查信息。
📚 文档导航
Clash Meta 核心 (推荐阅读)
| 文档 | 说明 | 适用人群 |
|---|---|---|
| 架构文档 | 完整架构设计、数据流、关键决策 | 所有开发者 |
| 编译指南 | 本地编译步骤、环境配置、优化方法 | 核心开发者 |
| 故障排查 | 常见问题、日志分析、崩溃调试 | 测试/运维 |
CI/CD 工作流
| 文档 | 说明 |
|---|---|
| GitHub Actions 说明 | 自动化构建、发布流程 |
🚀 快速开始
新开发者入门
-
了解架构 (必读)
- 阅读 CLASH_ARCHITECTURE.md
- 理解 Dart → Android → Go 三层架构
- 掌握 FFI 通信机制
-
配置开发环境
- 按照 CLASH_BUILD_GUIDE.md 配置环境
- 编译第一个 Clash Core
- 验证编译结果
-
运行项目
# 1. 获取代码 git clone <repo-url> cd LighthouseApp # 2. 初始化子模块 git submodule update --init --recursive # 3. 编译核心 cd core make android-arm64 # 4. 运行 Flutter cd .. flutter pub get flutter run
核心开发者
如果您需要修改 Clash Meta 核心:
-
修改代码
cd core vim lib_android.go # 或其他核心文件 -
本地测试
make android-arm64 flutter run -
提交 PR
- CI/CD 会自动构建所有架构
- 检查 Actions 页面的构建结果
- 等待代码审查
🏗️ 架构速览
┌─────────────────────────────────────────────────────────────┐
│ LighthouseApp │
├─────────────────────────────────────────────────────────────┤
│ Flutter/Dart Layer │
│ └─ lib/app/services/clash_imp/ │
│ ├─ kr_clash_imp.dart (核心封装) │
│ ├─ clash_ffi.dart (FFI 绑定) │
│ └─ clash_config_generator (配置生成) │
├─────────────────────────────────────────────────────────────┤
│ Android Native Layer │
│ └─ android/app/src/main/kotlin/com/hiddify/hiddify/ │
│ ├─ bg/VPNService.kt (VPN 服务) │
│ └─ bg/ClashService.kt (Clash 服务) │
├─────────────────────────────────────────────────────────────┤
│ Go Core Layer │
│ └─ core/ │
│ ├─ Clash.Meta/ (Git 子模块) │
│ ├─ lib_android.go (JNI 桥接) │
│ └─ libclash.so (编译产物) │
└─────────────────────────────────────────────────────────────┘
详细架构请参考 CLASH_ARCHITECTURE.md
🔧 常见任务
编译核心
cd core
# 单个架构 (快速)
make android-arm64
# 所有架构 (发布)
make android-all
# 清理
make clean
# 验证
make verify
更新 Clash.Meta
cd core
make update # 更新子模块到最新版本
make android-arm64 # 重新编译
调试问题
# 查看 Android 日志
adb logcat -s "A/Clash" "E/Clash"
# 查看编译详情
cd core
go build -v -x -buildmode=c-shared -o test.so .
# 验证 SO 文件
nm -D libclash.so | grep quickStart
📖 核心概念
1. FFI 并发安全
问题: Go 运行时初始化不是线程安全的
解决: 使用 Completer 实现初始化锁
Future<void> _ensureInitialized() async {
if (_initialized) return;
if (_initLock != null) {
await _initLock!.future; // ✅ 等待其他初始化
return;
}
// ... 执行初始化
}
详见 CLASH_ARCHITECTURE.md § 并发安全保证
2. Service Isolate 架构
为什么需要?
- VPN 服务运行在后台
- 主 Isolate 可能被销毁
- 需要独立的 Dart 运行时
实现:
// ClashService.kt
serviceEngine = FlutterEngine(Application.application)
val entrypoint = DartExecutor.DartEntrypoint(..., "_clashService")
serviceEngine?.dartExecutor?.executeDartEntrypoint(entrypoint)
详见 CLASH_ARCHITECTURE.md § Service Isolate 架构
3. Android VPN 路由配置
关键: getAndroidVpnOptions() 返回 35+ 详细 CIDR 路由
为什么重要?
- 避免 PermissionMonitor error 22
- 支持 bypass-LAN
- 兼容模拟器
详见 CLASH_TROUBLESHOOTING.md § 问题 1
🐛 遇到问题?
-
查看故障排查文档
- CLASH_TROUBLESHOOTING.md 包含所有常见问题
-
收集诊断信息
# 系统信息 adb shell "getprop ro.build.version.release" # 应用日志 adb logcat -d > full_log.txt # 核心信息 cd core make verify -
提交 Issue
- 使用诊断信息模板
- 包含复现步骤
- 附上日志文件
🤝 贡献指南
代码规范
项目遵循以下原则:
- KISS (Keep It Simple, Stupid) - 简单至上
- DRY (Don't Repeat Yourself) - 杜绝重复
- SOLID - 面向对象设计原则
- YAGNI (You Aren't Gonna Need It) - 精益求精
提交流程
- Fork 项目
- 创建特性分支 (
git checkout -b feature/amazing) - 提交更改 (
git commit -m 'feat: add amazing feature') - 推送分支 (
git push origin feature/amazing) - 创建 Pull Request
Commit 规范
使用 Conventional Commits:
feat:新功能fix:修复 Bugdocs:文档更新refactor:代码重构perf:性能优化test:测试相关chore:构建/工具链
📞 获取帮助
- GitHub Issues: 提交问题
- 文档索引: 您正在阅读!
- 外部资源:
📝 更新日志
| 日期 | 版本 | 更新内容 |
|---|---|---|
| 2025-10-25 | 1.0.0 | 完成 Xboard-Mihomo 核心集成 |
| 2025-10-25 | 1.0.0 | 修复 FFI 并发安全问题 |
| 2025-10-25 | 1.0.0 | 添加完整技术文档 |
📄 许可证
本项目采用 LICENSE 许可证。
最后更新: 2025-10-25 维护者: LighthouseApp 开发团队
Description
Languages
Dart
82.6%
Kotlin
6.7%
Swift
4.3%
C++
2.1%
CMake
1.4%
Other
2.7%