All components of Flipper Zero firmware — services, user applications, system settings — are developed independently. Each component has a build system manifest file, named application.fam, which defines basic properties of that component and its relations to other parts of the system.
When building firmware, fbt collects all application manifests and processes their dependencies. Then it builds only those components that are referenced in the current build configuration. See fbt docs for details on build configurations.
Properties of a firmware component are declared in a form of a Python code snippet, forming a call to App() function with various parameters.
Only 2 parameters are mandatory: appid and apptype, others are optional and may only be meaningful for certain application types.
appid: string, application id within the build system. Used for specifying which applications to include in build configuration and to resolve dependencies and conflicts.
apptype: member of FlipperAppType.* enumeration. Valid values are:
| Enum member | Firmware component type |
|---|---|
| SERVICE | System service, created at early startup |
| SYSTEM | Application not being shown in any menus. Can be started by other apps or from CLI |
| APP | Regular application for main menu |
| PLUGIN | Application to be built as a part of firmware an to be placed in Plugins menu |
| DEBUG | Application only visible in Debug menu with debug mode enabled |
| ARCHIVE | One and only Archive app |
| SETTINGS | Application to be placed in System settings menu |
| STARTUP | Callback function to run at system startup. Does not define a separate app |
| EXTERNAL | Application to be built as .fap plugin |
| METAPACKAGE | Does not define any code to be run, used for declaring dependencies and application bundles |
fbt will abort firmware build process.ps and free CLI commands to profile your app's memory usage.The following parameters are used only for FAPs:
["*.c*"] includes C and CPP source files..fam file contains one or more Application definitions. For example, here's a part of applications/service/bt/application.fam:
App(
appid="bt_start",
apptype=FlipperAppType.STARTUP,
entry_point="bt_on_system_start",
order=70,
)
App(
appid="bt_settings",
name="Bluetooth",
apptype=FlipperAppType.SETTINGS,
entry_point="bt_settings_app",
stack_size=1 * 1024,
requires=[
"bt",
"gui",
],
order=10,
)
For more examples, see .fam files from various firmware parts.