M*LIB 大小优化报告

作者: kalicyh创建于 2026年5月6日更新于 2026年7月11日
标签needs-triagediscussionlib

M*LIB 尺寸优化报告 # 概要 此更改通过在主固件中将两个 mlib 仅包含头文件的通用容器使用替换为更小的专用实现,来减小 firmware.dfu 大小。 提交: 2d214b4e5 - Reduce firmware size in archive and cli containers 结果: 基准 firmware.dfu: 880593 字节 经过 archive 容器更改后: 880537 字节 经过 archive + CLI 容器更改后: 880009 字节 总减少: 584 字节 用于比较的构建命令: MOMENTUM_UI_LANG=zh_CN MOMENTUM_DEVICE=clipper ./fbt updater_package COMPACT=1 DEBUG=0 # 理由 mlib 是一个仅包含头文件的通用容器库。 它很方便,但在某些地方也会导致额外的代码生成,因为容器逻辑是根据使用场所和类型实例化的。 在此固件中,通过将一些高流量的通用容器替换为更简单的特定领域的实现,可以实现可测量的大小减小,而不会改变行为。 这不是对 mlib 本身的更新建议。 它是针对在几个核心固件路径中减少 mlib 的使用,这些路径中通用实现是不必要的。 # 变更 1: 存档文件列表 文件: - applications/main/archive/helpers/archive_files.h - applications/main/archive/helpers/archive_files.c 变化: - 移除了基于 mlib ARRAY_DEFfiles_array 实现。 - 将其替换为一个小型专用动态数组实现,专门针对 ArchiveFile_t。 - 将 ArchiveFile_t_initArchiveFile_t_init_setArchiveFile_t_setArchiveFile_t_clearArchiveFile_t_cmp 从头文件中移到 .c 文件中。 - 保留了用于存档代码的公共帮助函数名称: - files_array_init - files_array_reset - files_array_clear - files_array_size - files_array_get - files_array_sort - files_array_remove_v - files_array_pop_at - files_array_push_at - files_array_swap_at - files_array_push_back 为什么: - 存档文件列表是一个具有固定语义的特定容器。 - 定制实现避免了为此路径携带通用 mlib 数组机制。 - 将 ArchiveFile_t_* 帮助函数移入到一个单个翻译单元中还减少了头文件级别的代码重复压力。 测量影响: - 880593 -> 880537 - 减少: 56 字节 # 变更 2: CLI 命令注册表 文件: - lib/toolbox/cli/cli_registry_i.h - lib/toolbox/cli/cli_registry.c - lib/toolbox/cli/shell/cli_shell.c - lib/toolbox/cli/shell/cli_shell_completions.c 变化: - 移除了基于 mlib DICT_DEF2CliCommandDict。 - 将其替换为基于 CliRegistryEntry[] 的紧凑型顺序注册表。 - 添加了一个最小的 CliRegistryEntry 结构体,用于存储命令的名称和函数指针。 - 将 CliCommandDict 中的所有函数指针和字符串转换为 CliRegistryEntry。 - 将 CliCommandDict 中的所有函数指针和字符串转换为 CliRegistryEntry。 为什么: - CLI 命令注册表是一个特定容器,具有固定语义。 - 定制实现避免了为此路径携带通用 mlib 字典机制。 - 将 CliCommandDict 中的所有函数指针和字符串转换为 CliRegistryEntry,可以减少头文件级别的代码重复。 测量影响: - 880593 -> 880009 - 减少: 884 字节

内容来源: Next-Flip/Momentum-Firmware