Files
xianyan/linux/packaging/build_appimage.sh
Developer 27672343b8 520
2026-05-20 01:40:09 +08:00

127 lines
4.0 KiB
Bash

#!/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'
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256">
<defs>
<linearGradient id="bg" x1="0%" y1="0%" x2="100%" y2="100%">
<stop offset="0%" style="stop-color:#1a1a2e"/>
<stop offset="100%" style="stop-color:#16213e"/>
</linearGradient>
</defs>
<rect width="256" height="256" rx="56" fill="url(#bg)"/>
<text x="128" y="160" text-anchor="middle" font-size="120" font-family="serif" fill="#e8e8e8">言</text>
</svg>
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}"