vFlow 是一款为 Android 平台设计的、强大且高度可扩展的自动化工具。它允许你通过图形化界面,将一系列“动作模块”自由组合成强大的“工作流”,从而自动完成各种日常的、重复性的屏幕操作任务。
vFlow 的核心设计理念 是将复杂的自动化逻辑分解为一个个独立、可复用、易于理解的模块。无论是简单的“每日签到”,还是包含复杂条件判断和循环的“自动化测试流程”,vFlow 都旨在提供一个直观、灵活且强大的平台。
项目完全采用 Kotlin 编写,并遵循现代 Android 开发实践。其核心架构(模块注册表、动态 UI 生成器、类型安全的执行上下文)被精心设计,不仅保证了当前功能的稳定性,也为未来添加更多、更强大的自动化模块提供了无限可能。无论你是希望解放双手的普通用户,还是寻求灵感和实践的开发者,vFlow 都欢迎你的探索和贡献。
![]() |
![]() |
![]() |
| 首页 | 工作流编辑 | 模块管理器 |
- 可视化流程编辑器: 通过拖拽和点击,像搭积木一样构建你的自动化流程。
- 高度模块化: 每个功能(如点击、查找文本、判断)都是一个独立的模块,易于维护和扩展。
- 动态数据流: 模块的输出可以作为后续模块的输入(“魔法变量”),实现复杂的逻辑联动。
- 强大的逻辑控制: 支持“如果/否则”条件判断和“循环”等控制流,让你的工作流更智能。
- 动态参数编辑: 编辑器 UI 会根据你选择的参数(例如,“如果”模块中变量的类型)动态变化,只显示相关的选项。
- 完善的权限管理: 在执行前清晰地请求工作流所需的权限,并提供统一的管理入口。
- 现代 UI 设计: 基于 Material 3 和动态取色,提供美观且个性化的用户界面。
- 导入与导出: 轻松备份、恢复和分享你的工作流。
vFlow App 的核心是其高度解耦的模块化架构。
-
模块 (Module)
- 所有自动化动作的实现基础,每个模块都实现了
ActionModule接口。 - 模块负责定义自身的元数据(名称、图标)、输入输出参数、UI 摘要、执行逻辑以及所需权限。
- 示例:
ClickModule,IfModule,LoopModule。
- 所有自动化动作的实现基础,每个模块都实现了
-
模块注册表 (ModuleRegistry)
- 一个单例对象,在应用启动时注册所有可用的模块。
- 为应用的其他部分(如动作选择器)提供按分类获取模块的能力。
-
工作流编辑器 (Workflow Editor)
WorkflowEditorActivity是核心 UI,负责展示和操作ActionStep列表。ActionStepAdapter将ActionStep数据渲染为用户可见的卡片列表。ActionEditorSheet是一个通用的底部表单,它能根据任何模块的InputDefinition动态生成编辑界面,实现了 UI 与模块逻辑的完全解耦。
-
工作流执行器 (WorkflowExecutor)
- 负责按顺序执行工作流中的每一个步骤。
- 为每个步骤创建包含上下文信息(如魔法变量值、服务实例)的
ExecutionContext。 - 处理模块返回的不同结果,如成功、失败,或跳转、循环等流程控制信号。
vFlow Core 采用 Master-Worker 多进程架构,基于 TCP Socket 通信与自定义 JSON-RPC 协议,将指令动态路由至 Shell 或 Root 权限的子进程执行,实现了严格的权限隔离与高效的系统服务管控。
- 克隆仓库:
git clone https://github.com/ChaoMixian/vflow.git
- 使用 Android Studio 打开项目。
- 等待 Gradle 同步完成。
- 直接运行项目到你的设备或模拟器上。
我们非常欢迎各种形式的贡献!无论是提交 Issue、修复 Bug、添加新功能模块还是改进文档,都对项目意义重大。
- Fork 本仓库。
- 创建你的功能分支 (
git checkout -b feature/AmazingFeature)。 - 提交你的改动 (
git commit -m 'Add some AmazingFeature')。 - 推送到你的分支 (
git push origin feature/AmazingFeature)。 - 创建一个 Pull Request。
vFlow 最常见的贡献方式就是添加新的模块。步骤如下:
- 在
com.chaomixian.vflow.core.workflow.module包下的相应分类中创建一个新的 Kotlin 类。 - 让它继承自
BaseModule或BaseBlockModule。 - 实现
ActionModule接口中的必要属性和方法(如id,metadata,getInputs,getOutputs,execute)。 - 在
ModuleRegistry.kt的initialize()方法中注册你的新模块。 - 就是这样!你的模块现在应该会自动出现在动作选择器中并可以正常使用了。
本项目采用 GPL License 许可证。



