Files
umbrix/update-server/WINDOWS_DISTRIBUTOR_BUILD.md
Umbrix Developer 491feb04ac Configure flutter_distributor for Windows .exe installer
- Updated make_config.yaml: Umbrix branding, app_id, executable name
- Updated inno_setup.sas: umbrix.exe process termination
- Added WINDOWS_DISTRIBUTOR_BUILD.md: Complete build instructions
- flutter_distributor packages everything into single .exe file (~60MB)
- Result: umbrix-setup-x64.exe ready for Gitea release
2026-01-19 20:36:17 +03:00

9.1 KiB
Raw Blame History

Сборка Windows установщика через flutter_distributor

РЕШЕНИЕ: Один .exe файл со всеми зависимостями

Hiddify использует flutter_distributor с target: exe, который:

  1. Собирает Flutter приложение
  2. Упаковывает ВСЕ файлы (exe + dll + data + libcore.dll)
  3. Создает Inno Setup установщик
  4. Результат: ОДИН .exe файл (~50-60MB)

Требования

  1. Windows машина (или VM)
  2. Flutter SDK 3.24.0+
  3. Visual Studio 2022 с C++ компонентами
  4. Inno Setup 6.x+ (скачать: https://jrsoftware.org/isdl.php)

Шаг 1: Клонирование репозитория на Windows

# Клонировать с Gitea
git clone --recursive https://update.umbrix.net/vodorod/umbrix.git
cd umbrix

# Или обновить submodules если уже клонировано
git submodule update --init --recursive

Шаг 2: Замена libcore.dll

# Скачать libcore с Gitea
curl -L -o libcore-windows.tar.gz "https://update.umbrix.net/vodorod/umbrix-libcore/releases/download/v1.7.0-umbrix/libcore-windows-amd64-umbrix.tar.gz"

# Распаковать
tar -xzf libcore-windows.tar.gz

# Заменить в проекте
Copy-Item libcore.dll -Destination libcore\bin\libcore.dll -Force
Copy-Item HiddifyCli.exe -Destination libcore\bin\HiddifyCli.exe -Force
Copy-Item -Path webui -Destination libcore\bin\ -Recurse -Force

Шаг 3: Установка flutter_distributor

# Активировать плагин
dart pub global activate flutter_distributor

# Добавить в PATH (если еще нет)
# C:\Users\YOUR_USERNAME\AppData\Local\Pub\Cache\bin

Шаг 4: Сборка установщика

# Собрать Windows .exe установщик
dart run flutter_distributor:main package --platform windows --targets exe --skip-clean

# Процесс:
# 1. flutter build windows --release (5-10 минут)
# 2. Копирование файлов в temp директорию
# 3. Запуск Inno Setup для создания установщика (1-2 минуты)
# 4. Результат: dist\1.7.3+173\umbrix-setup-x64.exe (~50-60MB)

Что происходит внутри?

1. Flutter Build

build/windows/x64/runner/Release/
├── umbrix.exe              (основной исполняемый файл)
├── data/                   (ресурсы Flutter)
│   ├── app.so
│   ├── icudtl.dat
│   └── flutter_assets/
├── flutter_windows.dll     (Flutter engine)
├── libcore.dll             (VPN ядро, 45MB)
└── другие .dll

2. Inno Setup упаковывает

  • Все файлы из build/windows/x64/runner/Release/
  • Создает установщик с GUI на русском/английском
  • Добавляет ярлыки (рабочий стол + меню Пуск)
  • Регистрирует в "Установка и удаление программ"
  • Поддерживает тихую установку /VERYSILENT

3. Результат

dist/1.7.3+173/umbrix-setup-x64.exe  (~50-60MB)

Этот файл содержит ВСЁ:

  • umbrix.exe
  • Flutter runtime
  • libcore.dll (45MB)
  • WebUI
  • Все зависимости

Шаг 5: Тестирование

# Запустить установщик
.\dist\1.7.3+173\umbrix-setup-x64.exe

# Или тихая установка (для тестирования автообновлений)
.\umbrix-setup-x64.exe /VERYSILENT /SUPPRESSMSGBOXES /NORESTART

# Проверить установку
dir "C:\Program Files\Umbrix"

Шаг 6: Загрузка в Gitea

# Переименовать для релиза
$version = "1.7.3"
$file = "dist\$version+173\umbrix-setup-x64.exe"
$newName = "umbrix-$version-windows-setup-x64.exe"
Copy-Item $file $newName

# Загрузить через API
$token = "YOUR_GITEA_TOKEN"
$releaseId = 1  # ID релиза v1.7.3

curl -X POST "https://update.umbrix.net/api/v1/repos/vodorod/umbrix/releases/$releaseId/assets?name=$newName" `
  -H "Authorization: token $token" `
  -H "Content-Type: application/octet-stream" `
  --data-binary "@$newName"

Автоматизация (GitHub Actions)

Создайте .github/workflows/build-windows.yml:

name: Build Windows
on:
  push:
    tags: ['v*']

jobs:
  build:
    runs-on: windows-latest
    steps:
      - uses: actions/checkout@v3
        with:
          submodules: recursive
      
      - uses: subosito/flutter-action@v2
        with:
          flutter-version: '3.24.0'
      
      - name: Download libcore
        run: |
          curl -L -o libcore.tar.gz "https://update.umbrix.net/vodorod/umbrix-libcore/releases/download/v1.7.0-umbrix/libcore-windows-amd64-umbrix.tar.gz"
          tar -xzf libcore.tar.gz
          Copy-Item libcore.dll -Destination libcore\bin\libcore.dll -Force
      
      - name: Install flutter_distributor
        run: dart pub global activate flutter_distributor
      
      - name: Build Windows EXE
        run: dart run flutter_distributor:main package --platform windows --targets exe --skip-clean
      
      - name: Upload to Gitea
        env:
          GITEA_TOKEN: ${{ secrets.GITEA_TOKEN }}
        run: |
          $file = Get-ChildItem dist\*\umbrix-setup-x64.exe | Select-Object -First 1
          curl -X POST "https://update.umbrix.net/api/v1/repos/vodorod/umbrix/releases/assets" `
            -H "Authorization: token $env:GITEA_TOKEN" `
            --data-binary "@$($file.FullName)"

Конфигурация (уже настроено)

windows/packaging/exe/make_config.yaml:

app_id: 7U904649-52C2-5607-H590-CK880G32B76E
publisher: Umbrix Team
publisher_url: https://umbrix.net
display_name: Umbrix
executable_name: umbrix.exe
output_base_file_name: umbrix-setup-x64.exe
create_desktop_icon: true
install_dir_name: "{autopf64}\\Umbrix"
setup_icon_file: ..\..\windows\runner\resources\app_icon.ico
locales:
  - en
  - ru

windows/packaging/exe/inno_setup.sas:

  • Шаблон Inno Setup с поддержкой тихой установки
  • Автоматически закрывает старую версию перед установкой
  • Создает ярлыки на рабочем столе и в меню Пуск

Альтернатива: Ручная сборка через Inno Setup

Если flutter_distributor не работает:

# 1. Собрать Flutter
flutter build windows --release

# 2. Создать installer.iss (см. WINDOWS_BUILD_INSTRUCTIONS.md)

# 3. Скомпилировать через Inno Setup GUI
# Или через командную строку:
"C:\Program Files (x86)\Inno Setup 6\ISCC.exe" installer.iss

Troubleshooting

Ошибка: "Inno Setup not found"

# Установить Inno Setup
# Добавить в PATH: C:\Program Files (x86)\Inno Setup 6

Ошибка: "flutter_distributor command not found"

# Переустановить
dart pub global activate flutter_distributor

# Проверить PATH
echo $env:PATH | Select-String "Pub\\Cache\\bin"

Ошибка: "Failed to lookup symbol 'changeHiddifyOptions'"

# Убедитесь, что используете libcore.dll из umbrix-libcore репозитория
# НЕ используйте оригинальный Hiddify libcore!

Большой размер файла (~60MB)

  • Это нормально! Включает:
    • Flutter runtime (~10MB)
    • libcore.dll (45MB)
    • WebUI (~600KB)
    • Инсталлятор Inno Setup (~5MB)

Сравнение с Linux сборкой

Платформа Команда Результат Размер
Linux dart run flutter_distributor package --platform linux --targets deb umbrix-1.7.3-linux.deb 29MB
Windows dart run flutter_distributor package --platform windows --targets exe umbrix-setup-x64.exe 60MB

Почему Windows больше?

  • libcore.dll (45MB) vs libcore.so (45MB) - одинаково
  • Inno Setup упаковщик добавляет ~5MB
  • Windows DLL зависимости больше чем Linux .so

Итого

flutter_distributor решает все проблемы:

  • Один .exe файл вместо папки с множеством файлов
  • Автоматическая упаковка через Inno Setup
  • Поддержка тихой установки /VERYSILENT
  • Совместимость с системой автообновлений
  • Та же команда, что и для Linux (deb/rpm/appimage)

🎯 На Windows машине выполнить одну команду:

dart run flutter_distributor:main package --platform windows --targets exe --skip-clean

Результат: dist/1.7.3+173/umbrix-setup-x64.exe - готов к загрузке в Gitea!