
Zig プログラミング言語を使用して Flipper Zero アプリケーションを開発するための、モダンで本番環境対応のテンプレートです。このプロジェクトは Zig と Flipper Zero SDK を統合する合理化されたビルドシステムを提供し、開発者が Flipper Zero プラットフォーム向けに型安全かつメモリ安全なアプリケーションを記述できるようにします。
このテンプレートは、Zig の強力なビルドシステムと言語機能を Flipper Zero ファームウェア開発キットに橋渡しします。Zig の ARM Cortex-M4 クロスコンパイルと Flipper SDK の間の複雑な統合を処理し、カスタムアプリケーションのためのクリーンな出発点を提供します。
ufbt(非公式ビルドツール)とのシームレスな統合このテンプレートは2段階のビルドプロセスを使用します:
Zig ビルド段階: Zig ソースを ARM Cortex-M4 オブジェクトファイル(app.o)にコンパイル
cortex-m4 CPU モデルを備えた thumb アーキテクチャeabihf(組み込みアプリケーション・バイナリ・インターフェース、ハードフロート)ReleaseSmallUFBT パッケージ段階: オブジェクトファイルを SDK とリンクし、.fap 形式にパッケージング
ufbt コマンドの実行に必要ufbt によって自動管理(~/.ufbt にインストール)このテンプレートは ARM ツールチェーンパスを使用する ARM64 macOS 用に事前構成されています:
~/.ufbt/toolchain/arm64-darwin/arm-none-eabi/include
別のプラットフォームを使用している場合は、build.zig:31 の arm_libc_include パスを自分のツールチェーンの場所に合わせて調整する必要があるかもしれません。
UFBT をインストール:
python3 -m pip install --upgrade ufbt
ufbt update
このテンプレートをクローンまたはダウンロード:
git clone https://github.com/yourusername/flipper-template.git
cd flipper-template
プロジェクトを初期化:
zig build init
この対話型スクリプトは次の項目を要求します:
my_custom_app)Zig ソースをオブジェクトファイルにコンパイル:
zig build
これにより、コンパイルされたすべてのアプリケーションコードを含む zig-out/bin/app.o が作成されます。
完全なアプリケーションをビルドしてパッケージング:
zig build fap
これにより完全なパイプラインが実行されます:
ufbt を呼び出して SDK とリンクdist/ ディレクトリに .fap ファイルを生成接続された Flipper Zero 上でアプリケーションを直接起動:
zig build launch
これにより、ビルド、パッケージング、USB 経由での転送が行われ、アプリが自動的に起動します。
flipper-template/
├── application.fam # Flipper アプリマニフェスト(メタデータ、エントリポイント)
├── build.zig # Zig ビルドシステム設定
├── build.zig.zon # Zig パッケージマニフェスト
├── icon.png # アプリアイコン(10x10px 推奨)
├── setup.sh # 対話型プロジェクト初期化スクリプト
├── src/
│ └── root.zig # メインアプリケーションソースコード
└── zig-out/ # ビルド成果物(生成)
└── bin/
└── app.o # コンパイル済みオブジェクトファイル
src/root.zig: start() 関数とアプリケーションロジックを含むエントリポイントapplication.fam: Flipper 固有の設定(アプリ ID、カテゴリ、依存関係、スタックサイズ)build.zig: コンパイルターゲット、SDK パス、ビルドコマンドを定義このテンプレートには、コアとなる Flipper API を示す「Hello World」の例が含まれています:
// Import Flipper SDK functions
const flipper = @cImport({
@cInclude("furi.h");
@cInclude("gui/gui.h");
@cInclude("gui/canvas.h");
@cInclude("gui/view_port.h");
});
// Application entry point (must be named "start")
export fn start(_: ?*anyopaque) callconv(.{ .arm_aapcs = .{} }) i32 {
// Initialize GUI viewport
const gui = flipper.furi_record_open("gui");
const view_port = flipper.view_port_alloc();
// Set up callbacks and UI
// ... (see src/root.zig for complete implementation)
// Event loop
_ = flipper.furi_thread_flags_wait(1, flipper.FuriFlagWaitAny, flipper.FuriWaitForever);
return 0;
}
ビルドシステムは以下のインクルードパスを自動的に構成します:
すべてのヘッダーは Zig コード内の @cImport() で利用できます。
Flipper SDK は ARM AAPCS 呼び出し規約を使用します:
start() エントリポイント)エクスポートされた関数が期待される呼び出し規約と一致していることを確認してください:
export fn start(_: ?*anyopaque) callconv(.{ .arm_aapcs = .{} }) i32
export fn draw_callback(canvas: ?*Canvas, ctx: ?*anyopaque) callconv(.{ .arm_aapcs_vfp = .{} }) void
一部の SDK ヘッダーには、Zig の C トランスレータが処理できない構造(例: input/input.h の不透明型を含む共用体)が含まれています。そのような場合は、外部関数を手動で宣言してください:
extern fn view_port_input_callback_set(
view_port: ?*flipper.ViewPort,
callback: ?*const fn (?*anyopaque, ?*anyopaque) callconv(.{ .arm_aapcs_vfp = .{} }) void,
context: ?*anyopaque
) callconv(.{ .arm_aapcs = .{} }) void;
問題: unable to find header 'furi.h'
~/.ufbt パスが正しくないufbt update を実行して SDK ヘッダーをインストール問題: undefined reference to 'view_port_alloc'
zig build ではなく zig build fap を使用してリンクを完了する問題: No Flipper device found
問題: 起動時にアプリがクラッシュする
application.fam の stack_size を増やすか、関数シグネチャを確認build.zig の addFlipperDefines() を変更してプリプロセッサマクロを調整:
obj.root_module.addCMacro("FAP_VERSION", "\\\"1.0\\\"");
obj.root_module.addCMacro("CUSTOM_DEFINE", "value");
build.zig:11 の最適化レベルを変更:
const optimize = b.standardOptimizeOption(.{
.preferred_optimize_mode = .ReleaseFast, // or .ReleaseSmall, .Debug
});
このテンプレートは Flipper Zero の STM32WB55(ARM Cortex-M4F)をターゲットにしています。他の ARM デバイスに移植するには、build.zig:4-9 を調整してください:
const target = b.resolveTargetQuery(.{
.cpu_arch = .thumb,
.cpu_model = .{ .explicit = &std.Target.arm.cpu.cortex_m4 },
.os_tag = .freestanding,
.abi = .eabihf,
});
貢献は歓迎します!このテンプレートは Flipper Zero 向けの Zig 開発を簡素化することを目的としています。SDK の互換性の問題に遭遇した場合や、ビルドプロセス改善の提案がある場合は、issue を開くかプルリクエストを送信してください。
このプロジェクトは MIT ライセンスの下でライセンスされています。詳細は LICENSE ファイルを参照してください。
注記: これは非公式のテンプレートであり、Flipper Devices Inc. とは提携していません。本番デバイスにデプロイする前に、必ずアプリケーションを十分にテストしてください。