#!/bin/bash # ============================================================ # 闲言APP — Linux打包脚本 (AppImage) # 创建时间: 2026-05-18 # 更新时间: 2026-05-18 # 作用: 将Flutter Linux构建产物打包为AppImage通用安装包 # 上次更新: 初始创建 # ============================================================ set -e APP_NAME="xianyan" APP_DISPLAY_NAME="闲言" APP_ID="apps.xy.xianyan" APP_VERSION="5.2.0" BUILD_DIR="build/linux/x64/release/bundle" OUTPUT_DIR="dist" APPDIR="${OUTPUT_DIR}/appimage_staging/${APP_NAME}.AppDir" echo "==========================================" echo " ${APP_DISPLAY_NAME} — AppImage 打包" echo "==========================================" if [ ! -d "${BUILD_DIR}" ]; then echo "❌ 构建产物不存在,请先运行: flutter build linux --release" exit 1 fi which appimagetool > /dev/null 2>&1 || { echo "📥 下载 appimagetool..." ARCH=$(uname -m) wget -q "https://github.com/AppImage/AppImageKit/releases/download/continuous/appimagetool-${ARCH}.AppImage" -O /tmp/appimagetool chmod +x /tmp/appimagetool APPIMAGETOOL="/tmp/appimagetool" } APPIMAGETOOL="${APPIMAGETOOL:-appimagetool}" rm -rf "${APPDIR}" mkdir -p "${APPDIR}/usr/bin" mkdir -p "${APPDIR}/usr/lib" mkdir -p "${APPDIR}/usr/share/applications" mkdir -p "${APPDIR}/usr/share/metainfo" mkdir -p "${APPDIR}/usr/share/icons/hicolor/scalable/apps" mkdir -p "${APPDIR}/usr/share/icons/hicolor/256x256/apps" echo "📦 复制构建产物..." cp -r "${BUILD_DIR}"/* "${APPDIR}/usr/bin/" chmod +x "${APPDIR}/usr/bin/${APP_NAME}" echo "📝 创建AppRun入口..." cat > "${APPDIR}/AppRun" << 'EOF' #!/bin/bash SELF=$(readlink -f "$0") HERE=${SELF%/*} export PATH="${HERE}/usr/bin:${PATH}" export LD_LIBRARY_PATH="${HERE}/usr/lib:${HERE}/usr/bin/lib:${LD_LIBRARY_PATH}" export XDG_DATA_DIRS="${HERE}/usr/share:${XDG_DATA_DIRS:-/usr/local/share:/usr/share}" export GSETTINGS_SCHEMA_DIR="${HERE}/usr/share/glib-2.0/schemas:${GSETTINGS_SCHEMA_DIR}" # GSTREAMER插件路径 export GST_PLUGIN_SYSTEM_PATH="${HERE}/usr/lib/gstreamer-1.0:${GST_PLUGIN_SYSTEM_PATH:-}" exec "${HERE}/usr/bin/xianyan" "$@" EOF chmod +x "${APPDIR}/AppRun" echo "🖥️ 创建desktop文件..." if [ -f "linux/${APP_ID}.desktop" ]; then cp "linux/${APP_ID}.desktop" "${APPDIR}/" sed -i "s|Exec=xianyan|Exec=${APP_NAME}|g" "${APPDIR}/${APP_ID}.desktop" sed -i "s|Icon=apps.xy.xianyan|Icon=${APP_ID}|g" "${APPDIR}/${APP_ID}.desktop" else cat > "${APPDIR}/${APP_ID}.desktop" << EOF [Desktop Entry] Type=Application Version=1.5 Name=${APP_DISPLAY_NAME} Name[zh_CN]=${APP_DISPLAY_NAME} Name[en]=Xianyan Comment=文字阅读更纯粹 Icon=${APP_ID} Exec=${APP_NAME} Terminal=false StartupNotify=true Categories=Utility;Literature;Graphics; StartupWMClass=${APP_NAME} EOF fi echo "📋 复制AppStream元数据..." if [ -f "linux/${APP_ID}.appdata.xml" ]; then cp "linux/${APP_ID}.appdata.xml" "${APPDIR}/usr/share/metainfo/" fi echo "🎨 创建占位图标..." SVG_ICON="${APPDIR}/usr/share/icons/hicolor/scalable/apps/${APP_ID}.svg" cat > "${SVG_ICON}" << 'SVGEOF' SVGEOF mkdir -p "${APPDIR}/.DirIcon" cp "${SVG_ICON}" "${APPDIR}/.DirIcon" 2>/dev/null || true mkdir -p "${OUTPUT_DIR}" APPIMAGE_FILE="${OUTPUT_DIR}/${APP_NAME}_${APP_VERSION}_x86_64.AppImage" echo "🔨 构建AppImage..." ${APPIMAGETOOL} "${APPDIR}" "${APPIMAGE_FILE}" APPIMAGE_SIZE=$(du -sh "${APPIMAGE_FILE}" | cut -f1) echo "" echo "✅ AppImage 打包完成!" echo " 文件: ${APPIMAGE_FILE}" echo " 大小: ${APPIMAGE_SIZE}" echo "" echo "运行命令: chmod +x ${APPIMAGE_FILE} && ./${APPIMAGE_FILE}" rm -rf "${APPDIR}"