LocalSend AppImage 打包实战:从 Flutter 产物到跨发行版分发

📅 2026/8/24 4:45:34
LocalSend AppImage 打包实战:从 Flutter 产物到跨发行版分发
LocalSend AppImage 打包实战从 Flutter 产物到跨发行版分发【免费下载链接】localsendAn open-source cross-platform alternative to AirDrop项目地址: https://gitcode.com/GitHub_Trending/lo/localsend用 AppImage 把 LocalSend 打成单文件丢到任意 Linux 发行版直接运行。本文覆盖装依赖、拉代码、Flutter 出产物、写 recipe、跑 builder 和多架构复用外加排错与签名流程。 方案选型速览选型上deb 走包管理器要 root绑定发行版和版本号跨老系统最麻烦。Snap 和 Flatpak 靠各自运行时隔离依赖兼容性好但用户得先装运行时首次体验有门槛沙盒还会限制部分系统集成。AppImage 把依赖全部塞进自身用户级权限即可运行跨版本兼容最强代价是文件偏大、没有内建自动更新。结论给 LocalSend 这类轻量工具做跨发行版分发AppImage 当补充渠道最合适。 从零构建到出包装齐 Flutter 与 AppImage 依赖先装构建环境分三类Flutter 自身的系统依赖、LocalSend 需要的系统托盘组件、AppImage 打包工具链。# Flutter 构建系统依赖 sudo apt install curl clang cmake libgtk-3-dev ninja-build # LocalSend 的系统托盘组件 sudo apt install libayatana-appindicator3-dev # AppImage 运行时与打包工具链 sudo apt install libfuse2 squashfs-tools sudo chmod x appimage-builder-x86_64.AppImage sudo mv appimage-builder-x86_64.AppImage /usr/local/bin/appimage-builder跑完which appimage-builder有输出、lsmod | grep fuse能看到 fuse 模块就满足下一步条件。拉代码并初始化子模块仓库把 Flutter SDK 放在 git 子模块里不初始化就没有可用的 flutter 二进制。git clone https://gitcode.com/GitHub_Trending/lo/localsend cd localsend git submodule update --init执行完应看到submodules/flutter/bin/flutter它就是后续构建用的 flutter。跑 Flutter 出 Linux 构建产物清理缓存、生成代码、构建 Linux 版然后把发布产物挪进 AppDir。alias fluttersubmodules/flutter/bin/flutter flutter clean flutter pub get flutter pub run build_runner build -d flutter build linux rm -rf AppDir mkdir AppDir cp -r build/linux/x64/release/bundle/* AppDirAppDir/下出现localsend_app二进制、.desktop文件和图标即满足 builder 的输入条件。写 AppImage reciperecipe 用 support/build/appimage/AppImageBuilder_x86_64.yml核心片段如下重点看AppDir、apt、runtime三段。version: 1 script: - which mksquashfs || apt install squashfs-tools AppDir: path: AppDir app_info: id: org.localsend.localsend_app # 桌面条目的唯一 id name: LocalSend icon: localsend version: latest # 占位版本号文件名用它拼接 exec: localsend_app # 入口二进制 exec_args: $ # 把命令行参数透传给应用 apt: arch: [amd64] # 锁定架构避免混入多套库 sources: - sourceline: deb http://archive.ubuntu.com/ubuntu/ jammy main restricted include: - libayatana-appindicator3-1:amd64 # 托盘功能所需 - librsvg2-common:amd64 # 图标渲染所需 exclude: - adwaita-icon-theme:* # 排除默认图标主题瘦身 runtime: env: XDG_DATA_DIRS: /usr/local/share/:/usr/share/:${XDG_DATA_DIRS}保存后确认exec指向的名字与AppDir里的二进制文件名一致再进下一步。跑 appimage-builder 出包执行 builder产物落在当前目录。appimage-builder sudo chmod x LocalSend-latest-x86_64.AppImage跑完终端输出Created LocalSend-latest-x86_64.AppImage文件可直接双击执行。多架构 recipe 切换ARM64 复用同一套结构把 x86 的 recipe 复制成 ARM 版 support/build/appimage/AppImageBuilder_arm_64.yml仅改arch字段。cp support/build/appimage/AppImageBuilder_x86_64.yml \ support/build/appimage/AppImageBuilder_arm_64.yml # 编辑副本apt.arch 改为 arm64include 包名后缀改为 :arm64 cd /path/to/localsend appimage-builder --recipe support/build/appimage/AppImageBuilder_arm_64.yml chmod x LocalSend-latest-arm_64.AppImage注意 arm64 构建要交叉编译产物或直接在 ARM 环境跑flutter build linux两个文件各自独立发布。 配错会怎样启动报error while loading shared libraries→ldd AppDir/localsend_app | grep not found→ 把缺失的库加进 recipe 的apt.include重新出包。运行提示 FUSE 挂载失败 →lsmod | grep fuse→ 目标机装libfuse2内核模块或改用--appimage-extract解压后运行。桌面菜单不出现图标 →grep Exec AppDir/share/applications/*.desktop→ 检查 recipe 的icon与exec名称补上.desktop字段重打。在 ARM 机上报cannot execute binary file→file LocalSend-latest-x86_64.AppImage | grep -o x86-64→ 换 ARM 版 recipe 构建的 AppImage。 体积与签名裁剪体积抓两头排除usr/share/man与 doc 类文档目录apt.arch锁死单一架构不混库。发布前出 detached 签名下载者用公钥核验du -sh AppDir gpg --detach-sign --armor LocalSend-latest-x86_64.AppImage gpg --verify LocalSend-latest-x86_64.AppImage.asc把 recipe 和这两行塞进 CI 的 compile 阶段tag 一打就出包。【免费下载链接】localsendAn open-source cross-platform alternative to AirDrop项目地址: https://gitcode.com/GitHub_Trending/lo/localsend创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考