Flipper Zero 二次开发记录
Flipper Zero 二次开发
这篇主要记录一下 Flipper Zero 的二次开发流程。现在先不碰完整固件源码,主要基于三方优化系统 Momentum 做 External App,也就是最后生成 .fap 插件,放到 SD 卡里运行。
目前基于三方优化系统 Momentum 来进行学习,该系统被公认为目前三方里比较好用的一版。
一、上位机、固件和文件系统
Windows 上位机安装。
本地安装包原来放的是:
1 | flipper zero电脑管理软件.exe |
安装三方固件时,用的是 Momentum 的更新包:
1 | flipper-z-f7-update-mntm-dev-42630e91.tgz |
这里不要再在文章里直接引用本机 Downloads 路径。博客部署之后读不到本地路径,所以只记录文件名,实际文件按自己的电脑位置导入即可。

文件系统大概长这样:

这里后面会用到的是 SD 卡里的 apps 目录。External App 编译出来之后,本质上就是把 .fap 文件放进对应分类目录,比如 apps/Tools。
二、开发环境
先创建工作目录:
1 | mkdir FlipperZero_Dev |
创建或者进入虚拟环境。原来我这里写的是直接激活:
1 | conda activate flipper_dev |
如果这个环境还没有建,可以先建一个再激活:
1 | conda create -n flipper_dev python=3.11 |
安装 ufbt:
1 | pip install ufbt |
下载 Momentum 对应的 SDK:
1 | ufbt update |
这一步会把后面编译 External App 需要的工具链和 SDK 拉下来。后面如果换了固件版本,SDK 最好也跟着更新一次,不然容易出现 API 或 ABI 对不上的问题。
三、创建项目与配置
创建项目文件夹,比如这里叫 app01:
1 | mkdir app01 |
执行创建命令:
1 | ufbt create appid=my_first_app |
my_first_app 是这个 APP 的 ID。这个 ID 后面会影响生成的 .fap 文件名,也会和配置里的入口函数绑定,所以一开始就尽量别乱改。
进入项目文件夹之后执行:
1 | ufbt vscode_dist |
这个命令主要是给 VS Code 生成开发时需要的配置,方便代码补全和跳转。
项目里比较核心的是应用配置。这里先用一个最小可跑的版本:
1 | App( |
注释版放这里,后面回看配置时比较方便:
1 | App( |
官方模板大概是这个写法:
1 | App( |
这里有几个配置容易对不上:
appid会影响生成文件名,比如my_first_app.fap。entry_point必须和 C 文件里的入口函数名一致。requires=["gui"]这种依赖要和代码里实际用到的模块同步。fap_icon如果写了,就必须真的有这个文件,而且格式要满足要求。fap_category="Tools"决定最后应该把.fap放到apps/Tools下面。
代码文件重命名为:
1 | my_first_app.c |
这里文件名本身不是最关键的,关键是里面的入口函数要和 entry_point="my_first_app_app" 对上。
四、编译和安装
编译直接执行:
1 | ufbt |
编译完之后,把生成的文件复制到 Flipper Zero 的 SD 卡目录:
1 | dist/my_first_app.fap |
目标位置是:
1 | apps/Tools |
放进去之后,就可以在 Flipper Zero 的 Tools 分类里看到这个 APP。


图标和名字能看到,说明配置和 .fap 基本已经对上了。

五、设置主菜单快捷键
接下来,把这个设置成主菜单快捷键。
去 Settings 里面找到 Desktop,然后进 Keybinds Setup。在 Press 里找到想绑定的按键,再把它绑定到 External App 里面的 Tools,选择自己写的 app。

比如说我绑定的是下键短按。来到海豚画面的时候,点按下键就可以直接进入这个 app。
六、为什么先写 External App
Flipper Zero 的软件生态由集成在固件内部的 Main App 和存储在 SD 卡上的 External App,也就是 FAP 插件共同构成。Main App 比如 Sub-GHz 或 NFC,属于系统核心,启动快,也在主菜单里,但开发门槛很高。任何微改都需要克隆很大的源码,还要承担重刷固件导致变砖的风险。
作为第三方的 Tools 插件,本质上都是 External App。它们通过 Loader 服务动态加载到内存运行,虽然分类上被放在 Tools 文件夹下,但功能调用上和系统应用差别没有想象中那么大。
我这里选择 External App 的原因很简单:它把应用逻辑和系统内核拆开了。用 ufbt 就能快速构建和调试,开发周期短很多,而且安全性更高。即使代码崩了,通常也只是退出程序,不会破坏设备固件。
这种形式生成的 .fap 文件也方便分发。别人不需要刷机,直接放到对应目录就能用。后面要做创意功能、硬件交互、自定义工具,External App 是比较合适的起点。





