Compare commits
286 Commits
145832093e
...
main
| Author | SHA1 | Date | |
|---|---|---|---|
| 6a7033aca1 | |||
| 8b67d1f6b1 | |||
| e7b8eaf8ab | |||
| e00754847d | |||
| 94d0a78e89 | |||
| 2fab52d362 | |||
| e59cbf8b60 | |||
| 57a47874be | |||
| b96008d6dc | |||
| ab8eb891cc | |||
| 73480ce417 | |||
| 343891b702 | |||
| 2eaa19190b | |||
| 6da7649720 | |||
| d60f1d3c5d | |||
| d89e8782e6 | |||
| 8e48a6ff8a | |||
| b441346630 | |||
| 8f44b641ab | |||
| 620c34401a | |||
| 7017c99f4a | |||
| 5d00bf3404 | |||
| 3fbda0bdd4 | |||
| fec9188b0c | |||
| 8e71e22e86 | |||
| a5440aec53 | |||
| b65539801d | |||
| facfc15d9e | |||
| 6ef08c9e7b | |||
| 9a907f6531 | |||
| ccf9a76de9 | |||
| 1d2a89a80a | |||
| 2ea6cd2379 | |||
| bfa67e8a73 | |||
| 1b996f0c53 | |||
| 2e7658c4fd | |||
| 26f6c10557 | |||
| 0474f3c9d9 | |||
| 4139ebcc38 | |||
| 74f9acc225 | |||
| e6ee3d6db8 | |||
| 2d1f391932 | |||
| 9b5e370f0b | |||
| 12eb8348d3 | |||
| 0aeac257df | |||
| 5f2fb90bb2 | |||
| c9a6ad2046 | |||
| b90d451bcc | |||
| ac65aaa227 | |||
| eb4fad64cb | |||
| 8477c2e343 | |||
| 9563a81a6e | |||
| 3c0f1084b0 | |||
| c42bddb129 | |||
| 18e932e738 | |||
| 7740b46fa6 | |||
| 83d201b78d | |||
| 4f09267b4b | |||
| 8f347d9183 | |||
| 554d12193e | |||
| 801a77f942 | |||
| 05d2c71cd0 | |||
| 743631c4ce | |||
| 60de644637 | |||
| f888b772c2 | |||
| f70b32ec3f | |||
| ca913eb38f | |||
| dc5a5fc78a | |||
| 17860e333c | |||
| d63b3bfc3c | |||
| 4f6be35f61 | |||
| 56c7fd6921 | |||
| 24cf03d6ce | |||
| 5bd77511cc | |||
| 33b9cd34f1 | |||
| c87d5d4d38 | |||
| ce4abb7e01 | |||
| dbcdf8b8a4 | |||
| e82480b937 | |||
| 8e27ddeded | |||
| 961d419c4d | |||
| aa0fd94cb2 | |||
| 86687cac58 | |||
| 1b1b38aba5 | |||
| beae70edb7 | |||
| d2ea8436f9 | |||
| 95f8f3afbe | |||
| a17fa079bc | |||
| 9302764802 | |||
| c058c2cea6 | |||
| 55d7508807 | |||
| adcde623c7 | |||
| 83e742a9dc | |||
| 569f9f6d05 | |||
| 4fdf4da4f3 | |||
| b059d01556 | |||
| 909020654f | |||
| 1809c11473 | |||
| 343bb50c77 | |||
| 11afee1d6f | |||
| 96d1a107cf | |||
| 52f241a5a7 | |||
| 5dfb2b7432 | |||
| 85dc810421 | |||
| ee3fdd91fa | |||
| e537775e71 | |||
| f97a21be32 | |||
| d3f48e345e | |||
| ac8a04fd24 | |||
| a7df3a44a2 | |||
| 7956349c0a | |||
| becc03acfd | |||
| 9123d5f0e4 | |||
| 91185a593a | |||
| d6386ecfa9 | |||
| 62d1af8517 | |||
| 3b05d4ff72 | |||
| bcb4d17236 | |||
| d99f588a5b | |||
| 691dd6e1d6 | |||
| b442289b8a | |||
| 89d13e6237 | |||
| 8fd742a688 | |||
| 325a63d35f | |||
| 679c303457 | |||
| 59aa67d456 | |||
| 2a1ee3018d | |||
| 76e83e0135 | |||
| 89d6ec3c76 | |||
| 670eb7ebc9 | |||
| 46295f4543 | |||
| a47174df56 | |||
| 748ec6bee9 | |||
| a884e6c838 | |||
| 920b86e56a | |||
| a78b40c339 | |||
| 8ccfc6d272 | |||
| f526122f33 | |||
| b86d645acf | |||
| ef1f3bfb50 | |||
| 33917e774d | |||
| 78c20f9ae9 | |||
| 610eb4f20d | |||
| 8cc88be5f6 | |||
| 50f4237c74 | |||
| deac0adabd | |||
| 4f9d405c9f | |||
| 88091e84c0 | |||
| fafad1ff97 | |||
| fbcf5f7e61 | |||
| b21d189ca1 | |||
| 701acd561a | |||
| 3b419d1e24 | |||
| e3b9fea5b2 | |||
| 54dd4cbd35 | |||
| 77b721df4b | |||
| 8937024241 | |||
| 29c6e40940 | |||
| f75b109025 | |||
| eb4db67fa1 | |||
| 62d3157665 | |||
| 577327c40a | |||
| fed0b0e422 | |||
| ad5d0c9b7a | |||
| 9873f670fa | |||
| 8b8d29dd00 | |||
| 477d4086b2 | |||
| 7fc2a60e18 | |||
| 41e6ed433a | |||
| 8b055d9ee1 | |||
| 0808e2db10 | |||
| dcc9ad43fe | |||
| b47e0e984e | |||
| 51ed02de1a | |||
| e0b1cec87d | |||
| a9db68c29b | |||
| db7a776d2b | |||
| bfa3ec48d6 | |||
| ca74f9289e | |||
| f9ea310031 | |||
| 5d849c3b98 | |||
| b7be97f6c1 | |||
| 7212fd3132 | |||
| 067a715afe | |||
| ce969a6ad4 | |||
| cea406f660 | |||
| a09245cb3e | |||
| bbc1c03cca | |||
| b3935f8516 | |||
| 14b95b07b4 | |||
| 0e1c043e34 | |||
| cc5a732fa5 | |||
| 0e9d1bc157 | |||
| 6dfad4544d | |||
| 2eaa15cc8f | |||
| 5c1449155e | |||
| cc8744a188 | |||
| f72ffa6443 | |||
| 5e84fea7d0 | |||
| dce32e706b | |||
| 7e19e2cdb8 | |||
| 0e062a275a | |||
| 4cc3f98b0f | |||
| a6527d822b | |||
| aac7d84602 | |||
| f738ba9245 | |||
| 89e02cc707 | |||
| d1e45f0254 | |||
| dbf6175ad9 | |||
| 251564a5de | |||
| ef8bba71d5 | |||
| 961c655a92 | |||
| 4389770821 | |||
| 7c9b23edbd | |||
| 90fd476c45 | |||
| 7cd360e61e | |||
| 6e189671c7 | |||
| 4fbdb331d4 | |||
| 6131a80b2c | |||
| 33f45aa4a5 | |||
| 4dbcaff187 | |||
| 9e05a17fc4 | |||
| 1a9f0d79ac | |||
| c7b77c1ad8 | |||
| 7cd022093b | |||
| 7a223d614b | |||
| 0ec2f72a93 | |||
| 1a1c692ae0 | |||
| dee7f0a591 | |||
| b8d0417d0f | |||
| f1e8e7f530 | |||
| 75c7d31da1 | |||
| 17b3f6b92d | |||
| cf297caf09 | |||
| 2b80fcba0d | |||
| 4c5763647d | |||
| b3ee1cc6dc | |||
| b7a78aa76a | |||
| 18ec3e36fc | |||
| 8b982d1ba8 | |||
| f71575ee91 | |||
| 3f838d224c | |||
| 9ef53abad5 | |||
| f379a8ee8f | |||
| 54b0cc44ff | |||
| 765b45c0fc | |||
| 1e7175edf5 | |||
| 61ab0ea225 | |||
| 138209929b | |||
| 7083369cd4 | |||
| 16a1ed789e | |||
| 90a3d57bb1 | |||
| ac959efc15 | |||
| c56f0a0f7f | |||
| 1e78ee043d | |||
| ca48cf2acf | |||
| b716ba8294 | |||
| 442ea458b7 | |||
| c5715f77e2 | |||
| b79ce2d15a | |||
| 445b1e0352 | |||
| 74df08144f | |||
| 5c8f0ca1fc | |||
| c1c5f1a2e0 | |||
| d94e7fd44a | |||
| 064a0a7402 | |||
| 8bba2441c2 | |||
| 7011ba1551 | |||
| bba8acfe76 | |||
| 9c2f9be6c5 | |||
| 0067017ca6 | |||
| 1970bbb6fd | |||
| fbdf4a2337 | |||
| 4250f61345 | |||
| ee20cc93e2 | |||
| 01ea786ef0 | |||
| 11c66d0314 | |||
| 0449e04f42 | |||
| 41f85a6747 | |||
| 3328919f7e | |||
| fde4bfa464 | |||
| 8204895199 | |||
| 773047838c | |||
| fc4ecf874b | |||
| adfaa87b09 | |||
| f42a481452 |
@@ -0,0 +1,434 @@
|
|||||||
|
name: Build Windows
|
||||||
|
run-name: 构建Win流程
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
- dev
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
- dev
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
# 先编译 libcore
|
||||||
|
build-libcore:
|
||||||
|
name: 编译 libcore (Windows)
|
||||||
|
runs-on: client-server
|
||||||
|
container:
|
||||||
|
image: node:20
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
# 只有node支持版本号别名
|
||||||
|
node: ['20.15.1']
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: 📥 Checkout 代码
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: 🔧 设置 Go 环境
|
||||||
|
uses: actions/setup-go@v5
|
||||||
|
with:
|
||||||
|
go-version: '1.23'
|
||||||
|
cache: true
|
||||||
|
cache-dependency-path: libcore/go.sum
|
||||||
|
|
||||||
|
- name: 🔧 安装 MinGW
|
||||||
|
run: |
|
||||||
|
# 在 GitHub 托管 runner(有 sudo)与 act/自托管容器(无 sudo)均可运行
|
||||||
|
if command -v sudo >/dev/null 2>&1; then
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y mingw-w64
|
||||||
|
else
|
||||||
|
echo "sudo 不存在,按 root 用户直接执行 apt-get"
|
||||||
|
export DEBIAN_FRONTEND=noninteractive
|
||||||
|
apt-get update || apt update
|
||||||
|
apt-get install -y mingw-w64 || apt install -y mingw-w64
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: 📦 编译 libcore.dll
|
||||||
|
working-directory: libcore
|
||||||
|
run: |
|
||||||
|
echo "🚀 开始编译 Windows libcore..."
|
||||||
|
make windows-amd64
|
||||||
|
|
||||||
|
if [ -f "bin/libcore.dll" ] && [ -f "bin/HiddifyCli.exe" ]; then
|
||||||
|
echo "✅ Windows libcore 编译成功"
|
||||||
|
ls -lh bin/
|
||||||
|
else
|
||||||
|
echo "❌ Windows libcore 编译失败"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
- name: 📤 上传 Windows libcore
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: libcore-windows
|
||||||
|
path: |
|
||||||
|
libcore/bin/libcore.dll
|
||||||
|
libcore/bin/HiddifyCli.exe
|
||||||
|
libcore/bin/webui/**
|
||||||
|
retention-days: 7
|
||||||
|
|
||||||
|
|
||||||
|
# 构建 Windows 应用
|
||||||
|
build:
|
||||||
|
runs-on: windows-latest
|
||||||
|
needs: build-libcore
|
||||||
|
steps:
|
||||||
|
- name: 🔧 Add Git to PATH (Windows)
|
||||||
|
if: ${{ runner.os == 'Windows' }}
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
$paths = @(
|
||||||
|
'C:\Program Files\Git\cmd',
|
||||||
|
'C:\Program Files\Git\bin',
|
||||||
|
'C:\Program Files (x86)\Git\cmd',
|
||||||
|
'C:\Program Files (x86)\Git\bin'
|
||||||
|
)
|
||||||
|
foreach ($p in $paths) {
|
||||||
|
if (Test-Path $p) {
|
||||||
|
Add-Content -Path $env:GITHUB_PATH -Value $p
|
||||||
|
$env:PATH = "$p;$env:PATH"
|
||||||
|
Write-Host ("Added to PATH: {0}" -f $p)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
$candidates = @(
|
||||||
|
'C:\Program Files\Git\cmd\git.exe',
|
||||||
|
'C:\Program Files\Git\bin\git.exe',
|
||||||
|
'C:\Program Files (x86)\Git\cmd\git.exe',
|
||||||
|
'C:\Program Files (x86)\Git\bin\git.exe'
|
||||||
|
)
|
||||||
|
$found = $false
|
||||||
|
foreach ($g in $candidates) {
|
||||||
|
if (Test-Path $g) {
|
||||||
|
& $g --version
|
||||||
|
$found = $true
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (-not $found) {
|
||||||
|
Write-Host "Git executable not found in common locations; continuing."
|
||||||
|
}
|
||||||
|
|
||||||
|
- name: 📥 Checkout 代码
|
||||||
|
uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
submodules: recursive
|
||||||
|
fetch-depth: 0
|
||||||
|
|
||||||
|
- name: 📥 下载 libcore
|
||||||
|
uses: actions/download-artifact@v3
|
||||||
|
with:
|
||||||
|
name: libcore-windows
|
||||||
|
path: .
|
||||||
|
|
||||||
|
- name: 🔧 复制 libcore 文件到正确位置并重命名
|
||||||
|
shell: cmd
|
||||||
|
run: call copy_libcore.bat
|
||||||
|
|
||||||
|
- name: 🔍 Verify jq Installation (ACT)
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
# Check if jq is available
|
||||||
|
$jqFound = $false
|
||||||
|
try {
|
||||||
|
$version = jq --version 2>&1
|
||||||
|
if ($version -match 'jq-[\d\.]+') {
|
||||||
|
Write-Host "jq is already installed: $version"
|
||||||
|
$jqFound = $true
|
||||||
|
}
|
||||||
|
} catch {
|
||||||
|
Write-Host "jq not installed or not in PATH"
|
||||||
|
}
|
||||||
|
if (-not $jqFound) {
|
||||||
|
Write-Host "Preparing to install jq..."
|
||||||
|
# Check if Chocolatey is available
|
||||||
|
$chocoFound = $false
|
||||||
|
try {
|
||||||
|
choco --version 2>&1 | Out-Null
|
||||||
|
$chocoFound = $true
|
||||||
|
} catch {}
|
||||||
|
if (-not $chocoFound) {
|
||||||
|
Write-Host "Installing Chocolatey..."
|
||||||
|
Set-ExecutionPolicy Bypass -Scope Process -Force
|
||||||
|
[System.Net.ServicePointManager]::SecurityProtocol = [System.Net.ServicePointManager]::SecurityProtocol -bor 3072
|
||||||
|
iex ((New-Object System.Net.WebClient).DownloadString('https://community.chocolatey.org/install.ps1'))
|
||||||
|
# Refresh PATH
|
||||||
|
$env:PATH = [System.Environment]::GetEnvironmentVariable('PATH', 'Machine') + ';' + [System.Environment]::GetEnvironmentVariable('PATH', 'User')
|
||||||
|
Write-Host "Chocolatey installed successfully"
|
||||||
|
}
|
||||||
|
Write-Host "Installing jq using Chocolatey..."
|
||||||
|
choco install jq -y
|
||||||
|
if ($LASTEXITCODE -eq 0) {
|
||||||
|
Write-Host "jq installed successfully"
|
||||||
|
# Verify again
|
||||||
|
$version = jq --version 2>&1
|
||||||
|
Write-Host "jq version: $version"
|
||||||
|
} else {
|
||||||
|
Write-Host "jq installation failed, exit code: $LASTEXITCODE"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
- name: Add jq to PATH
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
$jqPath = "C:\ProgramData\chocolatey\bin"
|
||||||
|
if (Test-Path $jqPath) {
|
||||||
|
Add-Content -Path $env:GITHUB_PATH -Value $jqPath
|
||||||
|
$env:PATH = "$jqPath;$env:PATH"
|
||||||
|
Write-Host "Added jq path to GITHUB_PATH and current PATH"
|
||||||
|
} else {
|
||||||
|
Write-Host "jq installation path not found"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
- name: Add Flutter to PATH
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
# Add Flutter to PATH for current session and GitHub Actions
|
||||||
|
$flutterPath = "C:\flutter\bin"
|
||||||
|
if (Test-Path $flutterPath) {
|
||||||
|
Write-Host "Adding Flutter to PATH: $flutterPath"
|
||||||
|
$env:PATH = "$flutterPath;$env:PATH"
|
||||||
|
Add-Content -Path $env:GITHUB_PATH -Value $flutterPath
|
||||||
|
|
||||||
|
# Verify Flutter is accessible
|
||||||
|
$flutterVersion = flutter --version 2>&1
|
||||||
|
if ($LASTEXITCODE -eq 0) {
|
||||||
|
Write-Host "Flutter verified: $flutterVersion"
|
||||||
|
} else {
|
||||||
|
Write-Host "Flutter not found at $flutterPath"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Write-Host "ERROR: Flutter not found at C:\flutter\bin"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
- name: Enable Windows desktop
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
$env:PATH = "C:\flutter\bin;$env:PATH"
|
||||||
|
flutter config --enable-windows-desktop
|
||||||
|
|
||||||
|
- name: Get dependencies
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
$env:PATH = "C:\flutter\bin;$env:PATH"
|
||||||
|
flutter pub get
|
||||||
|
|
||||||
|
- name: Generate code
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
$env:PATH = "C:\flutter\bin;$env:PATH"
|
||||||
|
dart run build_runner build --delete-conflicting-outputs
|
||||||
|
|
||||||
|
- name: Install NuGet
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
Write-Host "Installing NuGet..."
|
||||||
|
|
||||||
|
# Check if NuGet is already available
|
||||||
|
$nugetPath = Get-Command nuget -ErrorAction SilentlyContinue
|
||||||
|
if ($nugetPath) {
|
||||||
|
Write-Host "NuGet already installed: $($nugetPath.Source)"
|
||||||
|
$nugetVersion = nuget help | Select-String -Pattern "NuGet Version" | Select-Object -First 1
|
||||||
|
Write-Host "NuGet version: $nugetVersion"
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
# Use Chocolatey to install NuGet (proven to work)
|
||||||
|
Write-Host "Installing NuGet via Chocolatey..."
|
||||||
|
choco install nuget.commandline -y
|
||||||
|
|
||||||
|
# Update PATH to include Chocolatey
|
||||||
|
$env:PATH = "C:\ProgramData\chocolatey\bin;$env:PATH"
|
||||||
|
Add-Content -Path $env:GITHUB_PATH -Value "C:\ProgramData\chocolatey\bin"
|
||||||
|
|
||||||
|
# Verify installation
|
||||||
|
if (Get-Command nuget -ErrorAction SilentlyContinue) {
|
||||||
|
Write-Host "NuGet installed successfully via Chocolatey"
|
||||||
|
$nugetVersion = nuget help | Select-String -Pattern "NuGet Version" | Select-Object -First 1
|
||||||
|
Write-Host "NuGet version: $nugetVersion"
|
||||||
|
} else {
|
||||||
|
Write-Host "WARNING: NuGet installation may have failed, but continuing..."
|
||||||
|
}
|
||||||
|
|
||||||
|
- name: Fix long paths
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
Write-Host "Enabling long path support..."
|
||||||
|
|
||||||
|
# Enable long paths in Windows
|
||||||
|
Set-ItemProperty -Path "HKLM:\SYSTEM\CurrentControlSet\Control\FileSystem" -Name "LongPathsEnabled" -Value 1 -Type DWORD -Force
|
||||||
|
|
||||||
|
# Also set for current user
|
||||||
|
Set-ItemProperty -Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\AppModel\StateRepository\Cache\Package\Data\" -Name "LongPathsEnabled" -Value 1 -Type DWORD -Force -ErrorAction SilentlyContinue
|
||||||
|
|
||||||
|
Write-Host "Long path support enabled"
|
||||||
|
|
||||||
|
- name: Clean build cache
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
$env:PATH = "C:\flutter\bin;$env:PATH"
|
||||||
|
Write-Host "Cleaning build cache..."
|
||||||
|
flutter clean
|
||||||
|
|
||||||
|
Write-Host "Removing old build directories..."
|
||||||
|
if (Test-Path "build") {
|
||||||
|
Remove-Item -Path "build" -Recurse -Force
|
||||||
|
}
|
||||||
|
if (Test-Path "windows") {
|
||||||
|
Remove-Item -Path "windows" -Recurse -Force
|
||||||
|
}
|
||||||
|
|
||||||
|
Write-Host "Recreating Windows project..."
|
||||||
|
flutter create --platforms=windows .
|
||||||
|
|
||||||
|
- name: Build Windows Debug
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
$env:PATH = "C:\flutter\bin;C:\ProgramData\chocolatey\bin;$env:PATH"
|
||||||
|
flutter build windows
|
||||||
|
|
||||||
|
- name: Build Windows Release
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
$env:PATH = "C:\flutter\bin;C:\ProgramData\chocolatey\bin;$env:PATH"
|
||||||
|
flutter build windows --release
|
||||||
|
|
||||||
|
- name: Upload Debug build artifacts
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: windows-debug-build
|
||||||
|
path: build/windows/x64/runner/Debug/
|
||||||
|
|
||||||
|
- name: Upload Release build artifacts
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: windows-release-build
|
||||||
|
path: build/windows/x64/runner/Release/
|
||||||
|
|
||||||
|
- name: Install Build Tools
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
choco install 7zip -y
|
||||||
|
choco install enigma-virtual-box -y
|
||||||
|
|
||||||
|
- name: Package Single EXE
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
Write-Host "=== 开始打包单文件 EXE ==="
|
||||||
|
|
||||||
|
$buildPath = "build\windows\x64\runner\Release"
|
||||||
|
$outputPath = "dist"
|
||||||
|
$enigmaPath = "C:\Program Files\Enigma Virtual Box\enigmavb.exe"
|
||||||
|
|
||||||
|
# 创建输出目录
|
||||||
|
if (-not (Test-Path $outputPath)) {
|
||||||
|
New-Item -ItemType Directory -Path $outputPath -Force | Out-Null
|
||||||
|
}
|
||||||
|
|
||||||
|
# 获取主程序
|
||||||
|
$exeFile = Get-ChildItem -Path $buildPath -Filter "*.exe" | Select-Object -First 1
|
||||||
|
if (-not $exeFile) {
|
||||||
|
Write-Host "❌ 未找到可执行文件"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
$inputExe = $exeFile.FullName
|
||||||
|
$outputExe = "$outputPath\$($exeFile.BaseName)_Single.exe"
|
||||||
|
|
||||||
|
Write-Host "主程序: $inputExe"
|
||||||
|
Write-Host "输出: $outputExe"
|
||||||
|
|
||||||
|
# 尝试使用 Enigma Virtual Box
|
||||||
|
if (Test-Path $enigmaPath) {
|
||||||
|
Write-Host "使用 Enigma Virtual Box 打包..."
|
||||||
|
|
||||||
|
# 创建配置文件
|
||||||
|
$configContent = "[Config]`nInputFile=$inputExe`nOutputFile=$outputExe`nFiles=%DEFAULT FOLDER%`nVirtualizationMode=Never Write To Disk`nCompression=Yes`nShareVirtualSystem=Yes`n`n[Files]`nFolder=$buildPath\*"
|
||||||
|
|
||||||
|
$configFile = "$outputPath\package_config.evb"
|
||||||
|
Set-Content -Path $configFile -Value $configContent
|
||||||
|
|
||||||
|
# 执行打包
|
||||||
|
$process = Start-Process -FilePath $enigmaPath -ArgumentList "/sf", $inputExe, "/lf", $outputExe, "/folder", $buildPath, "/compress" -Wait -PassThru -NoNewWindow
|
||||||
|
|
||||||
|
if ($process.ExitCode -eq 0) {
|
||||||
|
Write-Host "✅ 单文件打包成功!"
|
||||||
|
|
||||||
|
# 显示压缩信息
|
||||||
|
$originalSize = (Get-Item $inputExe).Length / 1MB
|
||||||
|
$packedSize = (Get-Item $outputExe).Length / 1MB
|
||||||
|
Write-Host "原始大小: $([math]::Round($originalSize, 2)) MB"
|
||||||
|
Write-Host "打包大小: $([math]::Round($packedSize, 2)) MB"
|
||||||
|
} else {
|
||||||
|
Write-Host "⚠️ Enigma 打包失败,使用备选方案"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
Write-Host "⚠️ Enigma 未找到,使用 7-Zip 自解压方案"
|
||||||
|
exit 1
|
||||||
|
}
|
||||||
|
|
||||||
|
- name: Package with 7-Zip Alternative
|
||||||
|
if: failure()
|
||||||
|
shell: powershell
|
||||||
|
run: |
|
||||||
|
Write-Host "使用 7-Zip 自解压方案..."
|
||||||
|
|
||||||
|
$buildPath = "build\windows\x64\runner\Release"
|
||||||
|
$outputPath = "dist"
|
||||||
|
|
||||||
|
# 检查 7-Zip
|
||||||
|
$7zipPath = "C:\Program Files\7-Zip\7z.exe"
|
||||||
|
|
||||||
|
# 获取主程序名称
|
||||||
|
$exeFile = Get-ChildItem -Path $buildPath -Filter "*.exe" | Select-Object -First 1
|
||||||
|
$outputSfx = "$outputPath\$($exeFile.BaseName)_Package.exe"
|
||||||
|
|
||||||
|
Write-Host "创建自解压包..."
|
||||||
|
|
||||||
|
# 创建配置文件
|
||||||
|
$configContent = @"
|
||||||
|
;!@Install@!UTF-8!
|
||||||
|
Title="HostExecutor Windows Package"
|
||||||
|
BeginPrompt="正在解压 HostExecutor..."
|
||||||
|
ExtractDialogText="请稍候,正在解压文件..."
|
||||||
|
ExtractPathText="解压路径:"
|
||||||
|
ExtractTitle="解压中"
|
||||||
|
FinishMessage="解压完成!"
|
||||||
|
GUIFlags="8"
|
||||||
|
;!@InstallEnd@!
|
||||||
|
"@
|
||||||
|
|
||||||
|
$configFile = "$outputPath\config.txt"
|
||||||
|
Set-Content -Path $configFile -Value $configContent -Encoding UTF8
|
||||||
|
|
||||||
|
# 创建压缩包
|
||||||
|
& $7zipPath a -sfx7z.sfx -r "$outputSfx" "$buildPath\*" -scsUTF-8 -y
|
||||||
|
Copy-Item "$configFile" -Destination "$outputSfx" -Force
|
||||||
|
|
||||||
|
if (Test-Path $outputSfx) {
|
||||||
|
Write-Host "✅ 7-Zip 自解压包创建成功!"
|
||||||
|
Write-Host "输出文件: $outputSfx"
|
||||||
|
|
||||||
|
$size = (Get-Item $outputSfx).Length / 1MB
|
||||||
|
Write-Host "文件大小: $([math]::Round($size, 2)) MB"
|
||||||
|
} else {
|
||||||
|
Write-Host "❌ 7-Zip 打包失败"
|
||||||
|
}
|
||||||
|
|
||||||
|
- name: Upload Single EXE Package
|
||||||
|
uses: actions/upload-artifact@v3
|
||||||
|
with:
|
||||||
|
name: windows-single-exe
|
||||||
|
path: dist/*.exe
|
||||||
|
if: always()
|
||||||
@@ -1,311 +0,0 @@
|
|||||||
# 📖 GitHub Actions 构建完全指南
|
|
||||||
|
|
||||||
## 🎯 功能概述
|
|
||||||
|
|
||||||
本 workflow 支持:
|
|
||||||
|
|
||||||
✅ **自动编译 libcore.aar** - sing-box 核心库
|
|
||||||
✅ **Release 构建** - 默认生成正式版 APK
|
|
||||||
✅ **可配置 API 域名** - 支持自定义后端域名
|
|
||||||
✅ **可配置 OSS 地址** - 支持自定义配置文件 CDN
|
|
||||||
✅ **分架构打包** - 生成 arm64-v8a / armeabi-v7a / x86_64 版本
|
|
||||||
✅ **自动创建 Release** - 推送标签自动发布
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚀 使用方法
|
|
||||||
|
|
||||||
### 方法一:手动触发(推荐,支持自定义配置)
|
|
||||||
|
|
||||||
1. **打开 Actions 页面**
|
|
||||||
- 进入 GitHub 仓库
|
|
||||||
- 点击顶部 **Actions** 标签
|
|
||||||
|
|
||||||
2. **选择 Workflow**
|
|
||||||
- 左侧选择 **Build Android APK**
|
|
||||||
- 右侧点击 **Run workflow** 下拉框
|
|
||||||
|
|
||||||
3. **配置参数**
|
|
||||||
|
|
||||||
| 参数 | 说明 | 默认值 |
|
|
||||||
|-----|------|--------|
|
|
||||||
| **构建类型** | debug 或 release | `release` |
|
|
||||||
| **API 域名** | 后端 API 服务器域名 | `api.maodag.top` |
|
|
||||||
| **OSS 地址 1** | 配置文件 CDN 地址(香港) | `https://ppp2.oss-cn-hongkong.aliyuncs.com/bear1.txt` |
|
|
||||||
| **OSS 地址 2** | 配置文件 CDN 地址(东京) | `https://xgp3.oss-ap-northeast-1.aliyuncs.com/bear1.txt` |
|
|
||||||
| **OSS 地址 3** | 配置文件 CDN 地址(首尔) | `https://xpp4.oss-ap-northeast-2.aliyuncs.com/bear1.txt` |
|
|
||||||
| **OSS 地址 4** | 配置文件 CDN 地址(新加坡) | `https://xpp5.oss-ap-southeast-1.aliyuncs.com/bear1.txt` |
|
|
||||||
|
|
||||||
4. **开始构建**
|
|
||||||
- 点击绿色 **Run workflow** 按钮
|
|
||||||
- 等待约 30 分钟完成
|
|
||||||
|
|
||||||
5. **下载 APK**
|
|
||||||
- 构建完成后,在运行记录页面找到 **Artifacts** 区域
|
|
||||||
- 下载对应架构的 APK
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 方法二:推送代码自动构建(使用默认配置)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 提交代码
|
|
||||||
git add .
|
|
||||||
git commit -m "feat: 新功能"
|
|
||||||
|
|
||||||
# 推送到 main 分支
|
|
||||||
git push origin main
|
|
||||||
```
|
|
||||||
|
|
||||||
**注意:** 自动触发的构建使用默认配置(`api.maodag.top` 和默认 OSS 地址)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 方法三:创建 Release 版本
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 1. 打标签(必须以 v 开头)
|
|
||||||
git tag v1.0.0
|
|
||||||
|
|
||||||
# 2. 推送标签
|
|
||||||
git push origin v1.0.0
|
|
||||||
|
|
||||||
# 3. 自动触发构建并创建 Release
|
|
||||||
# 访问 https://github.com/你的用户名/LighthouseApp/releases 查看
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📦 构建产物
|
|
||||||
|
|
||||||
### APK 命名规则
|
|
||||||
|
|
||||||
```
|
|
||||||
BearVPN-{架构}-{类型}-{日期}-{提交哈希}.apk
|
|
||||||
```
|
|
||||||
|
|
||||||
**示例:**
|
|
||||||
```
|
|
||||||
BearVPN-arm64-v8a-release-20251027-abc1234.apk
|
|
||||||
BearVPN-armeabi-v7a-release-20251027-abc1234.apk
|
|
||||||
BearVPN-x86_64-release-20251027-abc1234.apk
|
|
||||||
```
|
|
||||||
|
|
||||||
### 架构说明
|
|
||||||
|
|
||||||
| 架构 | 适用设备 | 推荐度 |
|
|
||||||
|------|---------|-------|
|
|
||||||
| **arm64-v8a** | 2017年后的现代手机 | ⭐⭐⭐⭐⭐ |
|
|
||||||
| **armeabi-v7a** | 2012-2017年的老旧手机 | ⭐⭐ |
|
|
||||||
| **x86_64** | Android 模拟器 | ⭐⭐⭐ |
|
|
||||||
|
|
||||||
**大多数用户应下载 `arm64-v8a` 版本**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔧 配置示例
|
|
||||||
|
|
||||||
### 示例 1:修改 API 域名
|
|
||||||
|
|
||||||
如果你的后端部署在 `api.example.com`:
|
|
||||||
|
|
||||||
1. 手动触发 workflow
|
|
||||||
2. 将 **API 域名** 改为 `api.example.com`
|
|
||||||
3. OSS 地址保持默认
|
|
||||||
4. 点击 Run workflow
|
|
||||||
|
|
||||||
### 示例 2:使用自己的 CDN
|
|
||||||
|
|
||||||
如果你有自己的配置文件 CDN:
|
|
||||||
|
|
||||||
1. 手动触发 workflow
|
|
||||||
2. API 域名保持默认
|
|
||||||
3. 修改 **OSS 地址 1-4** 为你的 CDN 地址,例如:
|
|
||||||
- OSS 地址 1: `https://cdn1.example.com/config.txt`
|
|
||||||
- OSS 地址 2: `https://cdn2.example.com/config.txt`
|
|
||||||
- OSS 地址 3: `https://cdn3.example.com/config.txt`
|
|
||||||
- OSS 地址 4: `https://cdn4.example.com/config.txt`
|
|
||||||
4. 点击 Run workflow
|
|
||||||
|
|
||||||
### 示例 3:完全自定义配置
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
构建类型: release
|
|
||||||
API 域名: api.mycompany.com
|
|
||||||
OSS 地址 1: https://config.mycdn.com/v1/nodes.txt
|
|
||||||
OSS 地址 2: https://backup1.mycdn.com/v1/nodes.txt
|
|
||||||
OSS 地址 3: https://backup2.mycdn.com/v1/nodes.txt
|
|
||||||
OSS 地址 4: https://backup3.mycdn.com/v1/nodes.txt
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ⏱️ 构建时间
|
|
||||||
|
|
||||||
| 阶段 | 时间 |
|
|
||||||
|-----|------|
|
|
||||||
| 编译 libcore.aar | 10-15 分钟 |
|
|
||||||
| 编译 Flutter APK | 15-20 分钟 |
|
|
||||||
| **总计** | **约 30 分钟** |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔍 查看构建日志
|
|
||||||
|
|
||||||
1. 打开 Actions 页面
|
|
||||||
2. 点击对应的运行记录
|
|
||||||
3. 点击具体的 job(如 "编译 Android APK")
|
|
||||||
4. 展开步骤查看详细日志
|
|
||||||
|
|
||||||
**关键步骤:**
|
|
||||||
- `⚙️ 配置 API 域名和 OSS 地址` - 查看配置是否正确替换
|
|
||||||
- `🔨 构建 APK` - 查看编译过程
|
|
||||||
- `📦 重命名 APK 文件` - 查看生成的文件名和 MD5
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🐛 常见问题
|
|
||||||
|
|
||||||
### Q1: 如何验证配置是否生效?
|
|
||||||
|
|
||||||
**A:** 查看 `⚙️ 配置 API 域名和 OSS 地址` 步骤的日志:
|
|
||||||
|
|
||||||
```
|
|
||||||
🔧 配置构建参数:
|
|
||||||
API 域名: api.example.com
|
|
||||||
OSS 地址 1: https://cdn1.example.com/config.txt
|
|
||||||
...
|
|
||||||
|
|
||||||
✅ 配置替换完成
|
|
||||||
|
|
||||||
📄 查看修改后的配置:
|
|
||||||
static List<String> kr_baseDomains = ["api.example.com","api.example.com"];
|
|
||||||
static String kr_currentDomain = "api.example.com";
|
|
||||||
```
|
|
||||||
|
|
||||||
如果看到你设置的域名,说明配置成功。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Q2: Release 构建和 Debug 构建有什么区别?
|
|
||||||
|
|
||||||
| 特性 | Debug | Release |
|
|
||||||
|-----|-------|---------|
|
|
||||||
| **文件大小** | 较大 | 较小(优化后) |
|
|
||||||
| **性能** | 较慢 | 快 |
|
|
||||||
| **调试信息** | 包含 | 移除 |
|
|
||||||
| **代码混淆** | 无 | 有 |
|
|
||||||
| **适用场景** | 开发测试 | 正式发布 |
|
|
||||||
|
|
||||||
**推荐:** 生产环境使用 **release** 构建
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Q3: 如何使用环境变量配置(不想每次手动输入)?
|
|
||||||
|
|
||||||
在仓库 **Settings → Secrets and variables → Actions → Variables** 添加:
|
|
||||||
|
|
||||||
| 变量名 | 值 |
|
|
||||||
|-------|---|
|
|
||||||
| `DEFAULT_API_DOMAIN` | `api.example.com` |
|
|
||||||
| `DEFAULT_OSS_URL_1` | `https://cdn1.example.com/config.txt` |
|
|
||||||
| `DEFAULT_OSS_URL_2` | `https://cdn2.example.com/config.txt` |
|
|
||||||
| `DEFAULT_OSS_URL_3` | `https://cdn3.example.com/config.txt` |
|
|
||||||
| `DEFAULT_OSS_URL_4` | `https://cdn4.example.com/config.txt` |
|
|
||||||
|
|
||||||
然后修改 workflow 文件,将默认值改为:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
default: ${{ vars.DEFAULT_API_DOMAIN || 'api.maodag.top' }}
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Q4: 构建失败 - "libcore.aar not found"
|
|
||||||
|
|
||||||
**原因:** libcore 编译失败
|
|
||||||
|
|
||||||
**解决:**
|
|
||||||
1. 检查 `build-libcore` job 的日志
|
|
||||||
2. 确认 Go 环境和 gomobile 安装成功
|
|
||||||
3. 确认 libcore 子模块已正确初始化
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Q5: 如何配置签名(Release 构建必需)?
|
|
||||||
|
|
||||||
详见主文档 `.github/workflows/README.md` 的签名配置章节。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 💡 高级技巧
|
|
||||||
|
|
||||||
### 技巧 1:同时构建多个版本
|
|
||||||
|
|
||||||
修改 `build-apk` job:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
build_type: [debug, release]
|
|
||||||
api_domain: ['api.maodag.top', 'api.example.com']
|
|
||||||
```
|
|
||||||
|
|
||||||
这样会生成 4 个 APK(2种类型 × 2个域名)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 技巧 2:添加构建完成通知
|
|
||||||
|
|
||||||
在 workflow 最后添加:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
- name: 📢 发送 Telegram 通知
|
|
||||||
if: success()
|
|
||||||
run: |
|
|
||||||
curl -X POST "https://api.telegram.org/bot${{ secrets.TELEGRAM_BOT_TOKEN }}/sendMessage" \
|
|
||||||
-d chat_id=${{ secrets.TELEGRAM_CHAT_ID }} \
|
|
||||||
-d text="✅ BearVPN 构建成功!下载: https://github.com/${{ github.repository }}/actions/runs/${{ github.run_id }}"
|
|
||||||
```
|
|
||||||
|
|
||||||
需要先配置 `TELEGRAM_BOT_TOKEN` 和 `TELEGRAM_CHAT_ID` Secrets。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 技巧 3:缓存加速构建
|
|
||||||
|
|
||||||
workflow 已配置 Go 和 Flutter 缓存,首次构建约 30 分钟,后续构建可缩短至 15-20 分钟。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📊 构建状态徽章
|
|
||||||
|
|
||||||
在 README.md 中添加:
|
|
||||||
|
|
||||||
```markdown
|
|
||||||

|
|
||||||
```
|
|
||||||
|
|
||||||
效果:
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔗 相关文件
|
|
||||||
|
|
||||||
- **主 Workflow:** `.github/workflows/build-android-apk.yml`
|
|
||||||
- **配置文件:** `lib/app/common/app_config.dart`
|
|
||||||
- **libcore 源码:** `libcore/` 子模块
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📞 需要帮助?
|
|
||||||
|
|
||||||
- 查看 [GitHub Actions 文档](https://docs.github.com/actions)
|
|
||||||
- 查看构建日志排查问题
|
|
||||||
- 提交 Issue 到仓库
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**生成时间:** 2025-10-27
|
|
||||||
**作者:** Claude Code
|
|
||||||
**版本:** 1.0.0
|
|
||||||
@@ -1,366 +0,0 @@
|
|||||||
# 🎯 如何在 GitHub 上构建你的应用
|
|
||||||
|
|
||||||
## 📋 前提条件
|
|
||||||
|
|
||||||
✅ 已将配置推送到 GitHub
|
|
||||||
✅ 有 GitHub 账号访问权限
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚀 方法一:手动触发构建(推荐新手)
|
|
||||||
|
|
||||||
### 步骤 1: 访问 GitHub Actions 页面
|
|
||||||
|
|
||||||
1. 打开浏览器,访问你的仓库:
|
|
||||||
```
|
|
||||||
https://github.com/你的用户名/LighthouseApp
|
|
||||||
```
|
|
||||||
|
|
||||||
2. 点击顶部导航栏的 **Actions** 标签
|
|
||||||
```
|
|
||||||
Code Issues Pull requests Actions Projects Wiki Security Insights
|
|
||||||
↑ 点这里
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 步骤 2: 选择 Workflow
|
|
||||||
|
|
||||||
在左侧栏看到可用的 workflows:
|
|
||||||
|
|
||||||
```
|
|
||||||
All workflows
|
|
||||||
├── Build Android APK ← 仅构建 Android
|
|
||||||
├── Build Multi-Platform ← 构建所有平台 ⭐推荐
|
|
||||||
└── Build Clash Core
|
|
||||||
```
|
|
||||||
|
|
||||||
**选择建议:**
|
|
||||||
- 🟢 **首次测试:** 选择 **Build Android APK**(快速)
|
|
||||||
- 🔵 **正式发布:** 选择 **Build Multi-Platform**(全平台)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 步骤 3: 运行 Workflow
|
|
||||||
|
|
||||||
1. 点击选择的 workflow 名称
|
|
||||||
|
|
||||||
2. 右侧出现 **"Run workflow"** 下拉按钮
|
|
||||||
```
|
|
||||||
[Run workflow ▼]
|
|
||||||
```
|
|
||||||
|
|
||||||
3. 点击下拉按钮,展开配置面板
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 步骤 4: 配置参数
|
|
||||||
|
|
||||||
#### 如果选择 "Build Android APK":
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
┌─────────────────────────────────────────┐
|
|
||||||
│ Run workflow │
|
|
||||||
├─────────────────────────────────────────┤
|
|
||||||
│ Use workflow from │
|
|
||||||
│ Branch: main [▼] │
|
|
||||||
│ │
|
|
||||||
│ 构建类型 │
|
|
||||||
│ ○ debug │
|
|
||||||
│ ● release │
|
|
||||||
│ │
|
|
||||||
│ API 域名 │
|
|
||||||
│ [api.maodag.top________________] │
|
|
||||||
│ │
|
|
||||||
│ OSS 配置地址 1 │
|
|
||||||
│ [https://ppp2.oss-cn-hongkong...] │
|
|
||||||
│ │
|
|
||||||
│ OSS 配置地址 2 │
|
|
||||||
│ [https://xgp3.oss-ap-northeast-1...] │
|
|
||||||
│ │
|
|
||||||
│ OSS 配置地址 3 │
|
|
||||||
│ [https://xpp4.oss-ap-northeast-2...] │
|
|
||||||
│ │
|
|
||||||
│ OSS 配置地址 4 │
|
|
||||||
│ [https://xpp5.oss-ap-southeast-1...] │
|
|
||||||
│ │
|
|
||||||
│ [Cancel] [Run workflow] │
|
|
||||||
└─────────────────────────────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
**配置说明:**
|
|
||||||
- **构建类型:** 选择 `release`(生产环境)
|
|
||||||
- **API 域名:** 填写你的后端域名(默认 `api.maodag.top`)
|
|
||||||
- **OSS 地址:** 保持默认或填写你的 CDN 地址
|
|
||||||
|
|
||||||
#### 如果选择 "Build Multi-Platform":
|
|
||||||
|
|
||||||
额外多一个参数:
|
|
||||||
```yaml
|
|
||||||
│ 构建平台 │
|
|
||||||
│ [android,windows,macos,linux______] │
|
|
||||||
```
|
|
||||||
|
|
||||||
**选项:**
|
|
||||||
- `android` - 仅 Android
|
|
||||||
- `windows` - 仅 Windows
|
|
||||||
- `macos` - 仅 macOS
|
|
||||||
- `linux` - 仅 Linux
|
|
||||||
- `android,windows` - Android + Windows
|
|
||||||
- `android,windows,macos,linux` - 全部平台 ⭐
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 步骤 5: 开始构建
|
|
||||||
|
|
||||||
1. 检查所有参数是否正确
|
|
||||||
|
|
||||||
2. 点击绿色的 **"Run workflow"** 按钮
|
|
||||||
|
|
||||||
3. 页面刷新,顶部出现黄色进度条:
|
|
||||||
```
|
|
||||||
⚠️ Build Android APK #1
|
|
||||||
Queued - This workflow is in queue waiting to run
|
|
||||||
```
|
|
||||||
|
|
||||||
4. 几秒后变为蓝色(运行中):
|
|
||||||
```
|
|
||||||
🔵 Build Android APK #1
|
|
||||||
In progress - This workflow is currently running
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 步骤 6: 监控构建进度
|
|
||||||
|
|
||||||
1. 点击运行记录(蓝色行)
|
|
||||||
|
|
||||||
2. 看到构建阶段:
|
|
||||||
```
|
|
||||||
编译 libcore.aar 🔵 Running (15分钟)
|
|
||||||
编译 Android APK ⏸️ Pending
|
|
||||||
```
|
|
||||||
|
|
||||||
3. 可以展开查看实时日志:
|
|
||||||
```
|
|
||||||
▼ 编译 libcore.aar
|
|
||||||
▼ 📦 编译 libcore.aar
|
|
||||||
🚀 开始编译 libcore...
|
|
||||||
[gomobile] installing...
|
|
||||||
✅ libcore.aar 生成成功
|
|
||||||
```
|
|
||||||
|
|
||||||
4. 等待所有阶段完成(约 30-85 分钟)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 步骤 7: 下载构建产物
|
|
||||||
|
|
||||||
构建成功后:
|
|
||||||
|
|
||||||
1. 向下滚动到 **Artifacts** 区域
|
|
||||||
```
|
|
||||||
📦 Artifacts
|
|
||||||
|
|
||||||
Produced during runtime
|
|
||||||
|
|
||||||
Name Size Expires
|
|
||||||
apk-arm64-v8a-release 42.5 MB in 30 days [Download]
|
|
||||||
apk-armeabi-v7a-release 38.2 MB in 30 days [Download]
|
|
||||||
apk-x86_64-release 45.1 MB in 30 days [Download]
|
|
||||||
```
|
|
||||||
|
|
||||||
2. 点击 **[Download]** 下载对应文件
|
|
||||||
|
|
||||||
3. 下载的是 ZIP 文件,解压后得到 APK:
|
|
||||||
```
|
|
||||||
apk-arm64-v8a-release.zip
|
|
||||||
└── BearVPN-android-arm64-v8a-release-20251027-abc1234.apk
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🏷️ 方法二:推送标签自动构建
|
|
||||||
|
|
||||||
这种方式会自动构建并创建 GitHub Release。
|
|
||||||
|
|
||||||
### 步骤 1: 在本地打标签
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /Users/mac/Project/Dart/LighthouseApp
|
|
||||||
|
|
||||||
# 创建标签(版本号必须以 v 开头)
|
|
||||||
git tag v1.0.0
|
|
||||||
|
|
||||||
# 查看标签
|
|
||||||
git tag
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 步骤 2: 推送标签到 GitHub
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git push origin v1.0.0
|
|
||||||
```
|
|
||||||
|
|
||||||
**输出:**
|
|
||||||
```
|
|
||||||
Enumerating objects: 1, done.
|
|
||||||
Counting objects: 100% (1/1), done.
|
|
||||||
Writing objects: 100% (1/1), 160 bytes | 160.00 KiB/s, done.
|
|
||||||
Total 1 (delta 0), reused 0 (delta 0)
|
|
||||||
To github.com:你的用户名/LighthouseApp.git
|
|
||||||
* [new tag] v1.0.0 -> v1.0.0
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 步骤 3: 自动触发构建
|
|
||||||
|
|
||||||
1. 推送标签后,GitHub 自动检测到标签
|
|
||||||
2. 触发 **Build Multi-Platform** workflow
|
|
||||||
3. 使用默认配置构建所有平台
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 步骤 4: 查看构建进度
|
|
||||||
|
|
||||||
1. 访问 Actions 页面
|
|
||||||
2. 看到自动创建的构建任务:
|
|
||||||
```
|
|
||||||
🔵 Build Multi-Platform
|
|
||||||
v1.0.0
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 步骤 5: 下载 Release
|
|
||||||
|
|
||||||
构建成功后:
|
|
||||||
|
|
||||||
1. 访问 **Releases** 页面:
|
|
||||||
```
|
|
||||||
https://github.com/你的用户名/LighthouseApp/releases
|
|
||||||
```
|
|
||||||
|
|
||||||
2. 看到新创建的 Release:
|
|
||||||
```
|
|
||||||
📦 v1.0.0
|
|
||||||
|
|
||||||
Latest Pre-release
|
|
||||||
|
|
||||||
🎉 BearVPN 多平台版本发布
|
|
||||||
|
|
||||||
Assets (7)
|
|
||||||
├── BearVPN-android-arm64-v8a-release-*.apk 42.5 MB
|
|
||||||
├── BearVPN-android-armeabi-v7a-release-*.apk 38.2 MB
|
|
||||||
├── BearVPN-android-x86_64-release-*.apk 45.1 MB
|
|
||||||
├── BearVPN-windows-x64-release-*.zip 52.3 MB
|
|
||||||
├── BearVPN-macos-release-*.zip 48.7 MB
|
|
||||||
├── BearVPN-linux-x64-release-*.tar.gz 45.9 MB
|
|
||||||
└── Source code (zip)
|
|
||||||
```
|
|
||||||
|
|
||||||
3. 直接下载需要的文件
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ⏱️ 构建时间参考
|
|
||||||
|
|
||||||
| Workflow | 平台 | 时间 |
|
|
||||||
|---------|------|------|
|
|
||||||
| Build Android APK | Android | 30 分钟 |
|
|
||||||
| Build Multi-Platform | Android | 35 分钟 |
|
|
||||||
| Build Multi-Platform | Windows | 30 分钟 |
|
|
||||||
| Build Multi-Platform | macOS | 35 分钟 |
|
|
||||||
| Build Multi-Platform | Linux | 30 分钟 |
|
|
||||||
| Build Multi-Platform | 全部平台 | **60-85 分钟** |
|
|
||||||
|
|
||||||
**提示:** 平台是并行构建的,不是累加时间。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 推荐流程
|
|
||||||
|
|
||||||
### 首次测试(验证流程)
|
|
||||||
|
|
||||||
```
|
|
||||||
1. 选择 "Build Android APK"
|
|
||||||
2. 使用默认配置
|
|
||||||
3. 运行构建
|
|
||||||
4. 等待 30 分钟
|
|
||||||
5. 下载 arm64-v8a APK
|
|
||||||
6. 安装测试
|
|
||||||
```
|
|
||||||
|
|
||||||
### 正式发布(生产环境)
|
|
||||||
|
|
||||||
```
|
|
||||||
1. 确保代码已测试
|
|
||||||
2. 本地打标签: git tag v1.0.0
|
|
||||||
3. 推送标签: git push origin v1.0.0
|
|
||||||
4. 等待 60-85 分钟
|
|
||||||
5. 在 Releases 页面下载所有平台
|
|
||||||
6. 分发给用户
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🐛 常见问题
|
|
||||||
|
|
||||||
### Q1: 找不到 "Run workflow" 按钮
|
|
||||||
|
|
||||||
**原因:** 可能还在查看历史运行记录
|
|
||||||
|
|
||||||
**解决:**
|
|
||||||
1. 点击左侧的 workflow 名称
|
|
||||||
2. 确保在 workflow 主页面
|
|
||||||
3. 右侧会出现 "Run workflow" 按钮
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Q2: 构建失败
|
|
||||||
|
|
||||||
**排查步骤:**
|
|
||||||
1. 点击失败的运行记录
|
|
||||||
2. 展开红色的步骤
|
|
||||||
3. 查看错误日志
|
|
||||||
4. 常见错误:
|
|
||||||
- libcore 编译失败 → 检查 Go 环境
|
|
||||||
- APK 构建失败 → 检查 Flutter 依赖
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Q3: Artifacts 下载后是空的
|
|
||||||
|
|
||||||
**原因:** 构建可能失败
|
|
||||||
|
|
||||||
**解决:**
|
|
||||||
1. 检查构建日志
|
|
||||||
2. 确保所有步骤都是绿色 ✅
|
|
||||||
3. 重新运行构建
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Q4: 如何修改 API 域名
|
|
||||||
|
|
||||||
**方法 1:** 手动触发时修改参数
|
|
||||||
|
|
||||||
**方法 2:** 修改代码中的默认值
|
|
||||||
```dart
|
|
||||||
// lib/app/common/app_config.dart
|
|
||||||
static String kr_currentDomain = "api.example.com";
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📞 需要帮助?
|
|
||||||
|
|
||||||
- **查看详细文档:** `.github/workflows/INDEX.md`
|
|
||||||
- **快速开始:** `.github/workflows/QUICKSTART.md`
|
|
||||||
- **问题反馈:** GitHub Issues
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**准备好了吗?立即开始构建!** 🚀
|
|
||||||
@@ -1,318 +0,0 @@
|
|||||||
# 📚 GitHub Actions 构建系统总览
|
|
||||||
|
|
||||||
## 🎯 快速导航
|
|
||||||
|
|
||||||
| 文档 | 用途 | 适合人群 |
|
|
||||||
|-----|------|---------|
|
|
||||||
| **[QUICKSTART.md](./QUICKSTART.md)** | 3步快速开始 | 新手 |
|
|
||||||
| **[README.md](./README.md)** | 基础说明 | 所有人 |
|
|
||||||
| **[BUILD_GUIDE.md](./BUILD_GUIDE.md)** | Android 详细指南 | Android 开发者 |
|
|
||||||
| **[MULTIPLATFORM_GUIDE.md](./MULTIPLATFORM_GUIDE.md)** | 多平台构建指南 | 全平台开发者 |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📋 可用的 Workflows
|
|
||||||
|
|
||||||
### 1. `build-android-apk.yml` - Android 专用构建
|
|
||||||
|
|
||||||
**功能:**
|
|
||||||
- ✅ 编译 libcore.aar
|
|
||||||
- ✅ 构建 Android APK (arm64/armv7/x86_64)
|
|
||||||
- ✅ 配置 API 域名和 OSS 地址
|
|
||||||
- ✅ Release 构建
|
|
||||||
|
|
||||||
**触发条件:**
|
|
||||||
- 推送到 main/develop 分支
|
|
||||||
- 创建 v* 标签
|
|
||||||
- 手动触发
|
|
||||||
|
|
||||||
**文档:** [BUILD_GUIDE.md](./BUILD_GUIDE.md)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 2. `build-multiplatform.yml` - 多平台构建 ⭐推荐
|
|
||||||
|
|
||||||
**功能:**
|
|
||||||
- ✅ Android APK
|
|
||||||
- ✅ Windows 可执行文件
|
|
||||||
- ✅ macOS 应用
|
|
||||||
- ✅ Linux 可执行文件
|
|
||||||
- ✅ 可选择构建平台
|
|
||||||
- ✅ 统一配置管理
|
|
||||||
|
|
||||||
**触发条件:**
|
|
||||||
- 推送到 main/develop 分支
|
|
||||||
- 创建 v* 标签
|
|
||||||
- 手动触发
|
|
||||||
|
|
||||||
**文档:** [MULTIPLATFORM_GUIDE.md](./MULTIPLATFORM_GUIDE.md)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 3. `build-clash-core.yml` - Clash 核心编译
|
|
||||||
|
|
||||||
**功能:**
|
|
||||||
- 编译 Clash Meta 核心
|
|
||||||
- 支持多架构 (arm64/armv7/x86_64)
|
|
||||||
|
|
||||||
**触发条件:**
|
|
||||||
- core/ 目录变更
|
|
||||||
- 手动触发
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚀 使用建议
|
|
||||||
|
|
||||||
### 场景 1: 日常开发(仅 Android)
|
|
||||||
|
|
||||||
**使用:** `build-android-apk.yml`
|
|
||||||
```bash
|
|
||||||
# 推送代码自动触发
|
|
||||||
git push origin main
|
|
||||||
```
|
|
||||||
|
|
||||||
**时间:** 约 30 分钟
|
|
||||||
**产物:** 3 个 Android APK
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 场景 2: 正式发布(所有平台)
|
|
||||||
|
|
||||||
**使用:** `build-multiplatform.yml`
|
|
||||||
```bash
|
|
||||||
# 1. 打标签
|
|
||||||
git tag v1.0.0
|
|
||||||
git push origin v1.0.0
|
|
||||||
|
|
||||||
# 2. 自动构建所有平台并创建 Release
|
|
||||||
```
|
|
||||||
|
|
||||||
**时间:** 约 60-85 分钟(并行)
|
|
||||||
**产物:** Android + Windows + macOS + Linux
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 场景 3: 测试特定平台
|
|
||||||
|
|
||||||
**使用:** `build-multiplatform.yml` 手动触发
|
|
||||||
```yaml
|
|
||||||
构建平台: android,windows # 只构建这两个
|
|
||||||
```
|
|
||||||
|
|
||||||
**时间:** 约 35 分钟
|
|
||||||
**产物:** 指定平台
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📦 构建产物对比
|
|
||||||
|
|
||||||
### Android 专用构建
|
|
||||||
|
|
||||||
```
|
|
||||||
BearVPN-android-arm64-v8a-release-20251027-abc1234.apk
|
|
||||||
BearVPN-android-armeabi-v7a-release-20251027-abc1234.apk
|
|
||||||
BearVPN-android-x86_64-release-20251027-abc1234.apk
|
|
||||||
```
|
|
||||||
|
|
||||||
### 多平台构建
|
|
||||||
|
|
||||||
```
|
|
||||||
# Android
|
|
||||||
BearVPN-android-arm64-v8a-release-20251027-abc1234.apk
|
|
||||||
BearVPN-android-armeabi-v7a-release-20251027-abc1234.apk
|
|
||||||
BearVPN-android-x86_64-release-20251027-abc1234.apk
|
|
||||||
|
|
||||||
# Windows
|
|
||||||
BearVPN-windows-x64-release-20251027-abc1234.zip
|
|
||||||
|
|
||||||
# macOS
|
|
||||||
BearVPN-macos-release-20251027-abc1234.zip
|
|
||||||
|
|
||||||
# Linux
|
|
||||||
BearVPN-linux-x64-release-20251027-abc1234.tar.gz
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ⚙️ 配置参数说明
|
|
||||||
|
|
||||||
### 所有 Workflow 通用参数
|
|
||||||
|
|
||||||
| 参数 | 默认值 | 说明 |
|
|
||||||
|-----|-------|------|
|
|
||||||
| **构建类型** | `release` | debug 或 release |
|
|
||||||
| **API 域名** | `api.maodag.top` | 后端服务器地址 |
|
|
||||||
| **OSS 地址 1** | 香港 CDN | 配置文件源 |
|
|
||||||
| **OSS 地址 2** | 东京 CDN | 备用配置源 |
|
|
||||||
| **OSS 地址 3** | 首尔 CDN | 备用配置源 |
|
|
||||||
| **OSS 地址 4** | 新加坡 CDN | 备用配置源 |
|
|
||||||
|
|
||||||
### 多平台专用参数
|
|
||||||
|
|
||||||
| 参数 | 默认值 | 说明 |
|
|
||||||
|-----|-------|------|
|
|
||||||
| **构建平台** | `android,windows,macos,linux` | 选择构建的平台 |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ⏱️ 构建时间对比
|
|
||||||
|
|
||||||
| Workflow | 单平台 | 全平台 |
|
|
||||||
|---------|-------|-------|
|
|
||||||
| **Android 专用** | 30分钟 | - |
|
|
||||||
| **多平台** | 30-40分钟 | 60-85分钟 |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 选择 Workflow 的建议
|
|
||||||
|
|
||||||
### 选择 `build-android-apk.yml` 如果:
|
|
||||||
|
|
||||||
- ✅ 只需要 Android 版本
|
|
||||||
- ✅ 快速迭代开发
|
|
||||||
- ✅ CI/CD 自动触发
|
|
||||||
|
|
||||||
### 选择 `build-multiplatform.yml` 如果:
|
|
||||||
|
|
||||||
- ✅ 需要桌面版本
|
|
||||||
- ✅ 正式版本发布
|
|
||||||
- ✅ 需要灵活选择平台
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔧 环境配置
|
|
||||||
|
|
||||||
### 必需的 Secrets(用于 Release 签名)
|
|
||||||
|
|
||||||
**Android:**
|
|
||||||
```
|
|
||||||
KEYSTORE_BASE64
|
|
||||||
KEYSTORE_PASSWORD
|
|
||||||
KEY_ALIAS
|
|
||||||
KEY_PASSWORD
|
|
||||||
```
|
|
||||||
|
|
||||||
**macOS:**
|
|
||||||
```
|
|
||||||
MACOS_CERTIFICATE_BASE64
|
|
||||||
MACOS_CERTIFICATE_PASSWORD
|
|
||||||
```
|
|
||||||
|
|
||||||
**Windows:**
|
|
||||||
```
|
|
||||||
WINDOWS_CERTIFICATE_BASE64
|
|
||||||
WINDOWS_CERTIFICATE_PASSWORD
|
|
||||||
```
|
|
||||||
|
|
||||||
**说明:** 如果不配置签名,可以使用 debug 构建。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📊 构建流程图
|
|
||||||
|
|
||||||
### Android 专用
|
|
||||||
|
|
||||||
```
|
|
||||||
Checkout 代码
|
|
||||||
↓
|
|
||||||
编译 libcore.aar (15min)
|
|
||||||
↓
|
|
||||||
配置 API/OSS
|
|
||||||
↓
|
|
||||||
构建 APK (20min)
|
|
||||||
↓
|
|
||||||
上传产物
|
|
||||||
```
|
|
||||||
|
|
||||||
### 多平台
|
|
||||||
|
|
||||||
```
|
|
||||||
Checkout 代码
|
|
||||||
↓
|
|
||||||
编译 libcore.aar (15min)
|
|
||||||
↓
|
|
||||||
├─→ Android (20min) ─┐
|
|
||||||
├─→ Windows (15min) ─┤
|
|
||||||
├─→ macOS (20min) ─┼─→ 创建 Release
|
|
||||||
└─→ Linux (15min) ─┘
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🐛 故障排查
|
|
||||||
|
|
||||||
### 问题 1: libcore 编译失败
|
|
||||||
|
|
||||||
**检查:**
|
|
||||||
1. Go 环境是否正常
|
|
||||||
2. gomobile 是否安装
|
|
||||||
3. 网络连接(下载依赖)
|
|
||||||
|
|
||||||
**日志位置:** `build-libcore` job
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 问题 2: Android 构建失败
|
|
||||||
|
|
||||||
**常见原因:**
|
|
||||||
- libcore.aar 未生成
|
|
||||||
- Gradle 依赖问题
|
|
||||||
- 签名配置错误
|
|
||||||
|
|
||||||
**解决:** 查看 `build-android` job 日志
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 问题 3: macOS 构建失败
|
|
||||||
|
|
||||||
**常见原因:**
|
|
||||||
- 签名证书未配置
|
|
||||||
- Xcode 版本不兼容
|
|
||||||
|
|
||||||
**解决:**
|
|
||||||
- 使用 debug 构建
|
|
||||||
- 或配置签名证书
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 💡 高级用法
|
|
||||||
|
|
||||||
### 1. 定时构建
|
|
||||||
|
|
||||||
添加到 workflow:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '0 2 * * *' # 每天UTC 2:00
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. PR 自动构建
|
|
||||||
|
|
||||||
已配置:推送 PR 到 main 分支自动触发
|
|
||||||
|
|
||||||
### 3. 构建通知
|
|
||||||
|
|
||||||
可集成 Telegram/Slack/钉钉通知
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📞 获取帮助
|
|
||||||
|
|
||||||
- **查看文档:** 本目录下的 Markdown 文件
|
|
||||||
- **查看日志:** GitHub Actions 页面
|
|
||||||
- **提交问题:** Issues 页面
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔗 相关链接
|
|
||||||
|
|
||||||
- [GitHub Actions 文档](https://docs.github.com/actions)
|
|
||||||
- [Flutter CI/CD](https://docs.flutter.dev/deployment/cd)
|
|
||||||
- [sing-box 文档](https://sing-box.sagernet.org/)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**版本:** 1.0.0
|
|
||||||
**更新:** 2025-10-27
|
|
||||||
**作者:** Claude Code
|
|
||||||
@@ -1,407 +0,0 @@
|
|||||||
# 🌐 多平台构建完全指南
|
|
||||||
|
|
||||||
## 📋 支持的平台
|
|
||||||
|
|
||||||
✅ **Android** - arm64-v8a / armeabi-v7a / x86_64
|
|
||||||
✅ **Windows** - x64
|
|
||||||
✅ **macOS** - Universal (Intel + Apple Silicon)
|
|
||||||
✅ **Linux** - x64
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚀 快速开始
|
|
||||||
|
|
||||||
### 方法 1: 构建所有平台(推荐)
|
|
||||||
|
|
||||||
1. 打开 GitHub Actions 页面
|
|
||||||
2. 选择 **Build Multi-Platform**
|
|
||||||
3. 点击 **Run workflow**
|
|
||||||
4. 配置参数:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
构建类型: release
|
|
||||||
API 域名: api.maodag.top
|
|
||||||
OSS 地址 1-4: 使用默认值
|
|
||||||
构建平台: android,windows,macos,linux # 构建所有平台
|
|
||||||
```
|
|
||||||
|
|
||||||
5. 点击 **Run workflow** 开始
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 方法 2: 仅构建指定平台
|
|
||||||
|
|
||||||
**场景:** 只需要 Android 和 Windows 版本
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
构建平台: android,windows # 只构建这两个平台
|
|
||||||
```
|
|
||||||
|
|
||||||
**可选值:**
|
|
||||||
- `android` - 仅 Android
|
|
||||||
- `windows` - 仅 Windows
|
|
||||||
- `macos` - 仅 macOS
|
|
||||||
- `linux` - 仅 Linux
|
|
||||||
- `android,windows` - Android + Windows
|
|
||||||
- `android,windows,macos,linux` - 全部平台
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ⏱️ 构建时间估算
|
|
||||||
|
|
||||||
| 平台 | 时间 | 说明 |
|
|
||||||
|-----|------|-----|
|
|
||||||
| **libcore** | 10-15分钟 | Android 依赖 |
|
|
||||||
| **Android** | 15-20分钟 | 3个架构APK |
|
|
||||||
| **Windows** | 10-15分钟 | x64可执行文件 |
|
|
||||||
| **macOS** | 15-20分钟 | Universal应用 |
|
|
||||||
| **Linux** | 10-15分钟 | x64可执行文件 |
|
|
||||||
| **总计(全平台)** | **60-85分钟** | 并行构建 |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📦 构建产物
|
|
||||||
|
|
||||||
### Android
|
|
||||||
|
|
||||||
```
|
|
||||||
BearVPN-android-arm64-v8a-release-20251027-abc1234.apk (推荐)
|
|
||||||
BearVPN-android-armeabi-v7a-release-20251027-abc1234.apk (老设备)
|
|
||||||
BearVPN-android-x86_64-release-20251027-abc1234.apk (模拟器)
|
|
||||||
```
|
|
||||||
|
|
||||||
**安装:** 直接点击APK安装
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Windows
|
|
||||||
|
|
||||||
```
|
|
||||||
BearVPN-windows-x64-release-20251027-abc1234.zip
|
|
||||||
```
|
|
||||||
|
|
||||||
**内容结构:**
|
|
||||||
```
|
|
||||||
BearVPN.exe # 主程序
|
|
||||||
flutter_windows.dll # Flutter运行时
|
|
||||||
data/ # 资源文件
|
|
||||||
```
|
|
||||||
|
|
||||||
**运行:**
|
|
||||||
1. 解压 ZIP 文件
|
|
||||||
2. 双击 `BearVPN.exe` 运行
|
|
||||||
3. 如提示缺少依赖,安装 [VC++ Redistributable](https://aka.ms/vs/17/release/vc_redist.x64.exe)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### macOS
|
|
||||||
|
|
||||||
```
|
|
||||||
BearVPN-macos-release-20251027-abc1234.zip
|
|
||||||
```
|
|
||||||
|
|
||||||
**内容:**
|
|
||||||
```
|
|
||||||
BearVPN.app # 应用程序包(Universal)
|
|
||||||
```
|
|
||||||
|
|
||||||
**安装:**
|
|
||||||
1. 解压 ZIP 文件
|
|
||||||
2. 将 `BearVPN.app` 拖到 **应用程序** 文件夹
|
|
||||||
3. 首次运行右键点击 → 打开(绕过 Gatekeeper)
|
|
||||||
|
|
||||||
**支持架构:**
|
|
||||||
- Intel (x86_64)
|
|
||||||
- Apple Silicon (arm64)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Linux
|
|
||||||
|
|
||||||
```
|
|
||||||
BearVPN-linux-x64-release-20251027-abc1234.tar.gz
|
|
||||||
```
|
|
||||||
|
|
||||||
**内容结构:**
|
|
||||||
```
|
|
||||||
bearvpn # 可执行文件
|
|
||||||
lib/ # 共享库
|
|
||||||
data/ # 资源文件
|
|
||||||
```
|
|
||||||
|
|
||||||
**运行:**
|
|
||||||
```bash
|
|
||||||
# 1. 解压
|
|
||||||
tar -xzf BearVPN-linux-x64-release-*.tar.gz
|
|
||||||
cd bundle
|
|
||||||
|
|
||||||
# 2. 添加执行权限
|
|
||||||
chmod +x bearvpn
|
|
||||||
|
|
||||||
# 3. 运行
|
|
||||||
./bearvpn
|
|
||||||
```
|
|
||||||
|
|
||||||
**依赖要求:**
|
|
||||||
- GTK+ 3
|
|
||||||
- libstdc++12
|
|
||||||
|
|
||||||
**安装依赖(Ubuntu/Debian):**
|
|
||||||
```bash
|
|
||||||
sudo apt-get install libgtk-3-0 libstdc++6
|
|
||||||
```
|
|
||||||
|
|
||||||
**安装依赖(Fedora/RHEL):**
|
|
||||||
```bash
|
|
||||||
sudo dnf install gtk3 libstdc++
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔧 配置说明
|
|
||||||
|
|
||||||
### 所有平台通用配置
|
|
||||||
|
|
||||||
| 参数 | 默认值 | 说明 |
|
|
||||||
|-----|-------|------|
|
|
||||||
| **构建类型** | `release` | debug 或 release |
|
|
||||||
| **API 域名** | `api.maodag.top` | 后端服务器 |
|
|
||||||
| **OSS 地址 1** | 香港 CDN | 配置文件源 |
|
|
||||||
| **OSS 地址 2** | 东京 CDN | 备用源 |
|
|
||||||
| **OSS 地址 3** | 首尔 CDN | 备用源 |
|
|
||||||
| **OSS 地址 4** | 新加坡 CDN | 备用源 |
|
|
||||||
| **构建平台** | `android,windows,macos,linux` | 选择平台 |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📥 下载构建产物
|
|
||||||
|
|
||||||
### 从 Actions 页面下载
|
|
||||||
|
|
||||||
1. 打开运行记录
|
|
||||||
2. 滚动到 **Artifacts** 区域
|
|
||||||
3. 下载对应平台:
|
|
||||||
- `android-apk` - Android APK (所有架构)
|
|
||||||
- `windows-x64` - Windows 可执行程序
|
|
||||||
- `macos-app` - macOS 应用
|
|
||||||
- `linux-x64` - Linux 可执行程序
|
|
||||||
|
|
||||||
### 从 Releases 下载(推送标签时)
|
|
||||||
|
|
||||||
1. 访问 Releases 页面
|
|
||||||
2. 选择版本
|
|
||||||
3. 在 Assets 中下载对应平台文件
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 使用场景
|
|
||||||
|
|
||||||
### 场景 1: 开发测试(仅 Android)
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
构建类型: debug
|
|
||||||
构建平台: android
|
|
||||||
API 域名: api.test.com
|
|
||||||
```
|
|
||||||
|
|
||||||
**优点:** 快速,约20分钟
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 场景 2: 正式发布(全平台)
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
构建类型: release
|
|
||||||
构建平台: android,windows,macos,linux
|
|
||||||
API 域名: api.maodag.top
|
|
||||||
```
|
|
||||||
|
|
||||||
**优点:** 一次构建,覆盖所有用户
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 场景 3: 仅桌面平台
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
构建类型: release
|
|
||||||
构建平台: windows,macos,linux
|
|
||||||
```
|
|
||||||
|
|
||||||
**用途:** 桌面版更新
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🐛 常见问题
|
|
||||||
|
|
||||||
### Q1: Windows 构建失败 - "7z command not found"
|
|
||||||
|
|
||||||
**原因:** Windows runner 默认有 7z
|
|
||||||
|
|
||||||
**解决:** 检查构建日志,可能是其他错误
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Q2: macOS 构建失败 - "Code signing required"
|
|
||||||
|
|
||||||
**原因:** Release 构建需要签名
|
|
||||||
|
|
||||||
**解决方案:**
|
|
||||||
|
|
||||||
**方法 1:** 使用 debug 构建(测试用)
|
|
||||||
|
|
||||||
**方法 2:** 配置签名证书(生产用)
|
|
||||||
```yaml
|
|
||||||
# 在 Secrets 中添加
|
|
||||||
MACOS_CERTIFICATE_BASE64
|
|
||||||
MACOS_CERTIFICATE_PASSWORD
|
|
||||||
MACOS_KEYCHAIN_PASSWORD
|
|
||||||
PROVISIONING_PROFILE_BASE64
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Q3: Linux 运行时提示缺少库
|
|
||||||
|
|
||||||
**错误:**
|
|
||||||
```
|
|
||||||
error while loading shared libraries: libgtk-3.so.0
|
|
||||||
```
|
|
||||||
|
|
||||||
**解决:**
|
|
||||||
```bash
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install libgtk-3-0
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Q4: 如何只更新某个平台?
|
|
||||||
|
|
||||||
**方法 1:** 手动触发指定平台
|
|
||||||
```yaml
|
|
||||||
构建平台: android # 只构建 Android
|
|
||||||
```
|
|
||||||
|
|
||||||
**方法 2:** 创建平台专用 workflow(推荐)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Q5: 构建时间太长怎么办?
|
|
||||||
|
|
||||||
**优化方案:**
|
|
||||||
|
|
||||||
1. **仅构建需要的平台**
|
|
||||||
```yaml
|
|
||||||
构建平台: android # 而不是全部
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **使用缓存**(已配置)
|
|
||||||
- Flutter SDK 缓存
|
|
||||||
- Gradle 缓存
|
|
||||||
- Go modules 缓存
|
|
||||||
|
|
||||||
3. **分批构建**
|
|
||||||
- 白天构建 Android/Windows
|
|
||||||
- 晚上构建 macOS/Linux
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 💡 高级用法
|
|
||||||
|
|
||||||
### 技巧 1: 矩阵构建多个配置
|
|
||||||
|
|
||||||
修改 workflow:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
api_domain: ['api.prod.com', 'api.test.com']
|
|
||||||
platform: ['android', 'windows', 'macos', 'linux']
|
|
||||||
```
|
|
||||||
|
|
||||||
**效果:** 生成 8 个版本(2域名 × 4平台)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 技巧 2: 定时自动构建
|
|
||||||
|
|
||||||
添加到 workflow:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
on:
|
|
||||||
schedule:
|
|
||||||
- cron: '0 2 * * *' # 每天凌晨2点(UTC)
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 技巧 3: 构建完成通知
|
|
||||||
|
|
||||||
添加 Telegram 通知:
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
- name: 📢 通知
|
|
||||||
run: |
|
|
||||||
curl -X POST "https://api.telegram.org/bot${{ secrets.TG_BOT_TOKEN }}/sendMessage" \
|
|
||||||
-d chat_id=${{ secrets.TG_CHAT_ID }} \
|
|
||||||
-d text="✅ 多平台构建完成!"
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📊 构建并行示意图
|
|
||||||
|
|
||||||
```
|
|
||||||
libcore (15min)
|
|
||||||
↓
|
|
||||||
├─→ Android (20min) ─┐
|
|
||||||
├─→ Windows (15min) ─┤
|
|
||||||
├─→ macOS (20min) ─┼─→ Release (2min)
|
|
||||||
└─→ Linux (15min) ─┘
|
|
||||||
|
|
||||||
总时间: 约 35-40分钟(并行)
|
|
||||||
如果串行: 约 85分钟
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔐 安全建议
|
|
||||||
|
|
||||||
### Release 版本签名
|
|
||||||
|
|
||||||
**Android:**
|
|
||||||
```yaml
|
|
||||||
# Secrets 配置
|
|
||||||
KEYSTORE_BASE64
|
|
||||||
KEYSTORE_PASSWORD
|
|
||||||
KEY_ALIAS
|
|
||||||
KEY_PASSWORD
|
|
||||||
```
|
|
||||||
|
|
||||||
**macOS:**
|
|
||||||
```yaml
|
|
||||||
# Secrets 配置
|
|
||||||
MACOS_CERTIFICATE_BASE64
|
|
||||||
MACOS_CERTIFICATE_PASSWORD
|
|
||||||
```
|
|
||||||
|
|
||||||
**Windows:**
|
|
||||||
```yaml
|
|
||||||
# Secrets 配置
|
|
||||||
WINDOWS_CERTIFICATE_BASE64
|
|
||||||
WINDOWS_CERTIFICATE_PASSWORD
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📞 需要帮助?
|
|
||||||
|
|
||||||
- 查看 [GitHub Actions 文档](https://docs.github.com/actions)
|
|
||||||
- 查看 [Flutter 桌面支持](https://docs.flutter.dev/desktop)
|
|
||||||
- 提交 Issue
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**版本:** 1.0.0
|
|
||||||
**更新:** 2025-10-27
|
|
||||||
**作者:** Claude Code
|
|
||||||
@@ -1,78 +0,0 @@
|
|||||||
# 🚀 GitHub Actions 快速开始
|
|
||||||
|
|
||||||
## 📋 3 步开始使用
|
|
||||||
|
|
||||||
### 步骤 1: 推送配置文件
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd /Users/mac/Project/Dart/LighthouseApp
|
|
||||||
|
|
||||||
git add .github/workflows/
|
|
||||||
git commit -m "feat: 添加 GitHub Actions 自动构建配置"
|
|
||||||
git push origin main
|
|
||||||
```
|
|
||||||
|
|
||||||
### 步骤 2: 手动触发构建
|
|
||||||
|
|
||||||
1. 打开 GitHub 仓库页面
|
|
||||||
2. 点击 **Actions** 标签
|
|
||||||
3. 左侧选择 **Build Android APK**
|
|
||||||
4. 右侧点击 **Run workflow** 下拉按钮
|
|
||||||
5. 配置参数(可以使用默认值):
|
|
||||||
|
|
||||||
```
|
|
||||||
构建类型: release
|
|
||||||
API 域名: api.maodag.top
|
|
||||||
OSS 地址 1-4: 使用默认值
|
|
||||||
```
|
|
||||||
|
|
||||||
6. 点击绿色 **Run workflow** 按钮
|
|
||||||
|
|
||||||
### 步骤 3: 下载 APK
|
|
||||||
|
|
||||||
- 等待约 30 分钟
|
|
||||||
- 在构建记录页面找到 **Artifacts**
|
|
||||||
- 下载 `apk-arm64-v8a-release`(推荐)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 自定义配置示例
|
|
||||||
|
|
||||||
### 场景 1: 更换 API 域名
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
构建类型: release
|
|
||||||
API 域名: api.example.com ← 修改这里
|
|
||||||
OSS 地址: 保持默认
|
|
||||||
```
|
|
||||||
|
|
||||||
### 场景 2: 使用自己的 CDN
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
构建类型: release
|
|
||||||
API 域名: api.maodag.top
|
|
||||||
OSS 地址 1: https://your-cdn.com/config1.txt ← 修改这里
|
|
||||||
OSS 地址 2: https://your-cdn.com/config2.txt ← 修改这里
|
|
||||||
OSS 地址 3: https://your-cdn.com/config3.txt ← 修改这里
|
|
||||||
OSS 地址 4: https://your-cdn.com/config4.txt ← 修改这里
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📖 详细文档
|
|
||||||
|
|
||||||
- **完整指南:** [BUILD_GUIDE.md](./BUILD_GUIDE.md)
|
|
||||||
- **基础说明:** [README.md](./README.md)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✅ 核心功能
|
|
||||||
|
|
||||||
✅ **Release 构建** - 生产环境优化版本
|
|
||||||
✅ **可配置域名** - 支持自定义 API 和 CDN
|
|
||||||
✅ **分架构打包** - arm64/armv7/x86_64
|
|
||||||
✅ **自动 Release** - 推送标签自动发布
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**需要帮助?** 查看 [BUILD_GUIDE.md](./BUILD_GUIDE.md)
|
|
||||||
@@ -1,90 +0,0 @@
|
|||||||
# GitHub Actions 构建说明
|
|
||||||
|
|
||||||
## 📋 工作流概览
|
|
||||||
|
|
||||||
### `build-android-apk.yml` - Android APK 自动构建
|
|
||||||
|
|
||||||
**触发条件:**
|
|
||||||
- ✅ 推送到 `main` 或 `develop` 分支
|
|
||||||
- ✅ 打 `v*` 标签时自动创建 Release
|
|
||||||
- ✅ 手动触发(Actions 页面点击 "Run workflow")
|
|
||||||
|
|
||||||
**构建产物:**
|
|
||||||
- `libcore.aar` - sing-box 核心库
|
|
||||||
- `BearVPN-arm64-v8a-*.apk` - 64位 ARM 版本(推荐)
|
|
||||||
- `BearVPN-armeabi-v7a-*.apk` - 32位 ARM 版本
|
|
||||||
- `BearVPN-x86_64-*.apk` - 模拟器版本
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚀 使用方法
|
|
||||||
|
|
||||||
### 方法一:推送代码自动构建
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git add .
|
|
||||||
git commit -m "feat: 新功能"
|
|
||||||
git push origin main
|
|
||||||
```
|
|
||||||
|
|
||||||
### 方法二:手动触发
|
|
||||||
|
|
||||||
1. 打开仓库 **Actions** 页面
|
|
||||||
2. 点击 **Build Android APK**
|
|
||||||
3. 点击 **Run workflow**
|
|
||||||
|
|
||||||
### 方法三:创建 Release
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git tag v1.0.0
|
|
||||||
git push origin v1.0.0
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📦 下载构建产物
|
|
||||||
|
|
||||||
- **Actions 页面:** 点击运行记录 → Artifacts 区域下载
|
|
||||||
- **Releases 页面:** 选择版本 → Assets 下载
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔧 配置 Release 签名(可选)
|
|
||||||
|
|
||||||
1. 生成密钥:
|
|
||||||
```bash
|
|
||||||
keytool -genkey -v -keystore release.keystore -alias bearvpn -keyalg RSA -keysize 2048 -validity 10000
|
|
||||||
```
|
|
||||||
|
|
||||||
2. 转换为 Base64:
|
|
||||||
```bash
|
|
||||||
base64 release.keystore > keystore.base64.txt
|
|
||||||
```
|
|
||||||
|
|
||||||
3. 在 GitHub 仓库 **Settings → Secrets** 添加:
|
|
||||||
- `KEYSTORE_BASE64`
|
|
||||||
- `KEYSTORE_PASSWORD`
|
|
||||||
- `KEY_ALIAS`
|
|
||||||
- `KEY_PASSWORD`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ⏱️ 构建时间
|
|
||||||
|
|
||||||
- libcore.aar: 10-15 分钟
|
|
||||||
- Flutter APK: 15-20 分钟
|
|
||||||
- **总计: 约 30 分钟**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🐛 常见问题
|
|
||||||
|
|
||||||
**Q: 构建失败 "libcore.aar not found"**
|
|
||||||
A: 检查 libcore 子模块是否正确初始化
|
|
||||||
|
|
||||||
**Q: Release 未创建**
|
|
||||||
A: 标签必须以 `v` 开头,如 `v1.0.0`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
生成时间: 2025-10-27
|
|
||||||
@@ -1,319 +0,0 @@
|
|||||||
name: Build Android APK
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
- develop
|
|
||||||
tags:
|
|
||||||
- 'v*'
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
workflow_dispatch: # 允许手动触发
|
|
||||||
inputs:
|
|
||||||
build_type:
|
|
||||||
description: '构建类型'
|
|
||||||
required: true
|
|
||||||
default: 'release'
|
|
||||||
type: choice
|
|
||||||
options:
|
|
||||||
- debug
|
|
||||||
- release
|
|
||||||
api_domain:
|
|
||||||
description: 'API 域名'
|
|
||||||
required: true
|
|
||||||
default: 'api.maodag.top'
|
|
||||||
type: string
|
|
||||||
oss_url_1:
|
|
||||||
description: 'OSS 配置地址 1'
|
|
||||||
required: true
|
|
||||||
default: 'https://ppp2.oss-cn-hongkong.aliyuncs.com/bear1.txt'
|
|
||||||
type: string
|
|
||||||
oss_url_2:
|
|
||||||
description: 'OSS 配置地址 2'
|
|
||||||
required: true
|
|
||||||
default: 'https://xgp3.oss-ap-northeast-1.aliyuncs.com/bear1.txt'
|
|
||||||
type: string
|
|
||||||
oss_url_3:
|
|
||||||
description: 'OSS 配置地址 3'
|
|
||||||
required: true
|
|
||||||
default: 'https://xpp4.oss-ap-northeast-2.aliyuncs.com/bear1.txt'
|
|
||||||
type: string
|
|
||||||
oss_url_4:
|
|
||||||
description: 'OSS 配置地址 4'
|
|
||||||
required: true
|
|
||||||
default: 'https://xpp5.oss-ap-southeast-1.aliyuncs.com/bear1.txt'
|
|
||||||
type: string
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-libcore:
|
|
||||||
name: 编译 libcore.aar
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: 📥 Checkout 代码
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: 🔧 设置 Go 环境
|
|
||||||
uses: actions/setup-go@v5
|
|
||||||
with:
|
|
||||||
go-version: '1.23'
|
|
||||||
cache: true
|
|
||||||
cache-dependency-path: libcore/go.sum
|
|
||||||
|
|
||||||
- name: 🔧 设置 Node.js 环境
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: '20'
|
|
||||||
|
|
||||||
- name: 🔧 设置 Java 环境
|
|
||||||
uses: actions/setup-java@v4
|
|
||||||
with:
|
|
||||||
distribution: 'zulu'
|
|
||||||
java-version: '17'
|
|
||||||
|
|
||||||
- name: 🔧 安装 gomobile
|
|
||||||
run: |
|
|
||||||
go install golang.org/x/mobile/cmd/gomobile@latest
|
|
||||||
gomobile init
|
|
||||||
|
|
||||||
- name: 📦 编译 libcore.aar
|
|
||||||
working-directory: libcore
|
|
||||||
run: |
|
|
||||||
echo "🚀 开始编译 libcore..."
|
|
||||||
make android
|
|
||||||
|
|
||||||
echo "✅ 编译完成,检查产物..."
|
|
||||||
ls -lh bin/
|
|
||||||
|
|
||||||
if [ -f "bin/libcore.aar" ]; then
|
|
||||||
echo "✅ libcore.aar 生成成功"
|
|
||||||
cp bin/libcore.aar ../android/app/libs/
|
|
||||||
else
|
|
||||||
echo "❌ libcore.aar 未找到"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: 📤 上传 libcore.aar
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: libcore-aar
|
|
||||||
path: android/app/libs/libcore.aar
|
|
||||||
retention-days: 7
|
|
||||||
|
|
||||||
build-apk:
|
|
||||||
name: 编译 Android APK
|
|
||||||
needs: build-libcore
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
matrix:
|
|
||||||
build_type: [release] # 默认 release 构建
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: 📥 Checkout 代码
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: 🔧 设置 Java 环境
|
|
||||||
uses: actions/setup-java@v4
|
|
||||||
with:
|
|
||||||
distribution: 'zulu'
|
|
||||||
java-version: '17'
|
|
||||||
|
|
||||||
- name: 🔧 设置 Flutter 环境
|
|
||||||
uses: subosito/flutter-action@v2
|
|
||||||
with:
|
|
||||||
flutter-version: '3.24.5'
|
|
||||||
channel: 'stable'
|
|
||||||
cache: true
|
|
||||||
|
|
||||||
- name: 📥 下载 libcore.aar
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: libcore-aar
|
|
||||||
path: android/app/libs/
|
|
||||||
|
|
||||||
- name: ⚙️ 配置 API 域名和 OSS 地址
|
|
||||||
run: |
|
|
||||||
CONFIG_FILE="lib/app/common/app_config.dart"
|
|
||||||
|
|
||||||
# 获取参数(手动触发时使用输入值,自动触发时使用默认值)
|
|
||||||
API_DOMAIN="${{ inputs.api_domain || 'api.maodag.top' }}"
|
|
||||||
OSS_URL_1="${{ inputs.oss_url_1 || 'https://ppp2.oss-cn-hongkong.aliyuncs.com/bear1.txt' }}"
|
|
||||||
OSS_URL_2="${{ inputs.oss_url_2 || 'https://xgp3.oss-ap-northeast-1.aliyuncs.com/bear1.txt' }}"
|
|
||||||
OSS_URL_3="${{ inputs.oss_url_3 || 'https://xpp4.oss-ap-northeast-2.aliyuncs.com/bear1.txt' }}"
|
|
||||||
OSS_URL_4="${{ inputs.oss_url_4 || 'https://xpp5.oss-ap-southeast-1.aliyuncs.com/bear1.txt' }}"
|
|
||||||
|
|
||||||
echo "🔧 配置构建参数:"
|
|
||||||
echo " API 域名: $API_DOMAIN"
|
|
||||||
echo " OSS 地址 1: $OSS_URL_1"
|
|
||||||
echo " OSS 地址 2: $OSS_URL_2"
|
|
||||||
echo " OSS 地址 3: $OSS_URL_3"
|
|
||||||
echo " OSS 地址 4: $OSS_URL_4"
|
|
||||||
|
|
||||||
# 替换 API 域名
|
|
||||||
sed -i "s|api\.maodag\.top|$API_DOMAIN|g" "$CONFIG_FILE"
|
|
||||||
|
|
||||||
# 替换 OSS 地址
|
|
||||||
sed -i "s|https://ppp2\.oss-cn-hongkong\.aliyuncs\.com/bear1\.txt|$OSS_URL_1|g" "$CONFIG_FILE"
|
|
||||||
sed -i "s|https://xgp3\.oss-ap-northeast-1\.aliyuncs\.com/bear1\.txt|$OSS_URL_2|g" "$CONFIG_FILE"
|
|
||||||
sed -i "s|https://xpp4\.oss-ap-northeast-2\.aliyuncs\.com/bear1\.txt|$OSS_URL_3|g" "$CONFIG_FILE"
|
|
||||||
sed -i "s|https://xpp5\.oss-ap-southeast-1\.aliyuncs\.com/bear1\.txt|$OSS_URL_4|g" "$CONFIG_FILE"
|
|
||||||
|
|
||||||
echo "✅ 配置替换完成"
|
|
||||||
echo ""
|
|
||||||
echo "📄 查看修改后的配置:"
|
|
||||||
grep -A 15 "kr_baseDomains" "$CONFIG_FILE" || true
|
|
||||||
|
|
||||||
- name: 📦 安装 Flutter 依赖
|
|
||||||
run: |
|
|
||||||
flutter pub get
|
|
||||||
flutter pub run build_runner build --delete-conflicting-outputs
|
|
||||||
|
|
||||||
- name: 🔨 构建 APK (Release)
|
|
||||||
run: |
|
|
||||||
flutter build apk --release --split-per-abi
|
|
||||||
|
|
||||||
- name: 📋 生成构建信息
|
|
||||||
id: build_info
|
|
||||||
run: |
|
|
||||||
BUILD_DATE=$(date '+%Y-%m-%d %H:%M:%S')
|
|
||||||
COMMIT_SHA=${GITHUB_SHA::7}
|
|
||||||
|
|
||||||
echo "build_date=$BUILD_DATE" >> $GITHUB_OUTPUT
|
|
||||||
echo "commit_sha=$COMMIT_SHA" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
echo "📊 构建信息:"
|
|
||||||
echo " - 日期: $BUILD_DATE"
|
|
||||||
echo " - 提交: $COMMIT_SHA"
|
|
||||||
echo " - 分支: ${GITHUB_REF#refs/heads/}"
|
|
||||||
|
|
||||||
- name: 📦 重命名 APK 文件
|
|
||||||
run: |
|
|
||||||
COMMIT_SHA=${{ steps.build_info.outputs.commit_sha }}
|
|
||||||
DATE=$(date '+%Y%m%d')
|
|
||||||
|
|
||||||
cd build/app/outputs/flutter-apk/
|
|
||||||
|
|
||||||
for file in app-*-release.apk; do
|
|
||||||
if [ -f "$file" ]; then
|
|
||||||
# 提取架构名称 (arm64-v8a, armeabi-v7a, x86_64)
|
|
||||||
ARCH=$(echo "$file" | sed "s/app-\(.*\)-release.apk/\1/")
|
|
||||||
NEW_NAME="BearVPN-${ARCH}-release-${DATE}-${COMMIT_SHA}.apk"
|
|
||||||
|
|
||||||
mv "$file" "$NEW_NAME"
|
|
||||||
|
|
||||||
# 计算文件大小和 MD5
|
|
||||||
SIZE=$(ls -lh "$NEW_NAME" | awk '{print $5}')
|
|
||||||
MD5=$(md5sum "$NEW_NAME" | awk '{print $1}')
|
|
||||||
|
|
||||||
echo "✅ $NEW_NAME"
|
|
||||||
echo " 大小: $SIZE"
|
|
||||||
echo " MD5: $MD5"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
ls -lh
|
|
||||||
|
|
||||||
- name: 📤 上传 APK (arm64-v8a)
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: apk-arm64-v8a-release
|
|
||||||
path: build/app/outputs/flutter-apk/*arm64-v8a*.apk
|
|
||||||
retention-days: 30
|
|
||||||
|
|
||||||
- name: 📤 上传 APK (armeabi-v7a)
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: apk-armeabi-v7a-release
|
|
||||||
path: build/app/outputs/flutter-apk/*armeabi-v7a*.apk
|
|
||||||
retention-days: 30
|
|
||||||
|
|
||||||
- name: 📤 上传 APK (x86_64)
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: apk-x86_64-release
|
|
||||||
path: build/app/outputs/flutter-apk/*x86_64*.apk
|
|
||||||
retention-days: 30
|
|
||||||
|
|
||||||
create-release:
|
|
||||||
name: 创建 GitHub Release
|
|
||||||
needs: build-apk
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: startsWith(github.ref, 'refs/tags/v')
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: 📥 下载所有 APK
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
path: artifacts
|
|
||||||
pattern: apk-*
|
|
||||||
|
|
||||||
- name: 📋 生成 Release 说明
|
|
||||||
id: release_notes
|
|
||||||
run: |
|
|
||||||
cat > release_notes.md << 'EOF'
|
|
||||||
## 🎉 BearVPN Android 版本发布
|
|
||||||
|
|
||||||
### 📦 安装包说明
|
|
||||||
|
|
||||||
| 架构 | 适用设备 | 文件大小 |
|
|
||||||
|------|----------|----------|
|
|
||||||
| arm64-v8a | 64位 ARM 设备(推荐,现代手机) | ~40MB |
|
|
||||||
| armeabi-v7a | 32位 ARM 设备(老旧手机) | ~35MB |
|
|
||||||
| x86_64 | x86_64 模拟器 | ~45MB |
|
|
||||||
|
|
||||||
### ✨ 主要特性
|
|
||||||
|
|
||||||
- ✅ 支持 Shadowsocks/VLESS/Trojan/Hysteria2 等协议
|
|
||||||
- ✅ 内置 sing-box 核心
|
|
||||||
- ✅ 支持自定义路由规则
|
|
||||||
- ✅ 支持 URL Test 节点延迟测试
|
|
||||||
|
|
||||||
### 📥 下载建议
|
|
||||||
|
|
||||||
**不确定选哪个?** 下载 `arm64-v8a` 版本即可,适用于绝大多数现代 Android 手机。
|
|
||||||
|
|
||||||
### 🔒 文件校验
|
|
||||||
|
|
||||||
下载后请验证 MD5 以确保文件完整性(见下方 Assets 描述)。
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**构建信息:**
|
|
||||||
- 提交: ${GITHUB_SHA::7}
|
|
||||||
- 构建时间: $(date '+%Y-%m-%d %H:%M:%S UTC')
|
|
||||||
- Flutter: 3.24.5
|
|
||||||
- sing-box: latest
|
|
||||||
EOF
|
|
||||||
|
|
||||||
echo "release_notes<<EOF" >> $GITHUB_OUTPUT
|
|
||||||
cat release_notes.md >> $GITHUB_OUTPUT
|
|
||||||
echo "EOF" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: 🚀 创建 GitHub Release
|
|
||||||
uses: softprops/action-gh-release@v2
|
|
||||||
with:
|
|
||||||
files: |
|
|
||||||
artifacts/apk-arm64-v8a-*/*.apk
|
|
||||||
artifacts/apk-armeabi-v7a-*/*.apk
|
|
||||||
artifacts/apk-x86_64-*/*.apk
|
|
||||||
body: ${{ steps.release_notes.outputs.release_notes }}
|
|
||||||
draft: false
|
|
||||||
prerelease: false
|
|
||||||
generate_release_notes: true
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: 📢 构建成功通知
|
|
||||||
run: |
|
|
||||||
echo "✅ 构建完成!"
|
|
||||||
echo "📦 Release 已创建: ${{ github.ref }}"
|
|
||||||
echo "🔗 查看: https://github.com/${{ github.repository }}/releases"
|
|
||||||
@@ -1,142 +0,0 @@
|
|||||||
name: Build Clash Core
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
paths:
|
|
||||||
- 'core/**'
|
|
||||||
- '.github/workflows/build-clash-core.yml'
|
|
||||||
pull_request:
|
|
||||||
paths:
|
|
||||||
- 'core/**'
|
|
||||||
workflow_dispatch: # 允许手动触发
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build-android:
|
|
||||||
name: Build Android (${{ matrix.arch }})
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
|
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
include:
|
|
||||||
- arch: arm64
|
|
||||||
abi: arm64-v8a
|
|
||||||
cc: aarch64-linux-android29-clang
|
|
||||||
- arch: armv7
|
|
||||||
abi: armeabi-v7a
|
|
||||||
cc: armv7a-linux-androideabi29-clang
|
|
||||||
- arch: x86_64
|
|
||||||
abi: x86_64
|
|
||||||
cc: x86_64-linux-android29-clang
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
|
|
||||||
- name: Setup Go
|
|
||||||
uses: actions/setup-go@v5
|
|
||||||
with:
|
|
||||||
go-version: '1.20'
|
|
||||||
cache: true
|
|
||||||
cache-dependency-path: core/go.sum
|
|
||||||
|
|
||||||
- name: Setup Android NDK
|
|
||||||
uses: nttld/setup-ndk@v1
|
|
||||||
with:
|
|
||||||
ndk-version: r25c
|
|
||||||
add-to-path: true
|
|
||||||
|
|
||||||
- name: Build Core
|
|
||||||
working-directory: core
|
|
||||||
run: make android-${{ matrix.arch }}
|
|
||||||
env:
|
|
||||||
ANDROID_NDK_HOME: ${{ steps.setup-ndk.outputs.ndk-path }}
|
|
||||||
|
|
||||||
- name: Verify Build
|
|
||||||
run: |
|
|
||||||
echo "📦 检查编译产物..."
|
|
||||||
ls -lh android/app/src/main/jniLibs/${{ matrix.abi }}/libclash.so
|
|
||||||
file android/app/src/main/jniLibs/${{ matrix.abi }}/libclash.so
|
|
||||||
|
|
||||||
echo "🔍 验证导出函数..."
|
|
||||||
nm -D android/app/src/main/jniLibs/${{ matrix.abi }}/libclash.so | grep -E "(quickStart|getAndroidVpnOptions|startTUN)"
|
|
||||||
|
|
||||||
- name: Calculate MD5
|
|
||||||
id: md5
|
|
||||||
run: |
|
|
||||||
MD5=$(md5sum android/app/src/main/jniLibs/${{ matrix.abi }}/libclash.so | awk '{print $1}')
|
|
||||||
echo "md5=$MD5" >> $GITHUB_OUTPUT
|
|
||||||
echo "📋 MD5: $MD5"
|
|
||||||
|
|
||||||
- name: Upload Artifact
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: libclash-${{ matrix.abi }}
|
|
||||||
path: android/app/src/main/jniLibs/${{ matrix.abi }}/libclash.so
|
|
||||||
retention-days: 30
|
|
||||||
if-no-files-found: error
|
|
||||||
|
|
||||||
- name: Comment Build Info
|
|
||||||
if: github.event_name == 'pull_request'
|
|
||||||
uses: actions/github-script@v7
|
|
||||||
with:
|
|
||||||
script: |
|
|
||||||
const fs = require('fs');
|
|
||||||
const stats = fs.statSync('android/app/src/main/jniLibs/${{ matrix.abi }}/libclash.so');
|
|
||||||
const sizeMB = (stats.size / 1024 / 1024).toFixed(2);
|
|
||||||
|
|
||||||
github.rest.issues.createComment({
|
|
||||||
issue_number: context.issue.number,
|
|
||||||
owner: context.repo.owner,
|
|
||||||
repo: context.repo.repo,
|
|
||||||
body: `### 🔨 Clash Core 构建完成 (${{ matrix.abi }})
|
|
||||||
|
|
||||||
- **架构:** ${{ matrix.abi }}
|
|
||||||
- **大小:** ${sizeMB} MB
|
|
||||||
- **MD5:** ${{ steps.md5.outputs.md5 }}
|
|
||||||
- **提交:** ${context.sha.substring(0, 7)}
|
|
||||||
|
|
||||||
[下载构建产物](https://github.com/${context.repo.owner}/${context.repo.repo}/actions/runs/${context.runId})`
|
|
||||||
});
|
|
||||||
|
|
||||||
create-release:
|
|
||||||
name: Create Release
|
|
||||||
needs: build-android
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: startsWith(github.ref, 'refs/tags/v')
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: Download All Artifacts
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
path: artifacts
|
|
||||||
|
|
||||||
- name: Create Release Archive
|
|
||||||
run: |
|
|
||||||
cd artifacts
|
|
||||||
tar -czf clash-core-android-all.tar.gz libclash-*/*.so
|
|
||||||
ls -lh clash-core-android-all.tar.gz
|
|
||||||
|
|
||||||
- name: Create GitHub Release
|
|
||||||
uses: softprops/action-gh-release@v1
|
|
||||||
with:
|
|
||||||
files: artifacts/clash-core-android-all.tar.gz
|
|
||||||
body: |
|
|
||||||
## Clash Meta 核心 Android 构建
|
|
||||||
|
|
||||||
此版本包含所有 Android 架构的预编译二进制文件:
|
|
||||||
- arm64-v8a (ARM64)
|
|
||||||
- armeabi-v7a (ARMv7)
|
|
||||||
- x86_64 (模拟器)
|
|
||||||
|
|
||||||
**使用方法:**
|
|
||||||
```bash
|
|
||||||
tar -xzf clash-core-android-all.tar.gz
|
|
||||||
cp libclash-*/libclash.so android/app/src/main/jniLibs/
|
|
||||||
```
|
|
||||||
draft: false
|
|
||||||
prerelease: false
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
@@ -1,666 +0,0 @@
|
|||||||
name: Build Multi-Platform
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
- develop
|
|
||||||
tags:
|
|
||||||
- 'v*'
|
|
||||||
pull_request:
|
|
||||||
branches:
|
|
||||||
- main
|
|
||||||
workflow_dispatch:
|
|
||||||
inputs:
|
|
||||||
build_type:
|
|
||||||
description: '构建类型'
|
|
||||||
required: true
|
|
||||||
default: 'release'
|
|
||||||
type: choice
|
|
||||||
options:
|
|
||||||
- debug
|
|
||||||
- release
|
|
||||||
api_domain:
|
|
||||||
description: 'API 域名'
|
|
||||||
required: true
|
|
||||||
default: 'api.maodag.top'
|
|
||||||
type: string
|
|
||||||
oss_url_1:
|
|
||||||
description: 'OSS 配置地址 1'
|
|
||||||
required: true
|
|
||||||
default: 'https://ppp2.oss-cn-hongkong.aliyuncs.com/bear1.txt'
|
|
||||||
type: string
|
|
||||||
oss_url_2:
|
|
||||||
description: 'OSS 配置地址 2'
|
|
||||||
required: true
|
|
||||||
default: 'https://xgp3.oss-ap-northeast-1.aliyuncs.com/bear1.txt'
|
|
||||||
type: string
|
|
||||||
oss_url_3:
|
|
||||||
description: 'OSS 配置地址 3'
|
|
||||||
required: true
|
|
||||||
default: 'https://xpp4.oss-ap-northeast-2.aliyuncs.com/bear1.txt'
|
|
||||||
type: string
|
|
||||||
oss_url_4:
|
|
||||||
description: 'OSS 配置地址 4'
|
|
||||||
required: true
|
|
||||||
default: 'https://xpp5.oss-ap-southeast-1.aliyuncs.com/bear1.txt'
|
|
||||||
type: string
|
|
||||||
platforms:
|
|
||||||
description: '构建平台 (多选: android,windows,macos,linux)'
|
|
||||||
required: true
|
|
||||||
default: 'android,windows,macos,linux'
|
|
||||||
type: string
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
# ==================== 编译 libcore (Android) ====================
|
|
||||||
build-libcore-android:
|
|
||||||
name: 编译 libcore (Android)
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: contains(inputs.platforms || 'android', 'android')
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: 📥 Checkout 代码
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: 🔧 设置 Go 环境
|
|
||||||
uses: actions/setup-go@v5
|
|
||||||
with:
|
|
||||||
go-version: '1.23'
|
|
||||||
cache: true
|
|
||||||
cache-dependency-path: libcore/go.sum
|
|
||||||
|
|
||||||
- name: 🔧 设置 Node.js
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: '20'
|
|
||||||
|
|
||||||
- name: 🔧 设置 Java
|
|
||||||
uses: actions/setup-java@v4
|
|
||||||
with:
|
|
||||||
distribution: 'zulu'
|
|
||||||
java-version: '17'
|
|
||||||
|
|
||||||
- name: 🔧 安装 gomobile
|
|
||||||
run: |
|
|
||||||
go install golang.org/x/mobile/cmd/gomobile@latest
|
|
||||||
gomobile init
|
|
||||||
|
|
||||||
- name: 📦 编译 libcore.aar
|
|
||||||
working-directory: libcore
|
|
||||||
run: |
|
|
||||||
echo "🚀 开始编译 Android libcore..."
|
|
||||||
make android
|
|
||||||
|
|
||||||
if [ -f "bin/libcore.aar" ]; then
|
|
||||||
echo "✅ libcore.aar 生成成功"
|
|
||||||
ls -lh bin/libcore.aar
|
|
||||||
else
|
|
||||||
echo "❌ libcore.aar 未找到"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: 📤 上传 libcore.aar
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: libcore-android
|
|
||||||
path: libcore/bin/libcore.aar
|
|
||||||
retention-days: 7
|
|
||||||
|
|
||||||
# ==================== 编译 libcore (Windows) ====================
|
|
||||||
build-libcore-windows:
|
|
||||||
name: 编译 libcore (Windows)
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: contains(inputs.platforms || 'windows', 'windows')
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: 📥 Checkout 代码
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: 🔧 设置 Go 环境
|
|
||||||
uses: actions/setup-go@v5
|
|
||||||
with:
|
|
||||||
go-version: '1.23'
|
|
||||||
cache: true
|
|
||||||
cache-dependency-path: libcore/go.sum
|
|
||||||
|
|
||||||
- name: 🔧 设置 Node.js
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: '20'
|
|
||||||
|
|
||||||
- name: 🔧 安装 MinGW (交叉编译工具)
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y mingw-w64
|
|
||||||
|
|
||||||
- name: 📦 编译 libcore.dll
|
|
||||||
working-directory: libcore
|
|
||||||
run: |
|
|
||||||
echo "🚀 开始编译 Windows libcore..."
|
|
||||||
make windows-amd64
|
|
||||||
|
|
||||||
if [ -f "bin/libcore.dll" ] && [ -f "bin/HiddifyCli.exe" ]; then
|
|
||||||
echo "✅ Windows libcore 编译成功"
|
|
||||||
ls -lh bin/libcore.dll bin/HiddifyCli.exe
|
|
||||||
else
|
|
||||||
echo "❌ Windows libcore 编译失败"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: 📤 上传 Windows libcore
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: libcore-windows
|
|
||||||
path: |
|
|
||||||
libcore/bin/libcore.dll
|
|
||||||
libcore/bin/HiddifyCli.exe
|
|
||||||
libcore/bin/webui/**
|
|
||||||
retention-days: 7
|
|
||||||
|
|
||||||
# ==================== 编译 libcore (macOS) ====================
|
|
||||||
build-libcore-macos:
|
|
||||||
name: 编译 libcore (macOS)
|
|
||||||
runs-on: macos-latest
|
|
||||||
if: contains(inputs.platforms || 'macos', 'macos')
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: 📥 Checkout 代码
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: 🔧 设置 Go 环境
|
|
||||||
uses: actions/setup-go@v5
|
|
||||||
with:
|
|
||||||
go-version: '1.23'
|
|
||||||
cache: true
|
|
||||||
cache-dependency-path: libcore/go.sum
|
|
||||||
|
|
||||||
- name: 🔧 设置 Node.js
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: '20'
|
|
||||||
|
|
||||||
- name: 📦 编译 libcore.dylib
|
|
||||||
working-directory: libcore
|
|
||||||
run: |
|
|
||||||
echo "🚀 开始编译 macOS libcore..."
|
|
||||||
make macos-universal
|
|
||||||
|
|
||||||
if [ -f "bin/libcore.dylib" ] && [ -f "bin/HiddifyCli" ]; then
|
|
||||||
echo "✅ macOS libcore 编译成功"
|
|
||||||
ls -lh bin/libcore.dylib bin/HiddifyCli
|
|
||||||
else
|
|
||||||
echo "❌ macOS libcore 编译失败"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: 📤 上传 macOS libcore
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: libcore-macos
|
|
||||||
path: |
|
|
||||||
libcore/bin/libcore.dylib
|
|
||||||
libcore/bin/HiddifyCli
|
|
||||||
retention-days: 7
|
|
||||||
|
|
||||||
# ==================== 编译 libcore (Linux) ====================
|
|
||||||
build-libcore-linux:
|
|
||||||
name: 编译 libcore (Linux)
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: contains(inputs.platforms || 'linux', 'linux')
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: 📥 Checkout 代码
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: 🔧 设置 Go 环境
|
|
||||||
uses: actions/setup-go@v5
|
|
||||||
with:
|
|
||||||
go-version: '1.23'
|
|
||||||
cache: true
|
|
||||||
cache-dependency-path: libcore/go.sum
|
|
||||||
|
|
||||||
- name: 🔧 设置 Node.js
|
|
||||||
uses: actions/setup-node@v4
|
|
||||||
with:
|
|
||||||
node-version: '20'
|
|
||||||
|
|
||||||
- name: 📦 编译 libcore.so
|
|
||||||
working-directory: libcore
|
|
||||||
run: |
|
|
||||||
echo "🚀 开始编译 Linux libcore..."
|
|
||||||
make linux-amd64
|
|
||||||
|
|
||||||
if [ -f "bin/lib/libcore.so" ] && [ -f "bin/HiddifyCli" ]; then
|
|
||||||
echo "✅ Linux libcore 编译成功"
|
|
||||||
ls -lh bin/lib/libcore.so bin/HiddifyCli
|
|
||||||
else
|
|
||||||
echo "❌ Linux libcore 编译失败"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
- name: 📤 上传 Linux libcore
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: libcore-linux
|
|
||||||
path: |
|
|
||||||
libcore/bin/lib/libcore.so
|
|
||||||
libcore/bin/HiddifyCli
|
|
||||||
libcore/bin/webui/**
|
|
||||||
retention-days: 7
|
|
||||||
|
|
||||||
# ==================== Android 构建 ====================
|
|
||||||
build-android:
|
|
||||||
name: 构建 Android APK
|
|
||||||
needs: build-libcore-android
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: contains(inputs.platforms || 'android', 'android')
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: 📥 Checkout 代码
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: 🔧 设置 Java
|
|
||||||
uses: actions/setup-java@v4
|
|
||||||
with:
|
|
||||||
distribution: 'zulu'
|
|
||||||
java-version: '17'
|
|
||||||
|
|
||||||
- name: 🔧 设置 Flutter
|
|
||||||
uses: subosito/flutter-action@v2
|
|
||||||
with:
|
|
||||||
flutter-version: '3.24.5'
|
|
||||||
channel: 'stable'
|
|
||||||
cache: true
|
|
||||||
|
|
||||||
- name: 📥 下载 libcore.aar
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: libcore-android
|
|
||||||
path: android/app/libs/
|
|
||||||
|
|
||||||
- name: ⚙️ 配置 API 和 OSS
|
|
||||||
run: |
|
|
||||||
CONFIG_FILE="lib/app/common/app_config.dart"
|
|
||||||
API_DOMAIN="${{ inputs.api_domain || 'api.maodag.top' }}"
|
|
||||||
OSS_URL_1="${{ inputs.oss_url_1 || 'https://ppp2.oss-cn-hongkong.aliyuncs.com/bear1.txt' }}"
|
|
||||||
OSS_URL_2="${{ inputs.oss_url_2 || 'https://xgp3.oss-ap-northeast-1.aliyuncs.com/bear1.txt' }}"
|
|
||||||
OSS_URL_3="${{ inputs.oss_url_3 || 'https://xpp4.oss-ap-northeast-2.aliyuncs.com/bear1.txt' }}"
|
|
||||||
OSS_URL_4="${{ inputs.oss_url_4 || 'https://xpp5.oss-ap-southeast-1.aliyuncs.com/bear1.txt' }}"
|
|
||||||
|
|
||||||
echo "🔧 配置参数:"
|
|
||||||
echo " API: $API_DOMAIN"
|
|
||||||
echo " OSS: $OSS_URL_1"
|
|
||||||
|
|
||||||
sed -i "s|api\.maodag\.top|$API_DOMAIN|g" "$CONFIG_FILE"
|
|
||||||
sed -i "s|https://ppp2\.oss-cn-hongkong\.aliyuncs\.com/bear1\.txt|$OSS_URL_1|g" "$CONFIG_FILE"
|
|
||||||
sed -i "s|https://xgp3\.oss-ap-northeast-1\.aliyuncs\.com/bear1\.txt|$OSS_URL_2|g" "$CONFIG_FILE"
|
|
||||||
sed -i "s|https://xpp4\.oss-ap-northeast-2\.aliyuncs\.com/bear1\.txt|$OSS_URL_3|g" "$CONFIG_FILE"
|
|
||||||
sed -i "s|https://xpp5\.oss-ap-southeast-1\.aliyuncs\.com/bear1\.txt|$OSS_URL_4|g" "$CONFIG_FILE"
|
|
||||||
|
|
||||||
echo "✅ 配置完成"
|
|
||||||
|
|
||||||
- name: 📦 安装 Flutter 依赖
|
|
||||||
run: |
|
|
||||||
flutter pub get
|
|
||||||
flutter pub run build_runner build --delete-conflicting-outputs
|
|
||||||
|
|
||||||
- name: 🔨 构建 APK (Release)
|
|
||||||
run: |
|
|
||||||
flutter build apk --release --split-per-abi
|
|
||||||
|
|
||||||
- name: 📦 重命名 APK
|
|
||||||
run: |
|
|
||||||
COMMIT_SHA=${GITHUB_SHA::7}
|
|
||||||
DATE=$(date '+%Y%m%d')
|
|
||||||
cd build/app/outputs/flutter-apk/
|
|
||||||
|
|
||||||
for file in app-*-release.apk; do
|
|
||||||
if [ -f "$file" ]; then
|
|
||||||
ARCH=$(echo "$file" | sed "s/app-\(.*\)-release.apk/\1/")
|
|
||||||
NEW_NAME="BearVPN-android-${ARCH}-release-${DATE}-${COMMIT_SHA}.apk"
|
|
||||||
mv "$file" "$NEW_NAME"
|
|
||||||
echo "✅ $NEW_NAME"
|
|
||||||
fi
|
|
||||||
done
|
|
||||||
|
|
||||||
- name: 📤 上传 APK
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: android-apk
|
|
||||||
path: build/app/outputs/flutter-apk/*.apk
|
|
||||||
retention-days: 30
|
|
||||||
|
|
||||||
# ==================== Windows 构建 ====================
|
|
||||||
build-windows:
|
|
||||||
name: 构建 Windows
|
|
||||||
needs: build-libcore-windows
|
|
||||||
runs-on: windows-latest
|
|
||||||
if: contains(inputs.platforms || 'windows', 'windows')
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: 📥 Checkout 代码
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: 🔧 设置 Flutter
|
|
||||||
uses: subosito/flutter-action@v2
|
|
||||||
with:
|
|
||||||
flutter-version: '3.24.5'
|
|
||||||
channel: 'stable'
|
|
||||||
cache: true
|
|
||||||
|
|
||||||
- name: 📥 下载 Windows libcore
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: libcore-windows
|
|
||||||
path: libcore/bin/
|
|
||||||
|
|
||||||
- name: ⚙️ 配置 API 和 OSS
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
CONFIG_FILE="lib/app/common/app_config.dart"
|
|
||||||
API_DOMAIN="${{ inputs.api_domain || 'api.maodag.top' }}"
|
|
||||||
OSS_URL_1="${{ inputs.oss_url_1 || 'https://ppp2.oss-cn-hongkong.aliyuncs.com/bear1.txt' }}"
|
|
||||||
OSS_URL_2="${{ inputs.oss_url_2 || 'https://xgp3.oss-ap-northeast-1.aliyuncs.com/bear1.txt' }}"
|
|
||||||
OSS_URL_3="${{ inputs.oss_url_3 || 'https://xpp4.oss-ap-northeast-2.aliyuncs.com/bear1.txt' }}"
|
|
||||||
OSS_URL_4="${{ inputs.oss_url_4 || 'https://xpp5.oss-ap-southeast-1.aliyuncs.com/bear1.txt' }}"
|
|
||||||
|
|
||||||
sed -i "s|api\.maodag\.top|$API_DOMAIN|g" "$CONFIG_FILE"
|
|
||||||
sed -i "s|https://ppp2\.oss-cn-hongkong\.aliyuncs\.com/bear1\.txt|$OSS_URL_1|g" "$CONFIG_FILE"
|
|
||||||
sed -i "s|https://xgp3\.oss-ap-northeast-1\.aliyuncs\.com/bear1\.txt|$OSS_URL_2|g" "$CONFIG_FILE"
|
|
||||||
sed -i "s|https://xpp4\.oss-ap-northeast-2\.aliyuncs\.com/bear1\.txt|$OSS_URL_3|g" "$CONFIG_FILE"
|
|
||||||
sed -i "s|https://xpp5\.oss-ap-southeast-1\.aliyuncs\.com/bear1\.txt|$OSS_URL_4|g" "$CONFIG_FILE"
|
|
||||||
|
|
||||||
- name: 📦 安装 Flutter 依赖
|
|
||||||
run: |
|
|
||||||
flutter pub get
|
|
||||||
|
|
||||||
- name: 🔧 生成代码文件 (build_runner)
|
|
||||||
run: |
|
|
||||||
echo "🔧 开始运行 build_runner..."
|
|
||||||
flutter pub run build_runner build --delete-conflicting-outputs
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
echo "✅ build_runner 完成,检查生成的文件..."
|
|
||||||
|
|
||||||
if (Test-Path "lib\singbox\model\singbox_status.freezed.dart") {
|
|
||||||
echo "✅ singbox_status.freezed.dart 已生成"
|
|
||||||
} else {
|
|
||||||
echo "❌ singbox_status.freezed.dart 未生成"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
if (Test-Path "lib\singbox\service\singbox_service_provider.g.dart") {
|
|
||||||
echo "✅ singbox_service_provider.g.dart 已生成"
|
|
||||||
} else {
|
|
||||||
echo "❌ singbox_service_provider.g.dart 未生成"
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
shell: pwsh
|
|
||||||
|
|
||||||
- name: 🔨 构建 Windows (Release)
|
|
||||||
run: |
|
|
||||||
flutter build windows --release
|
|
||||||
|
|
||||||
- name: 📦 打包 Windows
|
|
||||||
shell: bash
|
|
||||||
run: |
|
|
||||||
COMMIT_SHA=${GITHUB_SHA::7}
|
|
||||||
DATE=$(date '+%Y%m%d')
|
|
||||||
|
|
||||||
cd build/windows/x64/runner/Release
|
|
||||||
7z a -tzip "../../../../../BearVPN-windows-x64-release-${DATE}-${COMMIT_SHA}.zip" ./*
|
|
||||||
|
|
||||||
- name: 📤 上传 Windows
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: windows-x64
|
|
||||||
path: BearVPN-windows-*.zip
|
|
||||||
retention-days: 30
|
|
||||||
|
|
||||||
# ==================== macOS 构建 ====================
|
|
||||||
build-macos:
|
|
||||||
name: 构建 macOS
|
|
||||||
needs: build-libcore-macos
|
|
||||||
runs-on: macos-latest
|
|
||||||
if: contains(inputs.platforms || 'macos', 'macos')
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: 📥 Checkout 代码
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: 🔧 设置 Flutter
|
|
||||||
uses: subosito/flutter-action@v2
|
|
||||||
with:
|
|
||||||
flutter-version: '3.24.5'
|
|
||||||
channel: 'stable'
|
|
||||||
cache: true
|
|
||||||
|
|
||||||
- name: 📥 下载 macOS libcore
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: libcore-macos
|
|
||||||
path: libcore/bin/
|
|
||||||
|
|
||||||
- name: 🔧 设置 libcore 执行权限
|
|
||||||
run: |
|
|
||||||
chmod +x libcore/bin/HiddifyCli
|
|
||||||
|
|
||||||
- name: ⚙️ 配置 API 和 OSS
|
|
||||||
run: |
|
|
||||||
CONFIG_FILE="lib/app/common/app_config.dart"
|
|
||||||
API_DOMAIN="${{ inputs.api_domain || 'api.maodag.top' }}"
|
|
||||||
OSS_URL_1="${{ inputs.oss_url_1 || 'https://ppp2.oss-cn-hongkong.aliyuncs.com/bear1.txt' }}"
|
|
||||||
OSS_URL_2="${{ inputs.oss_url_2 || 'https://xgp3.oss-ap-northeast-1.aliyuncs.com/bear1.txt' }}"
|
|
||||||
OSS_URL_3="${{ inputs.oss_url_3 || 'https://xpp4.oss-ap-northeast-2.aliyuncs.com/bear1.txt' }}"
|
|
||||||
OSS_URL_4="${{ inputs.oss_url_4 || 'https://xpp5.oss-ap-southeast-1.aliyuncs.com/bear1.txt' }}"
|
|
||||||
|
|
||||||
sed -i '' "s|api\.maodag\.top|$API_DOMAIN|g" "$CONFIG_FILE"
|
|
||||||
sed -i '' "s|https://ppp2\.oss-cn-hongkong\.aliyuncs\.com/bear1\.txt|$OSS_URL_1|g" "$CONFIG_FILE"
|
|
||||||
sed -i '' "s|https://xgp3\.oss-ap-northeast-1\.aliyuncs\.com/bear1\.txt|$OSS_URL_2|g" "$CONFIG_FILE"
|
|
||||||
sed -i '' "s|https://xpp4\.oss-ap-northeast-2\.aliyuncs\.com/bear1\.txt|$OSS_URL_3|g" "$CONFIG_FILE"
|
|
||||||
sed -i '' "s|https://xpp5\.oss-ap-southeast-1\.aliyuncs\.com/bear1\.txt|$OSS_URL_4|g" "$CONFIG_FILE"
|
|
||||||
|
|
||||||
- name: 📦 安装 Flutter 依赖
|
|
||||||
run: |
|
|
||||||
flutter pub get
|
|
||||||
flutter pub run build_runner build --delete-conflicting-outputs
|
|
||||||
|
|
||||||
- name: 🔨 构建 macOS (Release)
|
|
||||||
run: |
|
|
||||||
flutter build macos --release
|
|
||||||
|
|
||||||
- name: 📦 打包 macOS
|
|
||||||
run: |
|
|
||||||
COMMIT_SHA=${GITHUB_SHA::7}
|
|
||||||
DATE=$(date '+%Y%m%d')
|
|
||||||
|
|
||||||
cd build/macos/Build/Products/Release
|
|
||||||
zip -r -y "../../../../../BearVPN-macos-release-${DATE}-${COMMIT_SHA}.zip" BearVPN.app
|
|
||||||
|
|
||||||
- name: 📤 上传 macOS
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: macos-app
|
|
||||||
path: BearVPN-macos-*.zip
|
|
||||||
retention-days: 30
|
|
||||||
|
|
||||||
# ==================== Linux 构建 ====================
|
|
||||||
build-linux:
|
|
||||||
name: 构建 Linux
|
|
||||||
needs: build-libcore-linux
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: contains(inputs.platforms || 'linux', 'linux')
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: 📥 Checkout 代码
|
|
||||||
uses: actions/checkout@v4
|
|
||||||
with:
|
|
||||||
submodules: recursive
|
|
||||||
fetch-depth: 0
|
|
||||||
|
|
||||||
- name: 🔧 安装 Linux 依赖
|
|
||||||
run: |
|
|
||||||
sudo apt-get update
|
|
||||||
sudo apt-get install -y \
|
|
||||||
clang \
|
|
||||||
cmake \
|
|
||||||
ninja-build \
|
|
||||||
pkg-config \
|
|
||||||
libgtk-3-dev \
|
|
||||||
liblzma-dev \
|
|
||||||
libstdc++-12-dev \
|
|
||||||
libayatana-appindicator3-dev
|
|
||||||
|
|
||||||
- name: 🔧 设置 Flutter
|
|
||||||
uses: subosito/flutter-action@v2
|
|
||||||
with:
|
|
||||||
flutter-version: '3.24.5'
|
|
||||||
channel: 'stable'
|
|
||||||
cache: true
|
|
||||||
|
|
||||||
- name: 📥 下载 Linux libcore
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
name: libcore-linux
|
|
||||||
path: libcore/bin/
|
|
||||||
|
|
||||||
- name: 🔧 设置 libcore 执行权限
|
|
||||||
run: |
|
|
||||||
chmod +x libcore/bin/HiddifyCli
|
|
||||||
|
|
||||||
- name: ⚙️ 配置 API 和 OSS
|
|
||||||
run: |
|
|
||||||
CONFIG_FILE="lib/app/common/app_config.dart"
|
|
||||||
API_DOMAIN="${{ inputs.api_domain || 'api.maodag.top' }}"
|
|
||||||
OSS_URL_1="${{ inputs.oss_url_1 || 'https://ppp2.oss-cn-hongkong.aliyuncs.com/bear1.txt' }}"
|
|
||||||
OSS_URL_2="${{ inputs.oss_url_2 || 'https://xgp3.oss-ap-northeast-1.aliyuncs.com/bear1.txt' }}"
|
|
||||||
OSS_URL_3="${{ inputs.oss_url_3 || 'https://xpp4.oss-ap-northeast-2.aliyuncs.com/bear1.txt' }}"
|
|
||||||
OSS_URL_4="${{ inputs.oss_url_4 || 'https://xpp5.oss-ap-southeast-1.aliyuncs.com/bear1.txt' }}"
|
|
||||||
|
|
||||||
sed -i "s|api\.maodag\.top|$API_DOMAIN|g" "$CONFIG_FILE"
|
|
||||||
sed -i "s|https://ppp2\.oss-cn-hongkong\.aliyuncs\.com/bear1\.txt|$OSS_URL_1|g" "$CONFIG_FILE"
|
|
||||||
sed -i "s|https://xgp3\.oss-ap-northeast-1\.aliyuncs\.com/bear1\.txt|$OSS_URL_2|g" "$CONFIG_FILE"
|
|
||||||
sed -i "s|https://xpp4\.oss-ap-northeast-2\.aliyuncs\.com/bear1\.txt|$OSS_URL_3|g" "$CONFIG_FILE"
|
|
||||||
sed -i "s|https://xpp5\.oss-ap-southeast-1\.aliyuncs\.com/bear1\.txt|$OSS_URL_4|g" "$CONFIG_FILE"
|
|
||||||
|
|
||||||
- name: 📦 安装 Flutter 依赖
|
|
||||||
run: |
|
|
||||||
flutter pub get
|
|
||||||
flutter pub run build_runner build --delete-conflicting-outputs
|
|
||||||
|
|
||||||
- name: 🔨 构建 Linux (Release)
|
|
||||||
run: |
|
|
||||||
flutter build linux --release
|
|
||||||
|
|
||||||
- name: 📦 打包 Linux
|
|
||||||
run: |
|
|
||||||
COMMIT_SHA=${GITHUB_SHA::7}
|
|
||||||
DATE=$(date '+%Y%m%d')
|
|
||||||
|
|
||||||
cd build/linux/x64/release/bundle
|
|
||||||
tar -czf "../../../../../BearVPN-linux-x64-release-${DATE}-${COMMIT_SHA}.tar.gz" ./*
|
|
||||||
|
|
||||||
- name: 📤 上传 Linux
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: linux-x64
|
|
||||||
path: BearVPN-linux-*.tar.gz
|
|
||||||
retention-days: 30
|
|
||||||
|
|
||||||
# ==================== 创建 Release ====================
|
|
||||||
create-release:
|
|
||||||
name: 创建 Release
|
|
||||||
needs: [build-android, build-windows, build-macos, build-linux]
|
|
||||||
runs-on: ubuntu-latest
|
|
||||||
if: startsWith(github.ref, 'refs/tags/v')
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- name: 📥 下载所有构建产物
|
|
||||||
uses: actions/download-artifact@v4
|
|
||||||
with:
|
|
||||||
path: artifacts
|
|
||||||
|
|
||||||
- name: 📋 生成 Release 说明
|
|
||||||
id: release_notes
|
|
||||||
run: |
|
|
||||||
cat > release_notes.md << 'EOF'
|
|
||||||
## 🎉 BearVPN 多平台版本发布
|
|
||||||
|
|
||||||
### 📦 平台支持
|
|
||||||
|
|
||||||
| 平台 | 架构 | 文件 |
|
|
||||||
|-----|------|-----|
|
|
||||||
| **Android** | arm64-v8a | BearVPN-android-arm64-v8a-*.apk |
|
|
||||||
| **Android** | armeabi-v7a | BearVPN-android-armeabi-v7a-*.apk |
|
|
||||||
| **Android** | x86_64 | BearVPN-android-x86_64-*.apk |
|
|
||||||
| **Windows** | x64 | BearVPN-windows-x64-*.zip |
|
|
||||||
| **macOS** | Universal | BearVPN-macos-*.zip |
|
|
||||||
| **Linux** | x64 | BearVPN-linux-x64-*.tar.gz |
|
|
||||||
|
|
||||||
### ✨ 主要特性
|
|
||||||
|
|
||||||
- ✅ 支持 Shadowsocks/VLESS/Trojan/Hysteria2
|
|
||||||
- ✅ 内置 sing-box 核心 v3.1.7
|
|
||||||
- ✅ 跨平台支持
|
|
||||||
- ✅ 自定义路由规则
|
|
||||||
|
|
||||||
### 📥 安装指南
|
|
||||||
|
|
||||||
**Android:** 下载 APK 直接安装
|
|
||||||
**Windows:** 解压 ZIP 运行 BearVPN.exe
|
|
||||||
**macOS:** 解压 ZIP 拖拽到应用程序
|
|
||||||
**Linux:** 解压 tar.gz 运行可执行文件
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**构建信息:**
|
|
||||||
- 提交: ${GITHUB_SHA::7}
|
|
||||||
- 时间: $(date '+%Y-%m-%d %H:%M:%S UTC')
|
|
||||||
- Flutter: 3.24.5
|
|
||||||
- sing-box: v3.1.7
|
|
||||||
EOF
|
|
||||||
|
|
||||||
echo "release_notes<<EOF" >> $GITHUB_OUTPUT
|
|
||||||
cat release_notes.md >> $GITHUB_OUTPUT
|
|
||||||
echo "EOF" >> $GITHUB_OUTPUT
|
|
||||||
|
|
||||||
- name: 🚀 创建 Release
|
|
||||||
uses: softprops/action-gh-release@v2
|
|
||||||
with:
|
|
||||||
files: |
|
|
||||||
artifacts/android-apk/*.apk
|
|
||||||
artifacts/windows-x64/*.zip
|
|
||||||
artifacts/macos-app/*.zip
|
|
||||||
artifacts/linux-x64/*.tar.gz
|
|
||||||
body: ${{ steps.release_notes.outputs.release_notes }}
|
|
||||||
draft: false
|
|
||||||
prerelease: false
|
|
||||||
env:
|
|
||||||
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
|
||||||
|
|
||||||
- name: 📢 构建完成
|
|
||||||
run: |
|
|
||||||
echo "✅ 所有平台构建完成!"
|
|
||||||
echo "📦 Release: ${{ github.ref }}"
|
|
||||||
echo "🔗 https://github.com/${{ github.repository }}/releases"
|
|
||||||
@@ -1,45 +0,0 @@
|
|||||||
name: Build Windows
|
|
||||||
|
|
||||||
on:
|
|
||||||
push:
|
|
||||||
branches: [ main, master ]
|
|
||||||
pull_request:
|
|
||||||
branches: [ main, master ]
|
|
||||||
workflow_dispatch:
|
|
||||||
|
|
||||||
jobs:
|
|
||||||
build:
|
|
||||||
runs-on: windows-latest
|
|
||||||
|
|
||||||
steps:
|
|
||||||
- uses: actions/checkout@v4
|
|
||||||
|
|
||||||
- name: Setup Flutter
|
|
||||||
uses: subosito/flutter-action@v2
|
|
||||||
with:
|
|
||||||
flutter-version: '3.24.5'
|
|
||||||
channel: 'stable'
|
|
||||||
|
|
||||||
- name: Enable Windows desktop
|
|
||||||
run: flutter config --enable-windows-desktop
|
|
||||||
|
|
||||||
- name: Get dependencies
|
|
||||||
run: flutter pub get
|
|
||||||
|
|
||||||
- name: Build Windows Debug
|
|
||||||
run: flutter build windows
|
|
||||||
|
|
||||||
- name: Build Windows Release
|
|
||||||
run: flutter build windows --release
|
|
||||||
|
|
||||||
- name: Upload Debug build artifacts
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: windows-debug-build
|
|
||||||
path: build/windows/runner/Debug/
|
|
||||||
|
|
||||||
- name: Upload Release build artifacts
|
|
||||||
uses: actions/upload-artifact@v4
|
|
||||||
with:
|
|
||||||
name: windows-release-build
|
|
||||||
path: build/windows/runner/Release/
|
|
||||||
@@ -58,7 +58,6 @@ app.*.map.json
|
|||||||
/android/app/profile
|
/android/app/profile
|
||||||
/android/app/release
|
/android/app/release
|
||||||
|
|
||||||
|
|
||||||
/data
|
/data
|
||||||
/.gradle/
|
/.gradle/
|
||||||
|
|
||||||
@@ -99,3 +98,14 @@ libcore/*.aar
|
|||||||
|
|
||||||
# Android 编译产物
|
# Android 编译产物
|
||||||
android/app/libs/*.aar
|
android/app/libs/*.aar
|
||||||
|
|
||||||
|
# FVM Version Cache
|
||||||
|
.fvm/
|
||||||
|
# Build scripts configuration files
|
||||||
|
scripts/*.json
|
||||||
|
!scripts/build_config.template.json
|
||||||
|
scripts/*.bak
|
||||||
|
lib/app/common/app_config.dart.bak
|
||||||
|
# 版本号递增日志
|
||||||
|
build_versions.log
|
||||||
|
pubspec.yaml.version_bak
|
||||||
|
|||||||
@@ -1,3 +1,4 @@
|
|||||||
[submodule "libcore"]
|
[submodule "libcore"]
|
||||||
path = libcore
|
path = libcore
|
||||||
url = https://github.com/hiddify/hiddify-next-core
|
url = https://github.com/hiddify/hiddify-next-core
|
||||||
|
branch = main
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
FROM ubuntu:latest
|
|
||||||
|
|
||||||
# 使用阿里云源
|
|
||||||
RUN sed -i 's/ports.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
|
|
||||||
sed -i 's/archive.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list && \
|
|
||||||
sed -i 's/security.ubuntu.com/mirrors.aliyun.com/g' /etc/apt/sources.list
|
|
||||||
|
|
||||||
# 安装必要的依赖
|
|
||||||
RUN apt-get update && apt-get install -y \
|
|
||||||
git \
|
|
||||||
wget \
|
|
||||||
unzip \
|
|
||||||
xz-utils \
|
|
||||||
zip \
|
|
||||||
libglu1-mesa \
|
|
||||||
curl \
|
|
||||||
sudo \
|
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# 创建非root用户
|
|
||||||
RUN useradd -ms /bin/bash flutter_user
|
|
||||||
RUN adduser flutter_user sudo
|
|
||||||
RUN echo '%sudo ALL=(ALL) NOPASSWD:ALL' >> /etc/sudoers
|
|
||||||
|
|
||||||
# 克隆Flutter并设置权限
|
|
||||||
RUN git clone https://github.com/flutter/flutter.git /flutter && \
|
|
||||||
chown -R flutter_user:flutter_user /flutter
|
|
||||||
|
|
||||||
# 设置环境变量
|
|
||||||
ENV PATH="/flutter/bin:${PATH}"
|
|
||||||
|
|
||||||
# 切换用户并配置Flutter
|
|
||||||
USER flutter_user
|
|
||||||
WORKDIR /home/flutter_user
|
|
||||||
RUN flutter config --enable-windows-desktop
|
|
||||||
@@ -1,52 +0,0 @@
|
|||||||
FROM ubuntu:22.04
|
|
||||||
|
|
||||||
# 设置环境变量
|
|
||||||
ENV DEBIAN_FRONTEND=noninteractive
|
|
||||||
ENV FLUTTER_VERSION=3.24.0
|
|
||||||
ENV FLUTTER_HOME=/flutter
|
|
||||||
ENV PATH=$PATH:$FLUTTER_HOME/bin
|
|
||||||
|
|
||||||
# 安装必要的依赖
|
|
||||||
RUN apt-get update && apt-get install -y \
|
|
||||||
curl \
|
|
||||||
git \
|
|
||||||
unzip \
|
|
||||||
xz-utils \
|
|
||||||
zip \
|
|
||||||
libglu1-mesa \
|
|
||||||
cmake \
|
|
||||||
ninja-build \
|
|
||||||
pkg-config \
|
|
||||||
libgtk-3-dev \
|
|
||||||
liblzma-dev \
|
|
||||||
libstdc++-12-dev \
|
|
||||||
mingw-w64 \
|
|
||||||
gcc-mingw-w64 \
|
|
||||||
g++-mingw-w64 \
|
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# 下载并安装Flutter
|
|
||||||
RUN cd /tmp && curl -O https://mirrors-i.tuna.tsinghua.edu.cn/flutter/flutter_infra_release/releases/stable/linux/flutter_linux_${FLUTTER_VERSION}-stable.tar.xz \
|
|
||||||
&& tar xf flutter_linux_${FLUTTER_VERSION}-stable.tar.xz \
|
|
||||||
&& ls -la \
|
|
||||||
&& rm -rf /flutter \
|
|
||||||
&& mv flutter /flutter \
|
|
||||||
&& rm flutter_linux_${FLUTTER_VERSION}-stable.tar.xz
|
|
||||||
|
|
||||||
# 预下载Flutter依赖
|
|
||||||
RUN flutter precache
|
|
||||||
|
|
||||||
# 修复Git权限问题
|
|
||||||
RUN git config --global --add safe.directory /flutter
|
|
||||||
|
|
||||||
# 设置工作目录
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
# 复制项目文件
|
|
||||||
COPY . .
|
|
||||||
|
|
||||||
# 获取依赖
|
|
||||||
RUN flutter pub get
|
|
||||||
|
|
||||||
# 构建Windows版本
|
|
||||||
CMD ["flutter", "build", "windows"]
|
|
||||||
@@ -1,53 +0,0 @@
|
|||||||
FROM ubuntu:22.04
|
|
||||||
|
|
||||||
# 设置环境变量
|
|
||||||
ENV DEBIAN_FRONTEND=noninteractive
|
|
||||||
ENV FLUTTER_VERSION=3.24.0
|
|
||||||
ENV FLUTTER_HOME=/flutter
|
|
||||||
ENV PATH=$PATH:$FLUTTER_HOME/bin
|
|
||||||
|
|
||||||
# 安装必要的依赖
|
|
||||||
RUN apt-get update && apt-get install -y \
|
|
||||||
curl \
|
|
||||||
git \
|
|
||||||
unzip \
|
|
||||||
xz-utils \
|
|
||||||
zip \
|
|
||||||
libglu1-mesa \
|
|
||||||
cmake \
|
|
||||||
ninja-build \
|
|
||||||
pkg-config \
|
|
||||||
libgtk-3-dev \
|
|
||||||
liblzma-dev \
|
|
||||||
libstdc++-12-dev \
|
|
||||||
mingw-w64 \
|
|
||||||
gcc-mingw-w64 \
|
|
||||||
g++-mingw-w64 \
|
|
||||||
wine \
|
|
||||||
wine64 \
|
|
||||||
&& rm -rf /var/lib/apt/lists/*
|
|
||||||
|
|
||||||
# 下载并安装Flutter
|
|
||||||
RUN cd /tmp && curl -O https://mirrors-i.tuna.tsinghua.edu.cn/flutter/flutter_infra_release/releases/stable/linux/flutter_linux_${FLUTTER_VERSION}-stable.tar.xz \
|
|
||||||
&& tar xf flutter_linux_${FLUTTER_VERSION}-stable.tar.xz \
|
|
||||||
&& rm -rf /flutter \
|
|
||||||
&& mv flutter /flutter \
|
|
||||||
&& rm flutter_linux_${FLUTTER_VERSION}-stable.tar.xz
|
|
||||||
|
|
||||||
# 预下载Flutter依赖
|
|
||||||
RUN flutter precache
|
|
||||||
|
|
||||||
# 修复Git权限问题
|
|
||||||
RUN git config --global --add safe.directory /flutter
|
|
||||||
|
|
||||||
# 设置工作目录
|
|
||||||
WORKDIR /app
|
|
||||||
|
|
||||||
# 复制项目文件
|
|
||||||
COPY . .
|
|
||||||
|
|
||||||
# 获取依赖
|
|
||||||
RUN flutter pub get
|
|
||||||
|
|
||||||
# 尝试构建Windows版本(使用交叉编译)
|
|
||||||
CMD ["flutter", "build", "windows", "--release"]
|
|
||||||
@@ -12,6 +12,11 @@ ifeq ($(OS),Windows_NT)
|
|||||||
endif
|
endif
|
||||||
endif
|
endif
|
||||||
|
|
||||||
|
APP_NAME=HiFastVPN
|
||||||
|
VERSION_NAME=$(shell grep '^version:' pubspec.yaml | sed 's/version: //;s/+.*//;s/[^0-9.]//g')
|
||||||
|
VERSION_BUILD=$(shell grep '^version:' pubspec.yaml | sed 's/.*+//;s/[^0-9]//g')
|
||||||
|
FULL_VERSION=$(shell grep '^version:' pubspec.yaml | sed 's/version: //;s/[[:space:]]//g')
|
||||||
|
|
||||||
|
|
||||||
BINDIR=libcore$(SEP)bin
|
BINDIR=libcore$(SEP)bin
|
||||||
ANDROID_OUT=android$(SEP)app$(SEP)libs
|
ANDROID_OUT=android$(SEP)app$(SEP)libs
|
||||||
@@ -54,7 +59,7 @@ gen:
|
|||||||
dart run build_runner build --delete-conflicting-outputs
|
dart run build_runner build --delete-conflicting-outputs
|
||||||
|
|
||||||
translate:
|
translate:
|
||||||
dart run slang
|
dart run slang --overwrite
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@@ -152,9 +157,32 @@ gen_translations: #generating missing translations using google translate
|
|||||||
|
|
||||||
android-release: android-apk-release
|
android-release: android-apk-release
|
||||||
|
|
||||||
|
android-rename:
|
||||||
|
@FULL_VER=$(VERSION_NAME).$(VERSION_BUILD); \
|
||||||
|
OUT_DIR=build/app/outputs/flutter-apk; \
|
||||||
|
echo "Renaming APKs in $$OUT_DIR to $(APP_NAME)-$$FULL_VER-<ABI>.apk"; \
|
||||||
|
for SRC in "$$OUT_DIR"/app-*-release.apk; do \
|
||||||
|
if [ -f "$$SRC" ]; then \
|
||||||
|
FILENAME=$$(basename "$$SRC"); \
|
||||||
|
TGT="$$OUT_DIR/$(APP_NAME)-$$FULL_VER-$${FILENAME#app-}"; \
|
||||||
|
echo "Renaming $$SRC -> $$TGT"; \
|
||||||
|
mv -v "$$SRC" "$$TGT"; \
|
||||||
|
else \
|
||||||
|
echo "Skip $$SRC, file not found"; \
|
||||||
|
fi; \
|
||||||
|
done
|
||||||
|
|
||||||
android-apk-release:
|
android-apk-release:
|
||||||
echo flutter build apk --target $(TARGET) $(BUILD_ARGS) --target-platform android-arm,android-arm64,android-x64 --split-per-abi --verbose
|
echo flutter build apk --target $(TARGET) $(BUILD_ARGS) --target-platform android-arm,android-arm64,android-x64 --split-per-abi --verbose
|
||||||
flutter build apk --target $(TARGET) $(BUILD_ARGS) --target-platform android-arm,android-arm64,android-x64 --verbose
|
flutter build apk --target $(TARGET) $(BUILD_ARGS) --target-platform android-arm,android-arm64,android-x64 --split-per-abi --verbose
|
||||||
|
@mkdir -p dist/$(FULL_VERSION)
|
||||||
|
@if [ -f build/app/outputs/apk/release/app-arm64-v8a-release.apk ]; then \
|
||||||
|
echo "Moving and renaming APK to dist/$(FULL_VERSION)/$(APP_NAME)-$(FULL_VERSION).apk"; \
|
||||||
|
mv build/app/outputs/apk/release/app-arm64-v8a-release.apk dist/$(FULL_VERSION)/$(APP_NAME)-$(FULL_VERSION).apk; \
|
||||||
|
elif [ -f build/app/outputs/flutter-apk/app-arm64-v8a-release.apk ]; then \
|
||||||
|
echo "Moving and renaming APK to dist/$(FULL_VERSION)/$(APP_NAME)-$(FULL_VERSION).apk"; \
|
||||||
|
mv build/app/outputs/flutter-apk/app-arm64-v8a-release.apk dist/$(FULL_VERSION)/$(APP_NAME)-$(FULL_VERSION).apk; \
|
||||||
|
fi
|
||||||
ls -R build/app/outputs
|
ls -R build/app/outputs
|
||||||
|
|
||||||
android-aab-release:
|
android-aab-release:
|
||||||
@@ -163,13 +191,18 @@ android-aab-release:
|
|||||||
|
|
||||||
windows-release:
|
windows-release:
|
||||||
dart pub global activate flutter_distributor
|
dart pub global activate flutter_distributor
|
||||||
flutter_distributor package --flutter-build-args=verbose --platform windows --targets exe,msix $(DISTRIBUTOR_ARGS)
|
dart pub global run flutter_distributor:main package --flutter-build-args=verbose --platform windows --targets exe $(DISTRIBUTOR_ARGS)
|
||||||
|
|
||||||
linux-release:
|
linux-release:
|
||||||
flutter_distributor package --flutter-build-args=verbose --platform linux --targets deb,rpm,appimage $(DISTRIBUTOR_ARGS)
|
flutter_distributor package --flutter-build-args=verbose --platform linux --targets deb,rpm,appimage $(DISTRIBUTOR_ARGS)
|
||||||
|
|
||||||
macos-release:
|
macos-release:
|
||||||
flutter_distributor package --platform macos --targets dmg,pkg $(DISTRIBUTOR_ARGS)
|
# 旧方法(已弃用):使用 flutter_distributor 打包
|
||||||
|
# flutter_distributor package --platform macos --targets dmg $(DISTRIBUTOR_ARGS)
|
||||||
|
# 新方法:使用签名、公证和自定义 DMG 打包脚本
|
||||||
|
@echo "执行签名、公证和 DMG 打包..."
|
||||||
|
flutter build macos --release --target $(TARGET) $(BUILD_ARGS)
|
||||||
|
./scripts/sign_and_notarize.sh
|
||||||
|
|
||||||
ios-release: #not tested
|
ios-release: #not tested
|
||||||
flutter_distributor package --platform ios --targets ipa --build-export-options-plist ios/exportOptions.plist $(DISTRIBUTOR_ARGS)
|
flutter_distributor package --platform ios --targets ipa --build-export-options-plist ios/exportOptions.plist $(DISTRIBUTOR_ARGS)
|
||||||
|
|||||||
@@ -0,0 +1,57 @@
|
|||||||
|
### HiFastVPN
|
||||||
|
|
||||||
|
Hi快VPN 客户端应用,提供安全的 VPN 连接服务,支持 Android, iOS, macOS, Windows
|
||||||
|
|
||||||
|
### 环境准备
|
||||||
|
- **Flutter SDK**: `3.27.0`
|
||||||
|
- **Dart SDK**: `>=3.5.0 <4.0.0`
|
||||||
|
- **Make**: 用于执行构建自动化脚本
|
||||||
|
|
||||||
|
### 基础脚本
|
||||||
|
|
||||||
|
> 核心启动和构建模块均已集成在 `Makefile` 中。
|
||||||
|
|
||||||
|
项目启动命令和构建release命令
|
||||||
|
```bash
|
||||||
|
# 项目初始化准备
|
||||||
|
make android-prepare
|
||||||
|
make ios-prepare
|
||||||
|
make macos-prepare
|
||||||
|
make windows-prepare
|
||||||
|
# 项目release
|
||||||
|
make android-release
|
||||||
|
make ios-release
|
||||||
|
make macos-release
|
||||||
|
make windows-release
|
||||||
|
```
|
||||||
|
|
||||||
|
## 注意事项
|
||||||
|
|
||||||
|
### 📱 Android
|
||||||
|
> android-release
|
||||||
|
- release apk:路径在 `build/app/outputs/apk/release/app-arm64-v8a-release.apk`, 这个版本兼容近5年内android,其他版本体积过大或过老
|
||||||
|
|
||||||
|
### 🍎 iOS
|
||||||
|
> ios-release
|
||||||
|
- **证书管理**: 开发环境使用automaticall模式自动,生产环境需要下载hiFastVPN-iOs-Prod的profile
|
||||||
|
- ipa发布后使用 `Transporter.app`上传到苹果后台
|
||||||
|
- release apk:路径在 `dist/对应版本号/*.ipa`,
|
||||||
|
#### 问题
|
||||||
|
- ios真机调试,出现开发环境flutter运行一会就断开,日志没法看,并且生成flutter.log文件,但在xcode可以正常看到日志
|
||||||
|
修改mac上的设置 -> 本机网络 -> android studio 开启
|
||||||
|
|
||||||
|
### 💻 macOS
|
||||||
|
> macos-release
|
||||||
|
- release apk:路径在 `dist/对应版本号/*.dmg`,完成公证和dmg封面制作
|
||||||
|
#### 问题
|
||||||
|
- 启动过程中遇到 Crash occurred when compiling unknown function in unoptimized JIT mode in unknown pass
|
||||||
|
1. xcode修改配置, macOS -> signing Certificate -> 选择 sign to Run Locally;
|
||||||
|
2. 使用automaticall
|
||||||
|
- 启动过程中页面卡在启动页 FFISingboxService - singbox native libs path: "libcore.dylib"
|
||||||
|
是ffi_singbox_service.dart找不到路径导致的卡住
|
||||||
|
|
||||||
|
|
||||||
|
### 🪟 Windows
|
||||||
|
- 环境需要Inno Setup
|
||||||
|
- 需要注意Inno Setup中有没有 `ChineseSimplified.isl`,如果没有需要下载,放在对应的languages文件夹,不是hi-client项目
|
||||||
|
- release apk:路径在 `dist/对应版本号/*.exe`,
|
||||||
@@ -55,14 +55,15 @@ android {
|
|||||||
}
|
}
|
||||||
|
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
applicationId "app.brAccelerator.com"
|
applicationId "app.hifastvpn.com"
|
||||||
minSdkVersion flutter.minSdkVersion
|
minSdkVersion flutter.minSdkVersion
|
||||||
targetSdkVersion 36
|
targetSdkVersion 34
|
||||||
versionCode flutterVersionCode.toInteger()
|
versionCode flutterVersionCode.toInteger()
|
||||||
versionName flutterVersionName
|
versionName flutterVersionName
|
||||||
multiDexEnabled true
|
multiDexEnabled true
|
||||||
manifestPlaceholders = [
|
manifestPlaceholders = [
|
||||||
'android.permission.ACCESS_NETWORK_STATE': true
|
'android.permission.ACCESS_NETWORK_STATE': true,
|
||||||
|
'OPENINSTALL_APPKEY' : "alf57p",
|
||||||
]
|
]
|
||||||
android.defaultConfig.manifestPlaceholders += [
|
android.defaultConfig.manifestPlaceholders += [
|
||||||
'android:screenOrientation': "portrait"
|
'android:screenOrientation': "portrait"
|
||||||
@@ -148,6 +149,7 @@ dependencies {
|
|||||||
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.2'
|
implementation 'androidx.lifecycle:lifecycle-livedata-ktx:2.6.2'
|
||||||
implementation "org.jetbrains.kotlin:kotlin-stdlib:2.1.0"
|
implementation "org.jetbrains.kotlin:kotlin-stdlib:2.1.0"
|
||||||
implementation "androidx.annotation:annotation:1.7.1"
|
implementation "androidx.annotation:annotation:1.7.1"
|
||||||
|
implementation 'com.google.android.material:material:1.9.0'
|
||||||
constraints {
|
constraints {
|
||||||
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.0") {
|
implementation("org.jetbrains.kotlin:kotlin-stdlib-jdk7:2.1.0") {
|
||||||
because("kotlin-stdlib-jdk7 is now a part of kotlin-stdlib")
|
because("kotlin-stdlib-jdk7 is now a part of kotlin-stdlib")
|
||||||
|
|||||||
@@ -23,10 +23,6 @@
|
|||||||
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />
|
||||||
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
|
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />
|
||||||
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
<uses-permission android:name="android.permission.WAKE_LOCK" />
|
||||||
<!-- Crisp 聊天所需权限 -->
|
|
||||||
<uses-permission android:name="android.permission.BLUETOOTH" />
|
|
||||||
<uses-permission android:name="android.permission.MODIFY_AUDIO_SETTINGS" />
|
|
||||||
<uses-permission android:name="android.permission.RECORD_AUDIO" />
|
|
||||||
|
|
||||||
<uses-permission
|
<uses-permission
|
||||||
android:name="android.permission.QUERY_ALL_PACKAGES"
|
android:name="android.permission.QUERY_ALL_PACKAGES"
|
||||||
@@ -34,15 +30,33 @@
|
|||||||
|
|
||||||
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
|
||||||
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
|
||||||
|
|
||||||
|
<uses-permission android:name="android.permission.NEARBY_WIFI_DEVICES" />
|
||||||
|
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
|
||||||
|
|
||||||
|
<queries>
|
||||||
|
<!-- Twitter/X -->
|
||||||
|
<package android:name="com.twitter.android" />
|
||||||
|
<package android:name="com.x.android" />
|
||||||
|
<intent>
|
||||||
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
<data android:scheme="twitter" />
|
||||||
|
</intent>
|
||||||
|
</queries>
|
||||||
|
|
||||||
|
<!-- 如果 targetSdkVersion >= 33 -->
|
||||||
|
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
|
||||||
<application
|
<application
|
||||||
android:name=".Application"
|
android:name=".Application"
|
||||||
android:banner="@mipmap/ic_banner"
|
android:banner="@mipmap/ic_banner"
|
||||||
android:icon="@mipmap/ic_launcher"
|
android:icon="@mipmap/ic_launcher"
|
||||||
android:label="BearVPN"
|
android:label="Hi快VPN"
|
||||||
android:roundIcon="@mipmap/ic_launcher_round"
|
android:roundIcon="@mipmap/ic_launcher_round"
|
||||||
android:extractNativeLibs="true"
|
android:extractNativeLibs="true"
|
||||||
tools:targetApi="31">
|
tools:targetApi="31">
|
||||||
|
<meta-data
|
||||||
|
android:name="io.flutter.embedding.android.EnableImpeller"
|
||||||
|
android:value="false" />
|
||||||
<meta-data
|
<meta-data
|
||||||
android:name="android.app.shortcuts"
|
android:name="android.app.shortcuts"
|
||||||
android:resource="@xml/shortcuts" />
|
android:resource="@xml/shortcuts" />
|
||||||
@@ -92,11 +106,27 @@
|
|||||||
<data android:host="import" />
|
<data android:host="import" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
|
|
||||||
|
<!-- OpenInstall Deep Link -->
|
||||||
|
<intent-filter>
|
||||||
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
|
<data android:scheme="alf57p" />
|
||||||
|
</intent-filter>
|
||||||
|
<intent-filter android:autoVerify="true">
|
||||||
|
<action android:name="android.intent.action.VIEW" />
|
||||||
|
<category android:name="android.intent.category.DEFAULT" />
|
||||||
|
<category android:name="android.intent.category.BROWSABLE" />
|
||||||
|
<data android:scheme="http" android:host="alf57p.oplinking.com" />
|
||||||
|
<data android:scheme="https" android:host="alf57p.oplinking.com" />
|
||||||
|
</intent-filter>
|
||||||
|
|
||||||
<intent-filter>
|
<intent-filter>
|
||||||
<action android:name="android.service.quicksettings.action.QS_TILE_PREFERENCES" />
|
<action android:name="android.service.quicksettings.action.QS_TILE_PREFERENCES" />
|
||||||
</intent-filter>
|
</intent-filter>
|
||||||
</activity>
|
</activity>
|
||||||
|
|
||||||
|
|
||||||
<activity
|
<activity
|
||||||
android:name=".ShortcutActivity"
|
android:name=".ShortcutActivity"
|
||||||
android:excludeFromRecents="true"
|
android:excludeFromRecents="true"
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 27 KiB After Width: | Height: | Size: 24 KiB |
@@ -14,7 +14,7 @@ class ActiveGroupsChannel(private val scope: CoroutineScope) : FlutterPlugin,
|
|||||||
CommandClient.Handler {
|
CommandClient.Handler {
|
||||||
companion object {
|
companion object {
|
||||||
const val TAG = "A/ActiveGroupsChannel"
|
const val TAG = "A/ActiveGroupsChannel"
|
||||||
const val CHANNEL = "com.baer.app/active-groups"
|
const val CHANNEL = "com.hi.app/active-groups"
|
||||||
val gson = Gson()
|
val gson = Gson()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -12,8 +12,8 @@ class EventHandler : FlutterPlugin {
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val TAG = "A/EventHandler"
|
const val TAG = "A/EventHandler"
|
||||||
const val SERVICE_STATUS = "com.baer.app/service.status"
|
const val SERVICE_STATUS = "com.hi.app/service.status"
|
||||||
const val SERVICE_ALERTS = "com.baer.app/service.alerts"
|
const val SERVICE_ALERTS = "com.hi.app/service.alerts"
|
||||||
}
|
}
|
||||||
|
|
||||||
private var statusChannel: EventChannel? = null
|
private var statusChannel: EventChannel? = null
|
||||||
|
|||||||
@@ -12,7 +12,7 @@ import kotlinx.coroutines.CoroutineScope
|
|||||||
class GroupsChannel(private val scope: CoroutineScope) : FlutterPlugin, CommandClient.Handler {
|
class GroupsChannel(private val scope: CoroutineScope) : FlutterPlugin, CommandClient.Handler {
|
||||||
companion object {
|
companion object {
|
||||||
const val TAG = "A/GroupsChannel"
|
const val TAG = "A/GroupsChannel"
|
||||||
const val CHANNEL = "com.baer.app/groups"
|
const val CHANNEL = "com.hi.app/groups"
|
||||||
val gson = Gson()
|
val gson = Gson()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -9,7 +9,7 @@ class LogHandler : FlutterPlugin {
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val TAG = "A/LogHandler"
|
const val TAG = "A/LogHandler"
|
||||||
const val SERVICE_LOGS = "com.baer.app/service.logs"
|
const val SERVICE_LOGS = "com.hi.app/service.logs"
|
||||||
}
|
}
|
||||||
|
|
||||||
private lateinit var logsChannel: EventChannel
|
private lateinit var logsChannel: EventChannel
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ class MethodHandler(private val scope: CoroutineScope) : FlutterPlugin,
|
|||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val TAG = "A/MethodHandler"
|
const val TAG = "A/MethodHandler"
|
||||||
const val channelName = "com.baer.app/method"
|
const val channelName = "com.hi.app/method"
|
||||||
|
|
||||||
enum class Trigger(val method: String) {
|
enum class Trigger(val method: String) {
|
||||||
Setup("setup"),
|
Setup("setup"),
|
||||||
|
|||||||
@@ -33,7 +33,7 @@ class PlatformSettingsHandler : FlutterPlugin, MethodChannel.MethodCallHandler,
|
|||||||
private lateinit var ignoreRequestResult: MethodChannel.Result
|
private lateinit var ignoreRequestResult: MethodChannel.Result
|
||||||
|
|
||||||
companion object {
|
companion object {
|
||||||
const val channelName = "com.baer.app/platform"
|
const val channelName = "com.hi.app/platform"
|
||||||
|
|
||||||
const val REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = 44
|
const val REQUEST_IGNORE_BATTERY_OPTIMIZATIONS = 44
|
||||||
val gson = Gson()
|
val gson = Gson()
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ import kotlinx.coroutines.CoroutineScope
|
|||||||
class StatsChannel(private val scope: CoroutineScope) : FlutterPlugin, CommandClient.Handler{
|
class StatsChannel(private val scope: CoroutineScope) : FlutterPlugin, CommandClient.Handler{
|
||||||
companion object {
|
companion object {
|
||||||
const val TAG = "A/StatsChannel"
|
const val TAG = "A/StatsChannel"
|
||||||
const val STATS_CHANNEL = "com.baer.app/stats"
|
const val STATS_CHANNEL = "com.hi.app/stats"
|
||||||
}
|
}
|
||||||
|
|
||||||
private val commandClient =
|
private val commandClient =
|
||||||
|
|||||||
@@ -387,6 +387,11 @@ class BoxService(
|
|||||||
stopService()
|
stopService()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun onTaskRemoved(intent: Intent?) {
|
||||||
|
Log.d(TAG, "📦 onTaskRemoved 被调用, 准备停止 VPN 服务")
|
||||||
|
stopService()
|
||||||
|
}
|
||||||
|
|
||||||
fun writeLog(message: String) {
|
fun writeLog(message: String) {
|
||||||
binder.broadcast {
|
binder.broadcast {
|
||||||
it.onServiceWriteLog(message)
|
it.onServiceWriteLog(message)
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ class ServiceNotification(private val status: MutableLiveData<Status>, private v
|
|||||||
NotificationCompat.Builder(service, notificationChannel)
|
NotificationCompat.Builder(service, notificationChannel)
|
||||||
.setShowWhen(false)
|
.setShowWhen(false)
|
||||||
.setOngoing(true)
|
.setOngoing(true)
|
||||||
.setContentTitle("BearVPN")
|
.setContentTitle("Hi快VPN")
|
||||||
.setOnlyAlertOnce(true)
|
.setOnlyAlertOnce(true)
|
||||||
.setSmallIcon(R.drawable.ic_stat_logo)
|
.setSmallIcon(R.drawable.ic_stat_logo)
|
||||||
.setCategory(NotificationCompat.CATEGORY_SERVICE)
|
.setCategory(NotificationCompat.CATEGORY_SERVICE)
|
||||||
|
|||||||
@@ -38,6 +38,11 @@ class VPNService : VpnService(), PlatformInterfaceWrapper {
|
|||||||
service.onDestroy()
|
service.onDestroy()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override fun onTaskRemoved(rootIntent: Intent?) {
|
||||||
|
super.onTaskRemoved(rootIntent)
|
||||||
|
service.onTaskRemoved(rootIntent)
|
||||||
|
}
|
||||||
|
|
||||||
override fun onRevoke() {
|
override fun onRevoke() {
|
||||||
runBlocking {
|
runBlocking {
|
||||||
withContext(Dispatchers.Main) {
|
withContext(Dispatchers.Main) {
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
package com.hiddify.hiddify.constant
|
package com.hiddify.hiddify.constant
|
||||||
|
|
||||||
object Action {
|
object Action {
|
||||||
const val SERVICE = "com.baer.app.SERVICE"
|
const val SERVICE = "com.hi.app.SERVICE"
|
||||||
const val SERVICE_CLOSE = "com.baer.app.SERVICE_CLOSE"
|
const val SERVICE_CLOSE = "com.hi.app.SERVICE_CLOSE"
|
||||||
const val SERVICE_RELOAD = "com.baer.app.sfa.SERVICE_RELOAD"
|
const val SERVICE_RELOAD = "com.hi.app.sfa.SERVICE_RELOAD"
|
||||||
}
|
}
|
||||||
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 69 B After Width: | Height: | Size: 844 KiB |
@@ -1,9 +1,16 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
|
||||||
<item>
|
<item>
|
||||||
<bitmap android:gravity="fill" android:src="@drawable/background"/>
|
<bitmap
|
||||||
|
android:gravity="fill_horizontal|fill_vertical"
|
||||||
|
android:src="@drawable/background"
|
||||||
|
android:tileMode="disabled" />
|
||||||
</item>
|
</item>
|
||||||
<item>
|
<item>
|
||||||
<bitmap android:gravity="center" android:src="@drawable/splash"/>
|
<bitmap
|
||||||
|
android:gravity="center"
|
||||||
|
android:src="@drawable/splash"
|
||||||
|
android:width="50dp"
|
||||||
|
android:height="50dp" />
|
||||||
</item>
|
</item>
|
||||||
</layer-list>
|
</layer-list>
|
||||||
|
|||||||
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 69 B After Width: | Height: | Size: 844 KiB |
|
Before Width: | Height: | Size: 7.0 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 1.1 KiB After Width: | Height: | Size: 1.4 KiB |
|
Before Width: | Height: | Size: 1008 B After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 794 B After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 636 B After Width: | Height: | Size: 1.2 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 1.5 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 3.7 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 3.5 KiB After Width: | Height: | Size: 3.4 KiB |
|
Before Width: | Height: | Size: 5.6 KiB After Width: | Height: | Size: 5.6 KiB |
|
Before Width: | Height: | Size: 3.4 KiB After Width: | Height: | Size: 4.1 KiB |
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 4.7 KiB |
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 7.8 KiB |
@@ -1,21 +1,16 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
|
<style name="LaunchTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
|
||||||
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
|
||||||
<item name="android:forceDarkAllowed">false</item>
|
<item name="android:forceDarkAllowed">false</item>
|
||||||
<item name="android:windowFullscreen">false</item>
|
<item name="android:windowFullscreen">false</item>
|
||||||
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
|
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
|
||||||
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
|
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
|
||||||
<item name="android:windowSplashScreenBackground">#F0F3FA</item>
|
|
||||||
|
<item name="android:windowSplashScreenBackground">@drawable/launch_background</item>
|
||||||
<item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>
|
<item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>
|
||||||
</style>
|
</style>
|
||||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
|
||||||
This theme determines the color of the Android Window while your
|
|
||||||
Flutter UI initializes, as well as behind your Flutter UI while its
|
|
||||||
running.
|
|
||||||
|
|
||||||
This Theme is only used starting with V2 of Flutter's Android embedding. -->
|
<style name="NormalTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
|
||||||
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
|
||||||
<item name="android:windowBackground">?android:colorBackground</item>
|
<item name="android:windowBackground">?android:colorBackground</item>
|
||||||
</style>
|
</style>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -1,22 +1,14 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is on -->
|
<style name="LaunchTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
|
||||||
<style name="LaunchTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
|
||||||
<!-- Show a splash screen on the activity. Automatically removed when
|
|
||||||
the Flutter engine draws its first frame -->
|
|
||||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||||
<item name="android:forceDarkAllowed">false</item>
|
<item name="android:forceDarkAllowed">false</item>
|
||||||
<item name="android:windowFullscreen">false</item>
|
<item name="android:windowFullscreen">false</item>
|
||||||
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
|
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
|
||||||
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
|
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
|
||||||
</style>
|
</style>
|
||||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
|
||||||
This theme determines the color of the Android Window while your
|
|
||||||
Flutter UI initializes, as well as behind your Flutter UI while its
|
|
||||||
running.
|
|
||||||
|
|
||||||
This Theme is only used starting with V2 of Flutter's Android embedding. -->
|
<style name="NormalTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
|
||||||
<style name="NormalTheme" parent="@android:style/Theme.Black.NoTitleBar">
|
|
||||||
<item name="android:windowBackground">?android:colorBackground</item>
|
<item name="android:windowBackground">?android:colorBackground</item>
|
||||||
</style>
|
</style>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -1,21 +1,16 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
|
<style name="LaunchTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
|
||||||
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
|
||||||
<item name="android:forceDarkAllowed">false</item>
|
<item name="android:forceDarkAllowed">false</item>
|
||||||
<item name="android:windowFullscreen">false</item>
|
<item name="android:windowFullscreen">false</item>
|
||||||
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
|
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
|
||||||
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
|
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
|
||||||
|
|
||||||
<item name="android:windowSplashScreenBackground">#ffffff</item>
|
<item name="android:windowSplashScreenBackground">#ffffff</item>
|
||||||
<item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>
|
<item name="android:windowSplashScreenAnimatedIcon">@drawable/android12splash</item>
|
||||||
</style>
|
</style>
|
||||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
|
||||||
This theme determines the color of the Android Window while your
|
|
||||||
Flutter UI initializes, as well as behind your Flutter UI while its
|
|
||||||
running.
|
|
||||||
|
|
||||||
This Theme is only used starting with V2 of Flutter's Android embedding. -->
|
<style name="NormalTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
|
||||||
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
|
||||||
<item name="android:windowBackground">?android:colorBackground</item>
|
<item name="android:windowBackground">?android:colorBackground</item>
|
||||||
</style>
|
</style>
|
||||||
</resources>
|
</resources>
|
||||||
@@ -1,22 +1,14 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<resources>
|
<resources>
|
||||||
<!-- Theme applied to the Android Window while the process is starting when the OS's Dark Mode setting is off -->
|
<style name="LaunchTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
|
||||||
<style name="LaunchTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
|
||||||
<!-- Show a splash screen on the activity. Automatically removed when
|
|
||||||
the Flutter engine draws its first frame -->
|
|
||||||
<item name="android:windowBackground">@drawable/launch_background</item>
|
<item name="android:windowBackground">@drawable/launch_background</item>
|
||||||
<item name="android:forceDarkAllowed">false</item>
|
<item name="android:forceDarkAllowed">false</item>
|
||||||
<item name="android:windowFullscreen">false</item>
|
<item name="android:windowFullscreen">false</item>
|
||||||
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
|
<item name="android:windowDrawsSystemBarBackgrounds">false</item>
|
||||||
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
|
<item name="android:windowLayoutInDisplayCutoutMode">shortEdges</item>
|
||||||
</style>
|
</style>
|
||||||
<!-- Theme applied to the Android Window as soon as the process has started.
|
|
||||||
This theme determines the color of the Android Window while your
|
|
||||||
Flutter UI initializes, as well as behind your Flutter UI while its
|
|
||||||
running.
|
|
||||||
|
|
||||||
This Theme is only used starting with V2 of Flutter's Android embedding. -->
|
<style name="NormalTheme" parent="Theme.MaterialComponents.DayNight.NoActionBar">
|
||||||
<style name="NormalTheme" parent="@android:style/Theme.Light.NoTitleBar">
|
|
||||||
<item name="android:windowBackground">?android:colorBackground</item>
|
<item name="android:windowBackground">?android:colorBackground</item>
|
||||||
</style>
|
</style>
|
||||||
</resources>
|
</resources>
|
||||||
|
Before Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 7.7 KiB |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg width="10" height="11" viewBox="0 0 10 11" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M9.21003 4.67513C9.84737 5.06517 9.84737 5.99098 9.21003 6.38102L2.2201 10.6588C1.55376 11.0666 0.698099 10.5871 0.698099 9.80586L0.698099 1.25029C0.698099 0.469078 1.55376 -0.0104452 2.2201 0.397347L9.21003 4.67513Z" fill="currentColor"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 352 B |
|
Before Width: | Height: | Size: 1.7 MiB |
|
Before Width: | Height: | Size: 137 KiB |
|
Before Width: | Height: | Size: 166 KiB |
|
After Width: | Height: | Size: 3.0 KiB |
|
After Width: | Height: | Size: 1.7 MiB |
@@ -0,0 +1,4 @@
|
|||||||
|
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<circle cx="24" cy="24" r="24" fill="#ADFF5B"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M17.3617 23.9999L24.7263 16.3403L27.5745 19.3025L23.058 23.9999L27.5745 28.6966L24.7257 31.6595L17.6446 24.2947L17.3617 23.9999Z" fill="black"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 345 B |
@@ -0,0 +1,5 @@
|
|||||||
|
<svg width="429" height="360" viewBox="0 0 429 360" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M126.397 143.749H206.991L234.774 0H319.122L250.041 360H165.443L192.975 216.502H112.381L84.5986 360H0L59.3191 52.6829L33.0385 0H153.929L126.397 143.749Z" fill="black" style="mix-blend-mode:plus-lighter"/>
|
||||||
|
<path d="M359.669 360H275.321L324.649 103.108H409.175L359.669 360Z" fill="black" style="mix-blend-mode:plus-lighter"/>
|
||||||
|
<path d="M413.305 81.7003H328.758L344.401 0.250871H429L413.305 81.7003Z" fill="black" style="mix-blend-mode:plus-lighter"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 563 B |
@@ -0,0 +1,61 @@
|
|||||||
|
<svg width="247" height="203" viewBox="0 0 247 203" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M239.315 202.151L235.671 202.689L233.39 199.853L237.035 199.316L239.315 202.151ZM234.684 196.003L233.32 199.376L236.964 198.838L238.329 195.465L234.684 196.003ZM233.627 188.839L232.263 192.212L235.907 191.674L237.272 188.301L233.627 188.839ZM246.676 193.989L244.449 191.219L243.116 194.515L245.343 197.285L246.676 193.989ZM232.333 192.69L234.614 195.525L238.258 194.987L235.978 192.152L232.333 192.69ZM240.008 191.313L237.728 188.478L236.363 191.851L238.644 194.686L240.008 191.313ZM239.17 195.341L241.398 198.111L244.958 197.586L242.731 194.816L239.17 195.341ZM242.66 194.338L243.993 191.043L240.432 191.568L239.099 194.863L242.66 194.338ZM241.065 198.477L238.785 195.642L237.42 199.015L239.701 201.85L241.065 198.477Z" fill="white"/>
|
||||||
|
<path d="M18.1236 3.34464L19.2773 3.14965L20.0189 7.53741C20.1222 8.14874 20.3353 8.56911 20.6712 8.81658C20.9956 9.05586 21.4742 9.1271 22.0954 9.0221C22.7067 8.91877 23.1353 8.69421 23.3729 8.35993C23.599 8.01746 23.6719 7.54876 23.5685 6.93743L22.8269 2.54966L23.9805 2.35467L24.7188 6.72271C24.8738 7.63971 24.7358 8.38311 24.3047 8.95292C23.872 9.51287 23.1922 9.87118 22.2654 10.0278C21.3287 10.1862 20.5689 10.0712 19.9975 9.69109C19.3916 9.28641 19.0169 8.62968 18.8619 7.71268L18.1236 3.34464Z" fill="white"/>
|
||||||
|
<path d="M28.2917 3.59288C29.57 3.41946 30.3082 4.02572 30.4991 5.43283L30.928 8.59387L29.7983 8.74713L29.3829 5.68518C29.2687 4.84289 28.8257 4.47914 28.0528 4.58399C27.7754 4.62164 27.5411 4.75434 27.3599 4.98075C27.1516 5.23102 27.0559 5.56694 27.0714 5.97859L27.4895 9.06036L26.3598 9.21362L25.6648 4.09055L26.7944 3.93729L26.8751 4.53185C27.041 4.26714 27.2434 4.04794 27.475 3.89542C27.7152 3.73165 27.9845 3.63455 28.2917 3.59288Z" fill="white"/>
|
||||||
|
<path d="M31.3459 1.21347L32.4794 1.09232L33.2531 8.33109L32.1196 8.45224L31.3459 1.21347Z" fill="white"/>
|
||||||
|
<path d="M36.3605 2.7097C37.1374 2.63973 37.7872 2.83221 38.312 3.30706C38.8258 3.77284 39.1231 4.39869 39.1949 5.19547C39.2658 5.98228 39.085 6.65119 38.6718 7.19044C38.2403 7.7514 37.6262 8.06776 36.8494 8.13773C36.0626 8.2086 35.4118 8.00616 34.8871 7.53131C34.3741 7.07549 34.0867 6.44874 34.0159 5.66193C33.9441 4.86515 34.1149 4.19714 34.5472 3.64614C34.9687 3.08607 35.5737 2.78057 36.3605 2.7097ZM36.4439 3.63595C35.9659 3.67901 35.6235 3.89058 35.3986 4.29237C35.2082 4.63081 35.1363 5.05899 35.1812 5.55697C35.226 6.05496 35.3723 6.45344 35.6202 6.75241C35.9123 7.0976 36.2879 7.25454 36.766 7.21148C37.2341 7.16932 37.5855 6.9469 37.8113 6.55506C38.0008 6.20666 38.0835 5.78755 38.0396 5.29952C37.9947 4.80154 37.8375 4.394 37.5897 4.09502C37.2967 3.73988 36.912 3.59379 36.4439 3.63595Z" fill="white"/>
|
||||||
|
<path d="M42.3406 2.27416C43.0096 2.23685 43.5471 2.3571 43.9632 2.63435C44.3904 2.93102 44.6767 3.3958 44.8127 4.03922L43.6845 4.10215C43.5962 3.77656 43.4431 3.54473 43.2345 3.39612C43.0159 3.24806 42.7319 3.18378 42.3924 3.20272C41.973 3.22611 41.6519 3.39425 41.4301 3.72712C41.2077 4.05001 41.1124 4.49601 41.1436 5.05514C41.1754 5.62425 41.3103 6.06743 41.5677 6.37357C41.8046 6.67083 42.143 6.81221 42.5823 6.7877C43.3412 6.74538 43.7393 6.34257 43.7874 5.58873L44.9157 5.52579C44.8349 6.23139 44.5942 6.76562 44.2038 7.12793C43.8228 7.47969 43.2931 7.6795 42.6241 7.71682C41.8254 7.76137 41.1919 7.5363 40.7236 7.04161C40.2664 6.56634 40.0205 5.92904 39.976 5.13028C39.9325 4.35149 40.1066 3.70079 40.4986 3.18816C40.9179 2.62394 41.5319 2.31927 42.3406 2.27416Z" fill="white"/>
|
||||||
|
<path d="M45.6235 0.138545L46.7631 0.108188L46.8738 4.26671L48.9385 2.16099L50.408 2.12184L48.1758 4.32206L50.7456 7.28468L49.2861 7.32356L47.4155 5.07258L46.9087 5.57625L46.9569 7.38561L45.8173 7.41596L45.6235 0.138545Z" fill="white"/>
|
||||||
|
<path d="M54.6644 0L55.8043 0.0144245L55.7122 7.29384L54.5723 7.27942L54.6644 0Z" fill="white"/>
|
||||||
|
<path d="M57.8611 0.0575568C58.081 0.0630011 58.2693 0.137682 58.4157 0.281351C58.5522 0.424773 58.6278 0.606698 58.6223 0.82663C58.6169 1.04656 58.5322 1.23452 58.3788 1.37077C58.2253 1.50701 58.0437 1.57254 57.8237 1.56709C57.6038 1.56165 57.4256 1.48722 57.2791 1.34355C57.1329 1.18988 57.0673 1.0082 57.0728 0.788272C57.0782 0.56834 57.1527 0.390127 57.3061 0.253882C57.4595 0.117637 57.6412 0.0521124 57.8611 0.0575568ZM57.2391 2.15281L58.3787 2.18102L58.2508 7.34943L57.1111 7.32122L57.2391 2.15281Z" fill="white"/>
|
||||||
|
<path d="M61.9695 2.19733C62.6087 2.2285 63.106 2.50304 63.4602 3.04093L63.4909 2.41168L64.6295 2.4672L64.3938 7.30146C64.3144 8.92952 63.4654 9.7091 61.8474 9.6302C61.1182 9.59465 60.5757 9.42803 60.2088 9.14983C59.8429 8.85165 59.6236 8.42046 59.552 7.83628L60.6907 7.8918C60.7365 8.18438 60.8466 8.38999 61.0305 8.5191C61.2049 8.63774 61.4917 8.71179 61.8912 8.73127C62.7502 8.77315 63.2021 8.33464 63.2469 7.41573L63.2839 6.65664C62.8785 7.1675 62.356 7.41234 61.7167 7.38117C61.0176 7.34708 60.4599 7.0796 60.0528 6.59921C59.6363 6.10833 59.4572 5.46885 59.4952 4.68978C59.5332 3.9107 59.7736 3.29168 60.2365 2.83368C60.6893 2.37519 61.2703 2.16324 61.9695 2.19733ZM62.1045 3.125C61.675 3.10406 61.3381 3.23781 61.0838 3.52577C60.8299 3.80373 60.6901 4.2074 60.6638 4.74676C60.6399 5.23618 60.7113 5.62011 60.8875 5.90903C61.0911 6.24936 61.4324 6.4362 61.9318 6.46055C62.3713 6.48198 62.7182 6.34872 62.9716 6.08074C63.2159 5.7923 63.3552 5.39862 63.3806 4.87924C63.4064 4.34986 63.3065 3.93451 63.0914 3.62366C62.8663 3.31233 62.534 3.14595 62.1045 3.125Z" fill="white"/>
|
||||||
|
<path d="M66.0453 0.445295L67.1817 0.535318L66.9606 3.32657C67.1729 3.05248 67.4287 2.86209 67.7189 2.74464C67.9784 2.63479 68.2722 2.59788 68.6012 2.62394C69.2292 2.67369 69.6836 2.89024 69.9634 3.28356C70.2248 3.65537 70.3333 4.18559 70.2788 4.87344L70.0261 8.06344L68.8897 7.97342L69.1266 4.98279C69.1613 4.54416 69.0984 4.19812 68.9471 3.95541C68.7675 3.6904 68.4879 3.54787 68.0991 3.51708C67.7402 3.48865 67.4501 3.6061 67.2286 3.86943C66.9971 4.13197 66.8698 4.47298 66.835 4.91161L66.6068 7.79258L65.4704 7.70256L66.0453 0.445295Z" fill="white"/>
|
||||||
|
<path d="M73.4571 1.53636L73.2803 3.19699L74.4239 3.31869L74.3244 4.25341L73.1808 4.13171L72.8718 7.03531C72.8591 7.15464 72.8695 7.24625 72.9218 7.3222C72.9751 7.38822 73.0514 7.42651 73.1708 7.43921L73.8469 7.51118L73.7475 8.4459L72.8824 8.35383C72.4349 8.3062 72.1194 8.15196 71.936 7.89108C71.7604 7.65115 71.6938 7.33231 71.7382 6.91467L72.0472 4.01106L71.1225 3.91264L71.222 2.97792L72.1467 3.07634L72.2737 1.88308L73.4571 1.53636Z" fill="white"/>
|
||||||
|
<path d="M77.9568 3.63243C79.236 3.79898 79.7902 4.57704 79.6068 5.98515L79.195 9.14846L78.0645 9.00128L78.4635 5.93714C78.5732 5.09425 78.2407 4.62741 77.4672 4.52671C77.1896 4.49056 76.9288 4.55745 76.6947 4.72866C76.4283 4.91584 76.2482 5.21509 76.1556 5.61649L75.754 8.70046L74.6236 8.55328L75.2911 3.42655L76.4215 3.57373L76.3441 4.16871C76.5734 3.95654 76.826 3.79782 77.0894 3.7111C77.364 3.61576 77.6494 3.59241 77.9568 3.63243Z" fill="white"/>
|
||||||
|
<path d="M82.1642 2.23026C82.3815 2.26408 82.5585 2.36246 82.6852 2.52386C82.802 2.68372 82.8534 2.87388 82.8196 3.09127C82.7857 3.30865 82.6775 3.48409 82.5077 3.59936C82.338 3.71464 82.1494 3.75613 81.932 3.7223C81.7146 3.68848 81.5475 3.59163 81.4208 3.43023C81.2957 3.25895 81.2542 3.07033 81.288 2.85295C81.3218 2.63556 81.4187 2.46847 81.5884 2.35319C81.7581 2.23792 81.9468 2.19643 82.1642 2.23026ZM81.2765 4.22753L82.4029 4.40281L81.608 9.51133L80.4816 9.33605L81.2765 4.22753Z" fill="white"/>
|
||||||
|
<path d="M86.4641 4.96713C87.7341 5.19345 88.2512 5.99663 88.0021 7.3946L87.4424 10.5351L86.3201 10.3351L86.8622 7.29305C87.0113 6.45623 86.7011 5.97432 85.9332 5.83748C85.6575 5.78835 85.3939 5.84294 85.152 6.003C84.8772 6.17748 84.6832 6.46795 84.5719 6.86457L84.0262 9.92634L82.9039 9.72633L83.811 4.63652L84.9333 4.83652L84.828 5.42722C85.067 5.22603 85.3268 5.07933 85.594 5.00505C85.8727 4.92268 86.1589 4.91274 86.4641 4.96713Z" fill="white"/>
|
||||||
|
<path d="M91.7167 5.99079C92.343 6.12222 92.7908 6.47162 93.0559 7.05857L93.1853 6.442L94.301 6.67611L93.3071 11.413C92.9724 13.0082 92.0112 13.6444 90.4257 13.3117C89.7113 13.1618 89.2018 12.9118 88.8833 12.5793C88.5689 12.2273 88.4202 11.7669 88.4415 11.1788L89.5572 11.4129C89.5563 11.709 89.6327 11.9294 89.794 12.0859C89.9476 12.2305 90.2191 12.3488 90.6106 12.4309C91.4522 12.6075 91.9675 12.2456 92.1565 11.3452L92.3125 10.6014C91.8318 11.0421 91.2772 11.2016 90.6509 11.0702C89.9658 10.9264 89.4572 10.5745 89.1308 10.036C88.7967 9.48564 88.7206 8.82594 88.8808 8.06256C89.041 7.29919 89.3758 6.72574 89.905 6.34633C90.4245 5.96486 91.0316 5.84703 91.7167 5.99079ZM91.7039 6.92814C91.2831 6.83984 90.9293 6.91887 90.6328 7.16319C90.3384 7.39773 90.1367 7.77434 90.0258 8.30283C89.9252 8.78239 89.9353 9.17278 90.0637 9.48583C90.2113 9.85397 90.5189 10.0922 91.0082 10.1949C91.4389 10.2853 91.8024 10.2083 92.0948 9.98353C92.3815 9.73716 92.5811 9.37033 92.6879 8.86141C92.7967 8.34271 92.7635 7.9168 92.6 7.57596C92.4267 7.23307 92.1247 7.01645 91.7039 6.92814Z" fill="white"/>
|
||||||
|
<path d="M94.9432 8.98679L99.8458 10.1977L99.6204 11.1103L94.7178 9.89937L94.9432 8.98679Z" fill="white"/>
|
||||||
|
<path d="M103.918 7.0673L104.979 7.35634L104.727 8.28261L103.82 8.0356C103.675 7.99619 103.559 8.00588 103.461 8.06205C103.362 8.11821 103.302 8.22611 103.257 8.39014L103.121 8.89186L104.394 9.23872L104.15 10.136L102.876 9.78918L101.762 13.8802L100.662 13.5806L101.776 9.48962L100.667 9.18744L100.911 8.29012L102.021 8.59231L102.165 8.06163C102.281 7.6371 102.489 7.33093 102.796 7.15541C103.095 6.96761 103.474 6.94642 103.918 7.0673Z" fill="white"/>
|
||||||
|
<path d="M107.422 10.0102C108.149 10.2313 108.639 10.5789 108.873 11.0472C109.083 11.456 109.096 11.9618 108.913 12.5646L107.953 15.7218L106.939 15.4134L107.137 14.7628C106.87 14.9534 106.575 15.0624 106.257 15.112C105.898 15.1595 105.501 15.1226 105.071 14.9916C104.554 14.8345 104.193 14.5784 103.975 14.2299C103.75 13.8689 103.699 13.4875 103.824 13.0761C103.993 12.5212 104.334 12.1546 104.865 11.9919C105.354 11.8271 105.965 11.8456 106.698 12.0476L107.788 12.3477L107.846 12.1564C108.044 11.5058 107.786 11.0824 107.078 10.8671C106.771 10.774 106.518 10.7491 106.301 10.8086C106.053 10.869 105.851 11.0167 105.715 11.2576L104.66 10.8427C104.931 10.3293 105.321 10.009 105.828 9.89115C106.261 9.7721 106.79 9.81815 107.422 10.0102ZM107.549 13.1322L106.536 12.8554C105.659 12.6098 105.136 12.785 104.955 13.3782C104.903 13.5504 104.926 13.7143 105.044 13.8757C105.162 14.037 105.333 14.1622 105.573 14.2349C105.994 14.3629 106.385 14.3462 106.745 14.1943C107.108 14.0329 107.357 13.7637 107.473 13.381L107.549 13.1322Z" fill="white"/>
|
||||||
|
<path d="M112.541 11.6453C113.83 12.078 114.369 12.8286 114.133 13.9096L113.08 13.5564C113.087 13.2845 113.034 13.0662 112.914 12.9205C112.788 12.7621 112.557 12.6319 112.226 12.5206C111.941 12.4251 111.71 12.3899 111.54 12.4275C111.34 12.4555 111.22 12.5628 111.156 12.7524C111.105 12.9041 111.181 13.0876 111.408 13.2905C111.547 13.4109 111.838 13.6139 112.289 13.9026C112.794 14.2199 113.161 14.5116 113.366 14.7808C113.672 15.1578 113.753 15.5754 113.607 16.0114C113.257 17.0543 112.342 17.3275 110.873 16.8343C109.508 16.3761 108.972 15.5528 109.252 14.3707L110.305 14.7239C110.257 15.0558 110.297 15.312 110.414 15.4989C110.537 15.6667 110.77 15.819 111.131 15.9399C111.889 16.1945 112.338 16.1132 112.472 15.715C112.548 15.4875 112.467 15.2596 112.227 15.0314C112.101 14.9047 111.807 14.7112 111.352 14.432C110.818 14.1051 110.458 13.8261 110.272 13.5949C109.973 13.2306 109.894 12.8351 110.038 12.4085C110.19 11.9535 110.488 11.6632 110.95 11.544C111.409 11.4026 111.934 11.4416 112.541 11.6453Z" fill="white"/>
|
||||||
|
<path d="M117.73 11.8283L117.163 13.399L118.245 13.7896L117.925 14.6738L116.844 14.2832L115.852 17.0296C115.811 17.1424 115.799 17.2339 115.832 17.3201C115.868 17.3969 115.933 17.4523 116.046 17.4931L116.686 17.724L116.366 18.6081L115.548 18.3126C115.125 18.1598 114.855 17.9349 114.739 17.6378C114.626 17.3629 114.637 17.0374 114.78 16.6424L115.771 13.896L114.897 13.5801L115.216 12.696L116.091 13.0118L116.498 11.8832L117.73 11.8283Z" fill="white"/>
|
||||||
|
<path d="M118.459 17.7833C118.712 17.8792 118.887 18.0638 118.978 18.3334C119.058 18.5994 119.039 18.9025 118.915 19.2296C118.727 19.725 118.414 20.0982 117.991 20.3654C117.563 20.6198 117.074 20.7229 116.535 20.6784L116.769 20.0615C117.057 20.0639 117.329 19.9961 117.585 19.858C117.829 19.6941 117.995 19.511 118.08 19.2867C118.017 19.2841 117.935 19.2744 117.832 19.2353C117.627 19.1571 117.487 19.0183 117.4 18.8248C117.313 18.6313 117.315 18.4288 117.393 18.2232C117.479 17.9989 117.621 17.8497 117.82 17.7757C118.014 17.6888 118.226 17.6944 118.459 17.7833Z" fill="white"/>
|
||||||
|
<path d="M126.539 16.9714C127.79 17.5054 128.268 18.2965 127.947 19.3553L126.926 18.9195C126.954 18.6489 126.918 18.4271 126.811 18.2723C126.697 18.1044 126.478 17.9563 126.156 17.8189C125.88 17.7011 125.653 17.6476 125.48 17.6715C125.279 17.6836 125.15 17.7809 125.072 17.9649C125.009 18.112 125.069 18.301 125.28 18.5213C125.409 18.6524 125.682 18.8779 126.109 19.2016C126.588 19.5581 126.93 19.878 127.113 20.1627C127.388 20.5628 127.435 20.9855 127.255 21.4086C126.823 22.4203 125.89 22.6198 124.464 22.0113C123.14 21.4459 122.671 20.5826 123.045 19.4265L124.066 19.8624C123.991 20.1894 124.011 20.4481 124.113 20.6436C124.222 20.8207 124.443 20.9911 124.792 21.1403C125.528 21.4544 125.982 21.4091 126.147 21.0228C126.242 20.8021 126.178 20.5684 125.957 20.3219C125.842 20.1855 125.564 19.9692 125.133 19.6547C124.627 19.2864 124.29 18.9797 124.123 18.7344C123.854 18.3474 123.807 17.947 123.984 17.5331C124.172 17.0916 124.492 16.8259 124.962 16.7439C125.431 16.6395 125.951 16.7202 126.539 16.9714Z" fill="white"/>
|
||||||
|
<path d="M131.615 19.2266C132.387 19.5823 132.86 20.1087 133.026 20.8238C133.18 21.4676 133.066 22.2185 132.676 23.0632L129.162 21.4435C128.997 21.8961 128.96 22.2866 129.055 22.6057C129.151 22.9248 129.387 23.1768 129.759 23.3484C130.077 23.4949 130.365 23.5394 130.632 23.4862C130.84 23.4393 131.065 23.3113 131.313 23.1066L132.348 23.5837C132.039 23.9694 131.649 24.2413 131.188 24.3813C130.607 24.5429 130.006 24.486 129.379 24.1972C128.68 23.875 128.226 23.4017 128.014 22.7865C127.783 22.1406 127.846 21.4316 128.206 20.6506C128.528 19.9513 128.996 19.4621 129.631 19.1824C130.252 18.8852 130.915 18.9043 131.615 19.2266ZM131.253 20.0838C130.907 19.9247 130.602 19.8942 130.31 20.0019C130.032 20.1048 129.775 20.3277 129.54 20.6708L131.956 21.784C132.216 20.9793 131.979 20.4186 131.253 20.0838Z" fill="white"/>
|
||||||
|
<path d="M136.906 21.7783C137.504 22.0794 137.91 22.4515 138.133 22.8993C138.355 23.3694 138.372 23.9151 138.169 24.5407L137.16 24.0329C137.245 23.7066 137.228 23.4293 137.121 23.1965C137.006 22.9592 136.791 22.7619 136.488 22.6091C136.112 22.4204 135.75 22.4061 135.392 22.5841C135.038 22.7532 134.733 23.0924 134.482 23.5926C134.226 24.1019 134.122 24.5533 134.192 24.947C134.25 25.3228 134.472 25.614 134.866 25.8118C135.544 26.1533 136.09 26.0025 136.508 25.373L137.517 25.8807C137.096 26.4522 136.621 26.7954 136.102 26.9149C135.596 27.0299 135.037 26.9391 134.439 26.6381C133.724 26.2786 133.287 25.7677 133.128 25.1054C132.968 24.4655 133.073 23.7905 133.432 23.0758C133.783 22.379 134.258 21.9016 134.853 21.6526C135.498 21.3724 136.182 21.4143 136.906 21.7783Z" fill="white"/>
|
||||||
|
<path d="M139.816 23.4216L140.819 23.9638L139.321 26.7347C139.121 27.1041 139.048 27.406 139.112 27.6676C139.18 27.9203 139.378 28.1415 139.73 28.3318C139.95 28.4507 140.214 28.4681 140.516 28.3928C140.823 28.3086 141.11 28.1344 141.374 27.8565L142.877 25.0769L143.88 25.6192L141.421 30.1668L140.418 29.6246L140.737 29.0352C140.093 29.3009 139.489 29.2816 138.926 28.9771C137.836 28.3873 137.623 27.4766 138.285 26.254L139.816 23.4216Z" fill="white"/>
|
||||||
|
<path d="M147.139 27.311C147.356 27.4353 147.527 27.5795 147.639 27.7471L147.071 28.736C146.886 28.5373 146.692 28.3918 146.484 28.2724C146.224 28.1232 145.935 28.0842 145.607 28.173C145.23 28.2679 144.943 28.5069 144.724 28.8885L143.361 31.2653L142.381 30.7031L144.953 26.2184L145.933 26.7806L145.565 27.4225C145.816 27.2667 146.054 27.1728 146.289 27.1459C146.583 27.0955 146.862 27.1518 147.139 27.311Z" fill="white"/>
|
||||||
|
<path d="M150.169 29.1326C150.895 29.5742 151.305 30.1511 151.388 30.8804C151.469 31.5377 151.269 32.2706 150.786 33.0653L147.479 31.055C147.264 31.486 147.183 31.8697 147.241 32.1976C147.299 32.5255 147.505 32.8028 147.855 33.0158C148.154 33.1976 148.435 33.2747 148.706 33.2522C148.919 33.2294 149.156 33.1279 149.426 32.9528L150.401 33.545C150.049 33.8928 149.631 34.1185 149.157 34.2049C148.561 34.2992 147.97 34.1741 147.381 33.8156C146.723 33.4157 146.326 32.8937 146.186 32.2584C146.03 31.5903 146.173 30.8931 146.62 30.1583C147.02 29.5003 147.54 29.0677 148.203 28.8623C148.855 28.638 149.511 28.7327 150.169 29.1326ZM149.711 29.9429C149.387 29.7455 149.087 29.6803 148.785 29.754C148.496 29.8244 148.215 30.0166 147.943 30.3306L150.216 31.7123C150.566 30.9426 150.395 30.3585 149.711 29.9429Z" fill="white"/>
|
||||||
|
<path d="M157.077 31.1633L158.021 31.8024L156.44 34.1376C157.107 33.901 157.695 33.9607 158.192 34.2971C158.804 34.712 159.133 35.2607 159.187 35.949C159.229 36.5817 159.042 37.2155 158.616 37.8448C158.173 38.4989 157.643 38.925 157.031 39.1148C156.364 39.3153 155.716 39.2024 155.086 38.7764C154.523 38.3951 154.222 37.9131 154.182 37.3304L153.873 37.7858L152.995 37.1915L157.077 31.1633ZM157.452 34.9075C157.146 34.7001 156.813 34.6561 156.446 34.77C156.043 34.8836 155.689 35.175 155.381 35.6305L155.336 35.6967C155.056 36.1107 154.903 36.5146 154.906 36.9029C154.908 37.3273 155.089 37.6669 155.461 37.9192C155.875 38.1996 156.283 38.258 156.683 38.0944C157.009 37.9525 157.333 37.6525 157.647 37.1888C157.961 36.7251 158.105 36.3157 158.102 35.9634C158.094 35.5473 157.875 35.1935 157.452 34.9075Z" fill="white"/>
|
||||||
|
<path d="M162.963 37.6298C163.166 37.7756 163.321 37.9363 163.415 38.1144L162.75 39.0406C162.586 38.824 162.408 38.6597 162.213 38.5198C161.969 38.3449 161.686 38.2769 161.351 38.3319C160.966 38.388 160.656 38.5966 160.4 38.9541L158.802 41.1802L157.884 40.5214L160.899 36.321L161.817 36.9798L161.385 37.581C161.65 37.4514 161.897 37.3822 162.133 37.3792C162.431 37.359 162.703 37.4433 162.963 37.6298Z" fill="white"/>
|
||||||
|
<path d="M165.947 39.8617C166.57 40.3315 166.922 40.9105 166.992 41.6147C167.06 42.3049 166.86 42.9683 166.378 43.6069C165.903 44.2376 165.32 44.6119 164.651 44.734C163.955 44.86 163.287 44.6821 162.665 44.2123C162.034 43.7365 161.688 43.1495 161.618 42.4453C161.544 41.7631 161.751 41.1057 162.227 40.4751C162.709 39.8364 163.284 39.4561 163.975 39.3381C164.663 39.206 165.316 39.3859 165.947 39.8617ZM165.387 40.6041C165.004 40.315 164.608 40.2419 164.172 40.3886C163.803 40.5116 163.462 40.7806 163.161 41.1797C162.86 41.5789 162.701 41.9724 162.684 42.3604C162.669 42.8123 162.842 43.1808 163.225 43.4699C163.6 43.753 164.01 43.8242 164.44 43.6854C164.815 43.5545 165.157 43.2994 165.452 42.9083C165.754 42.5091 165.911 42.1016 165.928 41.7136C165.949 41.2537 165.762 40.8872 165.387 40.6041Z" fill="white"/>
|
||||||
|
<path d="M168.374 41.8756L169.349 42.6737L167.727 46.2822L170.935 43.9721L171.748 44.6372L170.118 48.2393L173.334 45.9356L174.309 46.7336L169.688 49.6323L168.868 48.961L170.465 45.3834L167.266 47.6499L166.446 46.9785L168.374 41.8756Z" fill="white"/>
|
||||||
|
<path d="M176.414 48.3887C177.438 49.2845 177.646 50.1848 177.012 51.0915L176.177 50.3604C176.288 50.1121 176.323 49.8901 176.268 49.7095C176.213 49.5147 176.05 49.3058 175.787 49.0753C175.561 48.8777 175.362 48.7563 175.19 48.7252C174.995 48.6744 174.842 48.727 174.711 48.8775C174.605 48.9979 174.604 49.1964 174.736 49.4711C174.818 49.6357 175.008 49.9349 175.313 50.3753C175.658 50.8626 175.883 51.2728 175.969 51.6002C176.106 52.0659 176.02 52.4826 175.717 52.8288C174.993 53.6564 174.044 53.5565 172.877 52.5355C171.794 51.587 171.616 50.6209 172.331 49.638L173.166 50.3691C172.993 50.6569 172.932 50.909 172.968 51.1264C173.017 51.3286 173.174 51.5591 173.46 51.8094C174.062 52.3364 174.508 52.4343 174.784 52.1183C174.942 51.9377 174.955 51.696 174.821 51.393C174.753 51.2274 174.557 50.9358 174.245 50.503C173.878 49.9958 173.653 49.5997 173.57 49.3147C173.434 48.8631 173.514 48.468 173.811 48.1294C174.127 47.7682 174.513 47.615 174.986 47.6828C175.464 47.729 175.933 47.9672 176.414 48.3887Z" fill="white"/>
|
||||||
|
<path d="M180.812 49.6683C180.974 49.8172 181.067 49.9974 181.082 50.2019C181.091 50.3998 181.028 50.5864 180.879 50.7483C180.73 50.9102 180.542 50.9959 180.337 50.9974C180.132 50.9989 179.952 50.9286 179.79 50.7796C179.628 50.6307 179.543 50.4573 179.528 50.2527C179.519 50.0408 179.589 49.8609 179.738 49.699C179.887 49.5371 180.06 49.452 180.266 49.4505C180.471 49.449 180.651 49.5193 180.812 49.6683ZM178.965 50.8353L179.804 51.6071L176.304 55.4122L175.464 54.6404L178.965 50.8353Z" fill="white"/>
|
||||||
|
<path d="M182.863 54.3209C183.795 55.2129 183.78 56.168 182.799 57.1938L180.593 59.4982L179.769 58.7099L181.906 56.4778C182.494 55.8637 182.502 55.2906 181.939 54.7513C181.737 54.5577 181.487 54.457 181.197 54.4563C180.871 54.4493 180.549 54.5836 180.237 54.8521L178.086 57.0988L177.262 56.3105L180.837 52.5757L181.661 53.364L181.246 53.7974C181.557 53.7624 181.854 53.7842 182.118 53.8703C182.395 53.9562 182.639 54.1065 182.863 54.3209Z" fill="white"/>
|
||||||
|
<path d="M186.671 58.0899C187.119 58.5469 187.297 59.0861 187.192 59.7215L187.642 59.2804L188.44 60.0944L184.984 63.4829C183.82 64.6241 182.668 64.6199 181.533 63.4632C181.022 62.9419 180.737 62.4512 180.657 61.9978C180.591 61.5305 180.723 61.065 181.067 60.5876L181.865 61.4016C181.7 61.6474 181.641 61.8731 181.688 62.0928C181.736 62.2984 181.896 62.5474 182.176 62.833C182.778 63.4471 183.408 63.4321 184.065 62.788L184.607 62.2559C183.963 62.3556 183.413 62.1805 182.965 61.7235C182.475 61.2237 182.247 60.6487 182.274 60.0196C182.302 59.3764 182.605 58.7853 183.162 58.2393C183.719 57.6932 184.316 57.402 184.966 57.3801C185.61 57.3511 186.181 57.5901 186.671 58.0899ZM186.14 58.8625C185.839 58.5555 185.501 58.4249 185.118 58.4636C184.743 58.4952 184.366 58.6966 183.981 59.0747C183.631 59.4177 183.423 59.748 183.356 60.0797C183.274 60.4679 183.398 60.8368 183.748 61.1938C184.056 61.508 184.401 61.6457 184.769 61.6211C185.144 61.5752 185.514 61.3809 185.885 61.0168C186.264 60.6458 186.472 60.273 186.526 59.8988C186.572 59.5174 186.441 59.1696 186.14 58.8625Z" fill="white"/>
|
||||||
|
<path d="M191.218 63.063L192.048 64.0108L189.854 67.3026L193.399 65.5529L194.091 66.3427L191.89 69.627L195.442 67.8848L196.272 68.8326L191.236 70.9302L190.538 70.1329L192.703 66.8674L189.174 68.5758L188.476 67.7784L191.218 63.063Z" fill="white"/>
|
||||||
|
<path d="M198.362 71.168C198.855 71.7721 199.06 72.4182 198.961 73.1189C198.863 73.8055 198.512 74.4026 197.892 74.9086C197.28 75.4083 196.625 75.6336 195.947 75.5936C195.24 75.5508 194.634 75.2195 194.141 74.6154C193.641 74.0035 193.444 73.3511 193.543 72.6504C193.633 71.9701 193.991 71.3808 194.603 70.8811C195.222 70.3751 195.871 70.1421 196.57 70.1912C197.27 70.2263 197.862 70.5561 198.362 71.168ZM197.642 71.7563C197.338 71.3845 196.971 71.2195 196.512 71.2585C196.125 71.2906 195.73 71.471 195.343 71.7873C194.956 72.1036 194.708 72.4481 194.599 72.8209C194.477 73.2563 194.557 73.6553 194.861 74.0271C195.158 74.3911 195.54 74.5575 195.991 74.5249C196.385 74.4865 196.779 74.3201 197.158 74.0102C197.546 73.6939 197.795 73.3353 197.904 72.9625C198.034 72.5207 197.939 72.1203 197.642 71.7563Z" fill="white"/>
|
||||||
|
<path d="M202.144 75.9451C202.296 76.1433 202.398 76.3421 202.437 76.5397L201.533 77.2343C201.438 76.9794 201.315 76.7708 201.169 76.5805C200.986 76.3426 200.735 76.1955 200.398 76.1514C200.013 76.0939 199.657 76.2041 199.308 76.4721L197.135 78.1416L196.447 77.2455L200.546 74.0956L201.235 74.9916L200.648 75.4425C200.939 75.3951 201.195 75.4001 201.422 75.4654C201.713 75.5321 201.949 75.6913 202.144 75.9451Z" fill="white"/>
|
||||||
|
<path d="M204.56 75.8771L205.24 76.7922L199.396 81.1335L198.716 80.2183L204.56 75.8771Z" fill="white"/>
|
||||||
|
<path d="M208.167 80.8876L208.827 81.817L202.892 86.0329L202.278 85.1687L202.727 84.8502C202.143 84.8231 201.655 84.5324 201.261 83.978C200.815 83.3503 200.688 82.7048 200.879 82.0415C201.055 81.4258 201.469 80.8864 202.113 80.4289C202.732 79.9887 203.356 79.7788 203.995 79.8153C204.679 79.845 205.241 80.1697 205.669 80.7729C206.017 81.2621 206.084 81.84 205.868 82.5207L208.167 80.8876ZM205.075 81.5258C204.774 81.1019 204.421 80.8987 204.005 80.9C203.647 80.8967 203.247 81.0584 202.79 81.3827C202.334 81.707 202.035 82.0294 201.907 82.3662C201.746 82.7622 201.814 83.168 202.109 83.5838C202.364 83.9425 202.714 84.1236 203.138 84.1166C203.52 84.1025 203.926 83.9489 204.334 83.6594L204.399 83.6131C204.848 83.2945 205.125 82.9256 205.236 82.5283C205.341 82.1589 205.284 81.8193 205.075 81.5258Z" fill="white"/>
|
||||||
|
<path d="M207.531 83.6454L208.221 84.6994L205.59 87.6542L209.345 86.4142L209.92 87.2925L207.284 90.239L211.044 89.0074L211.734 90.0614L206.456 91.4388L205.875 90.5521L208.473 87.6192L204.741 88.8206L204.16 87.9339L207.531 83.6454Z" fill="white"/>
|
||||||
|
<path d="M214.29 90.1779C214.407 90.3648 214.447 90.5631 214.408 90.7644C214.362 90.9572 214.252 91.1201 214.065 91.2362C213.878 91.3523 213.674 91.3845 213.476 91.331C213.278 91.2774 213.124 91.1614 213.008 90.9745C212.892 90.7876 212.856 90.5978 212.896 90.3965C212.944 90.1899 213.06 90.0355 213.247 89.9194C213.434 89.8034 213.624 89.7679 213.822 89.8214C214.02 89.875 214.174 89.991 214.29 90.1779ZM212.197 90.8068L212.799 91.7753L208.407 94.5026L207.805 93.5342L212.197 90.8068Z" fill="white"/>
|
||||||
|
<path d="M217.228 95.15L217.801 96.1355L211.507 99.7947L210.975 98.8783L211.45 98.6019C210.872 98.5219 210.411 98.1879 210.07 97.6001C209.683 96.9344 209.614 96.28 209.865 95.6368C210.096 95.0397 210.558 94.5401 211.241 94.143C211.898 93.761 212.538 93.6086 213.171 93.7031C213.849 93.7948 214.379 94.1691 214.751 94.8089C215.052 95.3276 215.067 95.9092 214.79 96.5674L217.228 95.15ZM214.091 95.5047C213.83 95.0552 213.497 94.8207 213.082 94.7841C212.726 94.7484 212.313 94.873 211.829 95.1545C211.345 95.436 211.018 95.7299 210.859 96.0536C210.664 96.4334 210.694 96.8437 210.95 97.2846C211.171 97.665 211.503 97.8771 211.926 97.9087C212.308 97.9294 212.727 97.8133 213.159 97.562L213.228 97.5218C213.704 97.2454 214.014 96.9032 214.16 96.5176C214.298 96.1593 214.272 95.8159 214.091 95.5047Z" fill="white"/>
|
||||||
|
<path d="M217.759 100.153C218.164 100.9 218.228 101.605 217.933 102.277C217.671 102.886 217.129 103.418 216.312 103.862L214.467 100.46C214.064 100.723 213.801 101.014 213.686 101.327C213.571 101.639 213.609 101.983 213.805 102.343C213.972 102.651 214.175 102.859 214.421 102.976C214.616 103.063 214.872 103.095 215.194 103.08L215.737 104.082C215.258 104.205 214.783 104.19 214.331 104.026C213.768 103.807 213.321 103.402 212.992 102.795C212.625 102.118 212.545 101.468 212.744 100.848C212.946 100.192 213.42 99.662 214.176 99.2521C214.853 98.885 215.521 98.7733 216.197 98.9298C216.873 99.064 217.392 99.4763 217.759 100.153ZM216.956 100.623C216.775 100.289 216.549 100.082 216.25 99.993C215.966 99.9085 215.626 99.9332 215.233 100.067L216.501 102.405C217.191 101.917 217.337 101.326 216.956 100.623Z" fill="white"/>
|
||||||
|
<path d="M220.574 105.827L221.114 106.965L218.105 109.534L221.993 108.817L222.444 109.766L219.43 112.325L223.323 111.618L223.863 112.756L218.446 113.401L217.992 112.444L220.965 109.892L217.104 110.574L216.65 109.616L220.574 105.827Z" fill="white"/>
|
||||||
|
<path d="M226.391 113.267C226.479 113.469 226.491 113.671 226.423 113.865C226.351 114.049 226.218 114.194 226.016 114.283C225.815 114.371 225.609 114.374 225.42 114.292C225.232 114.211 225.096 114.074 225.007 113.873C224.919 113.671 224.911 113.478 224.979 113.285C225.057 113.087 225.194 112.951 225.395 112.863C225.597 112.774 225.79 112.766 225.978 112.848C226.166 112.929 226.303 113.066 226.391 113.267ZM224.229 113.591L224.686 114.635L219.95 116.707L219.493 115.663L224.229 113.591Z" fill="white"/>
|
||||||
|
<path d="M227.403 116.772L225.862 117.416L226.306 118.477L225.438 118.84L224.995 117.779L222.301 118.905C222.19 118.951 222.115 119.004 222.073 119.087C222.041 119.165 222.044 119.25 222.09 119.361L222.353 119.989L221.485 120.351L221.15 119.548C220.976 119.133 220.96 118.782 221.1 118.496C221.226 118.227 221.474 118.015 221.861 117.853L224.555 116.727L224.197 115.869L225.064 115.506L225.422 116.364L226.53 115.902L227.403 116.772Z" fill="white"/>
|
||||||
|
<path d="M228.594 118.523L229.009 119.585L226.4 120.604C226.74 120.675 227.023 120.822 227.255 121.032C227.467 121.218 227.628 121.466 227.748 121.773C227.977 122.36 227.981 122.864 227.749 123.287C227.528 123.684 227.098 124.013 226.456 124.264L223.475 125.428L223.06 124.366L225.855 123.275C226.265 123.115 226.549 122.907 226.701 122.665C226.861 122.388 226.867 122.074 226.726 121.711C226.595 121.376 226.362 121.166 226.029 121.081C225.692 120.988 225.329 121.022 224.919 121.182L222.227 122.233L221.813 121.171L228.594 118.523Z" fill="white"/>
|
||||||
|
<path d="M231.75 127.363L232.116 128.474L229.286 129.407L230.42 132.845L233.25 131.912L233.616 133.023L226.835 135.259L226.469 134.148L229.47 133.158L228.336 129.721L225.335 130.71L224.969 129.599L231.75 127.363Z" fill="white"/>
|
||||||
|
<path d="M234.392 135.069C234.455 135.279 234.442 135.482 234.351 135.665C234.256 135.839 234.107 135.967 233.896 136.03C233.685 136.093 233.48 136.07 233.303 135.966C233.126 135.863 233.008 135.71 232.945 135.499C232.882 135.288 232.898 135.096 232.989 134.912C233.09 134.726 233.243 134.607 233.454 134.544C233.665 134.482 233.857 134.497 234.034 134.601C234.211 134.705 234.329 134.858 234.392 135.069ZM232.207 135.124L232.532 136.217L227.577 137.691L227.252 136.598L232.207 135.124Z" fill="white"/>
|
||||||
|
<path d="M235.364 138.992L235.66 140.052L234.735 140.309L234.483 139.404C234.442 139.259 234.374 139.164 234.276 139.109C234.177 139.053 234.054 139.056 233.89 139.102L233.389 139.242L233.743 140.513L232.847 140.763L232.493 139.491L228.409 140.629L228.103 139.531L232.187 138.393L231.878 137.285L232.774 137.036L233.083 138.143L233.613 137.996C234.037 137.878 234.406 137.899 234.714 138.073C235.029 138.234 235.241 138.549 235.364 138.992Z" fill="white"/>
|
||||||
|
<path d="M234.639 143.476C234.826 144.213 234.782 144.812 234.501 145.254C234.26 145.645 233.834 145.918 233.223 146.073L230.024 146.882L229.764 145.855L230.423 145.688C230.122 145.558 229.877 145.362 229.67 145.115C229.443 144.832 229.27 144.474 229.16 144.038C229.027 143.514 229.06 143.073 229.246 142.706C229.439 142.327 229.739 142.086 230.155 141.98C230.718 141.838 231.208 141.941 231.621 142.311C232.015 142.644 232.315 143.177 232.521 143.909L232.827 144.997L233.021 144.948C233.68 144.781 233.909 144.342 233.728 143.624C233.649 143.314 233.54 143.084 233.377 142.929C233.197 142.748 232.966 142.651 232.689 142.659L232.499 141.542C233.079 141.509 233.555 141.677 233.917 142.05C234.243 142.359 234.477 142.836 234.639 143.476ZM232.032 145.198L231.746 144.188C231.503 143.31 231.082 142.953 230.481 143.105C230.307 143.149 230.179 143.254 230.101 143.438C230.024 143.623 230.006 143.834 230.067 144.076C230.175 144.503 230.392 144.83 230.708 145.059C231.033 145.286 231.392 145.36 231.78 145.262L232.032 145.198Z" fill="white"/>
|
||||||
|
<path d="M235.884 148.709C236.178 150.037 235.813 150.886 234.765 151.241L234.525 150.158C234.762 150.023 234.921 149.865 234.984 149.687C235.055 149.497 235.047 149.233 234.971 148.891C234.906 148.598 234.817 148.382 234.697 148.255C234.57 148.099 234.416 148.051 234.221 148.095C234.065 148.129 233.947 148.289 233.89 148.588C233.859 148.769 233.835 149.123 233.82 149.659C233.809 150.255 233.748 150.719 233.623 151.034C233.458 151.49 233.143 151.776 232.693 151.875C231.62 152.113 230.914 151.471 230.578 149.958C230.266 148.552 230.695 147.668 231.852 147.299L232.093 148.382C231.784 148.512 231.585 148.679 231.485 148.876C231.405 149.068 231.395 149.346 231.477 149.717C231.651 150.498 231.952 150.841 232.362 150.75C232.596 150.698 232.749 150.511 232.821 150.187C232.864 150.014 232.879 149.663 232.883 149.129C232.888 148.503 232.941 148.051 233.043 147.772C233.201 147.327 233.499 147.056 233.938 146.959C234.407 146.855 234.809 146.96 235.15 147.295C235.508 147.615 235.745 148.084 235.884 148.709Z" fill="white"/>
|
||||||
|
<path d="M238.4 153.285L236.76 153.601L236.978 154.731L236.055 154.909L235.837 153.779L232.97 154.333C232.852 154.355 232.768 154.392 232.71 154.464C232.663 154.535 232.649 154.619 232.671 154.737L232.8 155.404L231.877 155.582L231.712 154.728C231.627 154.286 231.682 153.939 231.878 153.688C232.056 153.45 232.342 153.293 232.754 153.213L235.621 152.66L235.445 151.747L236.368 151.569L236.544 152.482L237.723 152.255L238.4 153.285Z" fill="white"/>
|
||||||
|
<path d="M239.557 158.032L239.745 159.288L234.28 162.089L234.285 162.119L240.331 163.194L240.519 164.45L233.082 162.997L232.873 161.603L239.557 158.032Z" fill="white"/>
|
||||||
|
<path d="M240.625 165.362L240.954 168.304C241.145 170.013 240.517 170.959 239.066 171.121C237.605 171.285 236.773 170.503 236.579 168.773L236.382 167.014L233.659 167.319L233.529 166.156L240.625 165.362ZM239.761 166.636L237.376 166.903L237.565 168.593C237.623 169.109 237.765 169.476 237.97 169.694C238.186 169.912 238.507 169.997 238.934 169.949C239.362 169.901 239.645 169.738 239.798 169.48C239.96 169.22 240.007 168.833 239.95 168.326L239.761 166.636Z" fill="white"/>
|
||||||
|
<path d="M241.341 172.036L241.429 173.203L236.558 177.109L236.561 177.149L241.696 176.763L241.785 177.94L234.665 178.475L234.58 177.338L239.517 173.387L239.514 173.347L234.309 173.738L234.221 172.571L241.341 172.036Z" fill="white"/>
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M9.3725 9.75944C9.3725 10.0346 9.32634 10.2987 9.24045 10.5447L11.4706 11.6121C12.3547 10.6218 14 11.251 14 12.5761C14 13.8515 12.4457 14.5165 11.5273 13.5985C11.227 13.2982 11.0658 12.8758 11.1101 12.4306L8.7923 11.3211C8.44873 11.719 7.97955 12.0006 7.44844 12.1064L7.45954 14.0139C8.66375 14.3557 9.07213 15.8783 8.17646 16.7739C7.13702 17.8133 5.35319 17.0731 5.35319 15.6048C5.35319 14.8535 5.85801 14.2061 6.56559 14.011L6.55449 12.1145C5.99532 12.014 5.50043 11.719 5.14635 11.2978L3.38941 12.3254C3.66929 13.7942 1.86971 14.76 0.80337 13.6932C-0.16245 12.7274 0.53518 11.0816 1.88606 11.0816C2.30733 11.0816 2.69588 11.2551 2.97108 11.5344L4.70932 10.5178C4.50423 9.90253 4.55857 9.22831 4.8548 8.65862L3.3637 7.57892C2.08527 8.76379 -7.61807e-08 7.85293 0 6.11012C7.77412e-08 4.33161 2.16005 3.4354 3.41919 4.69389C3.97719 5.25186 4.16064 6.09259 3.86909 6.8387L5.41048 7.95461C6.13676 7.32303 7.17849 7.18516 8.04678 7.6175L9.0465 6.30293C7.95155 5.16422 8.76254 3.25952 10.3425 3.25952C11.9387 3.25952 12.7433 5.19807 11.6133 6.32806C11.1476 6.79371 10.4552 6.97424 9.80952 6.77443L8.75782 8.15793C9.13936 8.58151 9.3725 9.14306 9.3725 9.75944Z" fill="white"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 34 KiB |
@@ -0,0 +1,6 @@
|
|||||||
|
<svg width="48" height="48" viewBox="0 0 48 48" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<circle cx="24" cy="24" r="24" fill="#ADFF5B"/>
|
||||||
|
<path d="M14.2979 31.7325C14.2979 32.8204 15.1796 33.7021 16.2675 33.7021H32.0243C33.1122 33.7021 33.9939 32.8204 33.9939 31.7325C33.9939 30.6447 33.1122 29.7629 32.0243 29.7629H16.2675C15.1796 29.7629 14.2979 30.6447 14.2979 31.7325Z" fill="black"/>
|
||||||
|
<path d="M14.2979 24.5109C14.2979 25.5987 15.1796 26.4805 16.2675 26.4805H32.0243C33.1122 26.4805 33.9939 25.5987 33.9939 24.5109C33.9939 23.423 33.1122 22.5413 32.0243 22.5413H16.2675C15.1796 22.5413 14.2979 23.423 14.2979 24.5109Z" fill="black"/>
|
||||||
|
<path d="M16.2675 15.3191C15.1796 15.3191 14.2979 16.2008 14.2979 17.2887C14.2979 18.3766 15.1796 19.2583 16.2675 19.2583H32.0243C33.1122 19.2583 33.9939 18.3766 33.9939 17.2887C33.9939 16.2008 33.1122 15.3191 32.0243 15.3191H16.2675Z" fill="black"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 902 B |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 5.5 KiB |
|
Before Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 9.5 KiB |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg width="14" height="15" viewBox="0 0 14 15" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path fill-rule="evenodd" clip-rule="evenodd" d="M6.48608 5.24282C6.7522 5.24282 7.00759 5.28785 7.24546 5.37164L8.27773 3.19599C7.32004 2.33359 7.92855 0.728516 9.21 0.728516C10.4434 0.728516 11.0864 2.24475 10.1988 3.14069C9.90835 3.43367 9.49985 3.59098 9.0693 3.54767L7.99634 5.80882C8.38112 6.14398 8.65345 6.60168 8.75572 7.11981L10.6005 7.10898C10.931 5.93422 12.4035 5.53584 13.2696 6.40959C14.2747 7.42361 13.5589 9.1638 12.139 9.1638C11.4124 9.1638 10.7864 8.67133 10.5977 7.98106L8.76361 7.99189C8.66643 8.53738 8.38111 9.02016 7.97373 9.36558L8.96759 11.0795C10.388 10.8065 11.3219 12.5621 10.2903 13.6023C9.35632 14.5445 7.76467 13.864 7.76467 12.5461C7.76467 12.1352 7.93248 11.7561 8.20254 11.4876L7.21942 9.79193C6.62446 9.99199 5.97244 9.93898 5.42151 9.65L4.37736 11.1046C5.52321 12.3518 4.64235 14.386 2.95693 14.386C1.23698 14.386 0.370281 12.2788 1.58733 11.0505C2.12692 10.5061 2.93998 10.3272 3.66151 10.6116L4.74068 9.10791C4.12989 8.3994 3.99656 7.38316 4.41467 6.5361L3.14339 5.56084C2.04218 6.62901 0.200195 5.83785 0.200195 4.29659C0.200195 2.73935 2.07491 1.95445 3.16769 3.05685C3.618 3.51114 3.79259 4.18658 3.59936 4.81648L4.9373 5.84246C5.34693 5.47025 5.89 5.24282 6.48608 5.24282Z" fill="black"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 5.7 KiB |
@@ -0,0 +1,10 @@
|
|||||||
|
<svg width="14" height="15" viewBox="0 0 14 15" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_7_8207)">
|
||||||
|
<path d="M12.8945 0C13.2836 0 13.5975 0.304873 13.5977 0.682617V10.6992C13.5977 11.0771 13.2837 11.3818 12.8945 11.3818H2.34473C1.82894 11.3818 1.40625 11.7921 1.40625 12.293C1.40632 12.7937 1.82899 13.2031 2.34473 13.2031H12.8945C13.2837 13.2031 13.5977 13.5088 13.5977 13.8867C13.5975 14.2644 13.2836 14.5693 12.8945 14.5693H2.34473C1.05062 14.5693 7.38806e-05 13.5495 0 12.293V2.27637C4.67804e-05 1.0198 1.0506 0 2.34473 0H12.8945ZM2.34473 1.36621C1.82897 1.36621 1.4063 1.77559 1.40625 2.27637V10.208C1.69228 10.0851 2.01181 10.0166 2.34473 10.0166H12.1914V1.36621H2.34473ZM6.30176 8.16797C6.56432 7.91302 7.03799 7.91306 7.2959 8.16797C7.56783 8.43657 7.57247 8.86419 7.2959 9.13281C7.01925 9.40143 6.57372 9.39688 6.30176 9.13281C6.02544 8.86422 6.02536 8.43196 6.30176 8.16797ZM5.44434 2.52734C5.9226 2.13582 6.5551 1.97635 7.17871 2.08105C8.0321 2.22675 8.73081 2.90477 8.88086 3.7334C9.03559 4.603 8.60903 5.47307 7.82129 5.89648C7.62917 5.99665 7.50691 6.23283 7.50684 6.49219V6.60156C7.50684 6.97945 7.19289 7.28417 6.80371 7.28418C6.41453 7.28418 6.10059 6.97945 6.10059 6.60156V6.49219C6.10067 5.7274 6.49928 5.03967 7.1416 4.69824C7.34312 4.58886 7.55877 4.33373 7.49316 3.96973C7.44613 3.70126 7.2111 3.47422 6.93457 3.42871C6.719 3.38785 6.51266 3.44225 6.34863 3.57422C6.18467 3.70625 6.0957 3.89742 6.0957 4.09766C6.09568 4.47544 5.78162 4.78013 5.39258 4.78027C5.00341 4.78027 4.68948 4.47553 4.68945 4.09766C4.68945 3.48757 4.96606 2.91889 5.44434 2.52734Z" fill="black"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_7_8207">
|
||||||
|
<rect width="13.598" height="14.5693" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.7 KiB |
@@ -0,0 +1,3 @@
|
|||||||
|
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M2.76172 10.623C3.58173 10.623 4.24882 11.2904 4.24902 12.1104V12.9609C4.24884 13.3134 3.96473 13.5975 3.6123 13.5977H0.637695C0.285111 13.5977 0.000183976 13.3135 0 12.9609V12.1104C0.000199964 11.2904 0.667298 10.623 1.4873 10.623H2.76172ZM12.1104 10.623C12.9304 10.623 13.5975 11.2904 13.5977 12.1104V12.9609C13.5975 13.3134 13.3134 13.5975 12.9609 13.5977H9.98633C9.63374 13.5977 9.34882 13.3135 9.34863 12.9609V12.1104C9.34883 11.2904 10.0159 10.623 10.8359 10.623H12.1104ZM6.79883 7.64844C7.15148 7.64844 7.43644 7.9335 7.43652 8.28613V10.1475L8.52441 11.2354C8.77494 11.486 8.77478 11.885 8.52441 12.1357C8.2737 12.3865 7.87376 12.3865 7.62305 12.1357L6.79883 11.3115L5.97461 12.1357C5.7239 12.3865 5.32493 12.3865 5.07422 12.1357C4.82351 11.885 4.82351 11.4861 5.07422 11.2354L6.16113 10.1475V8.28613C6.16121 7.93356 6.44626 7.64853 6.79883 7.64844ZM1.4873 11.8984C1.36845 11.8984 1.27461 11.9958 1.27441 12.1104V12.3232H2.97461V12.1104C2.97441 11.9958 2.88057 11.8984 2.76172 11.8984H1.4873ZM10.8359 11.8984C10.7171 11.8984 10.6232 11.9958 10.623 12.1104V12.3232H12.3232V12.1104C12.323 11.9958 12.2292 11.8984 12.1104 11.8984H10.8359ZM2.125 6.58691C3.06392 6.58708 3.82414 7.34719 3.82422 8.28613C3.82422 9.22514 3.06397 9.98616 2.125 9.98633C1.18589 9.98633 0.424805 9.22524 0.424805 8.28613C0.424885 7.34709 1.18594 6.58691 2.125 6.58691ZM11.4736 6.58691C12.4125 6.58709 13.1728 7.3472 13.1729 8.28613C13.1729 9.22514 12.4126 9.98616 11.4736 9.98633C10.5345 9.98633 9.77344 9.22524 9.77344 8.28613C9.77352 7.34709 10.5346 6.58691 11.4736 6.58691ZM2.125 7.86133C1.89133 7.86133 1.70028 8.05249 1.7002 8.28613C1.7002 8.51985 1.89128 8.71094 2.125 8.71094C2.35857 8.71077 2.5498 8.51974 2.5498 8.28613C2.54972 8.05259 2.35852 7.8615 2.125 7.86133ZM11.4736 7.86133C11.24 7.86133 11.0489 8.05249 11.0488 8.28613C11.0488 8.51985 11.2399 8.71094 11.4736 8.71094C11.7072 8.71076 11.8984 8.51974 11.8984 8.28613C11.8984 8.05259 11.7072 7.8615 11.4736 7.86133ZM8.07422 3.82422C8.8941 3.82444 9.56142 4.49162 9.56152 5.31152V6.37402C9.56152 6.72668 9.27646 7.01164 8.92383 7.01172H4.67383C4.32135 7.01146 4.03711 6.72656 4.03711 6.37402V5.31152C4.03722 4.49148 4.70435 3.82422 5.52441 3.82422H8.07422ZM5.52441 5.09961C5.4055 5.09961 5.31163 5.19688 5.31152 5.31152V5.73633H8.28613V5.31152C8.28603 5.19701 8.19294 5.09983 8.07422 5.09961H5.52441ZM6.79883 0C7.73794 0 8.49902 0.761083 8.49902 1.7002C8.49878 2.6391 7.73779 3.39941 6.79883 3.39941C5.85994 3.39932 5.09985 2.63904 5.09961 1.7002C5.09961 0.761141 5.8598 9.36506e-05 6.79883 0ZM6.79883 1.27441C6.56519 1.27451 6.37402 1.46654 6.37402 1.7002C6.37427 1.93365 6.56534 2.12491 6.79883 2.125C7.0324 2.125 7.22339 1.93371 7.22363 1.7002C7.22363 1.46648 7.03254 1.27441 6.79883 1.27441Z" fill="black"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 2.8 KiB |
@@ -0,0 +1,10 @@
|
|||||||
|
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<g clip-path="url(#clip0_7_8212)">
|
||||||
|
<path d="M12.9609 0C13.3135 0.000183671 13.5977 0.285111 13.5977 0.637695V9.13574C13.5977 9.48833 13.3135 9.77325 12.9609 9.77344H4.72559L1.08789 13.4111C0.688525 13.8105 0.000275843 13.5301 0 12.9609V0.637695C0 0.284997 0.284997 0 0.637695 0H12.9609ZM1.27441 11.4219L4.01172 8.68555C4.13068 8.56671 4.29205 8.49902 4.46191 8.49902H12.3232V1.27441H1.27441V11.4219ZM6.16113 4.46191C6.16113 3.62054 7.43652 3.62054 7.43652 4.46191V7.22363C7.43652 7.57633 7.15153 7.86133 6.79883 7.86133C6.44621 7.86124 6.16113 7.57627 6.16113 7.22363V4.46191ZM6.34863 2.1123C6.58234 1.87435 7.01105 1.87436 7.24902 2.1123C7.49974 2.36302 7.49549 2.76623 7.24902 3.0127C7.00255 3.25902 6.5993 3.26336 6.34863 3.0127C6.10224 2.76628 6.09807 2.36302 6.34863 2.1123Z" fill="black"/>
|
||||||
|
</g>
|
||||||
|
<defs>
|
||||||
|
<clipPath id="clip0_7_8212">
|
||||||
|
<rect width="13.598" height="13.598" fill="white"/>
|
||||||
|
</clipPath>
|
||||||
|
</defs>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1012 B |
@@ -0,0 +1,7 @@
|
|||||||
|
<svg width="14" height="14" viewBox="0 0 14 14" fill="none" xmlns="http://www.w3.org/2000/svg">
|
||||||
|
<path d="M13.6 4.53333H11.7867V1.81333H9.06665V0H11.7867C12.2676 0 12.7288 0.191047 13.0689 0.531113C13.4089 0.871179 13.6 1.33241 13.6 1.81333V4.53333Z" fill="black"/>
|
||||||
|
<path d="M1.81333 4.53333H0V1.81333C0 1.33241 0.191047 0.871179 0.531113 0.531113C0.871179 0.191047 1.33241 0 1.81333 0H4.53333V1.81333H1.81333V4.53333Z" fill="black"/>
|
||||||
|
<path d="M4.53333 13.6H1.81333C1.33241 13.6 0.871179 13.4089 0.531113 13.0689C0.191047 12.7288 0 12.2676 0 11.7867V9.06665H1.81333V11.7867H4.53333V13.6Z" fill="black"/>
|
||||||
|
<path d="M11.7867 13.6H9.06665V11.7867H11.7867V9.06665H13.6V11.7867C13.6 12.2676 13.4089 12.7288 13.0689 13.0689C12.7288 13.4089 12.2676 13.6 11.7867 13.6Z" fill="black"/>
|
||||||
|
<path d="M6.79996 3.62665C6.07857 3.62665 5.38672 3.91322 4.87663 4.42332C4.36653 4.93342 4.07996 5.62526 4.07996 6.34665C4.07996 8.15998 6.07009 9.81238 6.79996 10.88C7.52982 9.81238 9.51996 8.15998 9.51996 6.34665C9.51996 5.62526 9.23339 4.93342 8.72329 4.42332C8.21319 3.91322 7.52134 3.62665 6.79996 3.62665ZM6.79996 7.25331C6.62063 7.25331 6.44534 7.20014 6.29624 7.10051C6.14714 7.00089 6.03093 6.85929 5.96231 6.69361C5.89368 6.52794 5.87573 6.34564 5.91071 6.16977C5.94569 5.99389 6.03205 5.83234 6.15885 5.70554C6.28565 5.57874 6.4472 5.49239 6.62307 5.4574C6.79895 5.42242 6.98125 5.44037 7.14692 5.509C7.31259 5.57762 7.4542 5.69383 7.55382 5.84293C7.65345 5.99203 7.70662 6.16733 7.70662 6.34665C7.70662 6.58711 7.6111 6.81772 7.44107 6.98776C7.27103 7.15779 7.04042 7.25331 6.79996 7.25331Z" fill="black"/>
|
||||||
|
</svg>
|
||||||
|
After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 412 KiB |
|
Before Width: | Height: | Size: 138 KiB |
@@ -1,4 +0,0 @@
|
|||||||
<svg xmlns="http://www.w3.org/2000/svg" width="44" height="44" fill="none" viewBox="0 0 44 44">
|
|
||||||
<path fill="#1797FF" d="M38.565 18.206c0-6.948-4.156-12.93-10.115-15.585a17.032 17.032 0 0 0-6.991-1.487c-9.445 0-17.106 7.657-17.106 17.106 0 4.168 1.49 7.984 3.966 10.953.038.052.077.103.12.15l.047.052c.086.099.168.193.258.292l.004-.004L20.075 42.07c.125.137.27.249.425.34.71.476 1.68.373 2.278-.276l11.038-12.078.005.004c.223-.232.442-.473.653-.722l.004-.004c.03-.03.056-.065.082-.099a17.044 17.044 0 0 0 4.009-11.004v-.013c-.005-.005-.005-.009-.005-.013Z" opacity=".2"/>
|
|
||||||
<path fill="#1797FF" d="M21.5 6C14.6 6 9 11.6 9 18.5S14.6 31 21.5 31 34 25.4 34 18.5 28.4 6 21.5 6Z"/>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 685 B |
@@ -1,13 +0,0 @@
|
|||||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<g id="Frame" clip-path="url(#clip0_81_10597)">
|
|
||||||
<g id="Frame_2">
|
|
||||||
<path id="Vector" d="M17.3125 16.75H2.6875C1.75712 16.75 1 15.9929 1 15.0625V4.9375C1 4.00712 1.75712 3.25 2.6875 3.25H17.3125C18.2429 3.25 19 4.00712 19 4.9375V15.0625C19 15.9929 18.2429 16.75 17.3125 16.75ZM2.6875 4.375C2.53832 4.375 2.39524 4.43426 2.28975 4.53975C2.18426 4.64524 2.125 4.78832 2.125 4.9375V15.0625C2.125 15.2117 2.18426 15.3548 2.28975 15.4602C2.39524 15.5657 2.53832 15.625 2.6875 15.625H17.3125C17.6219 15.625 17.875 15.3719 17.875 15.0625V4.9375C17.875 4.78832 17.8157 4.64524 17.7102 4.53975C17.6048 4.43426 17.4617 4.375 17.3125 4.375H2.6875Z" fill="#ABABAB"/>
|
|
||||||
<path id="Vector_2" d="M10 10.7964C9.88906 10.7964 9.7806 10.7635 9.68837 10.7019L4.06337 6.95224C3.99954 6.91238 3.94435 6.86013 3.90107 6.79856C3.85779 6.73699 3.82731 6.66736 3.81143 6.5938C3.79555 6.52023 3.7946 6.44423 3.80862 6.37029C3.82264 6.29635 3.85136 6.22598 3.89307 6.16334C3.93478 6.1007 3.98863 6.04706 4.05144 6.00561C4.11426 5.96416 4.18475 5.93574 4.25875 5.92202C4.33274 5.9083 4.40874 5.90957 4.48223 5.92576C4.55573 5.94194 4.62523 5.97271 4.68662 6.01624L10 9.55774L15.3134 6.01624C15.4375 5.93875 15.5869 5.91267 15.73 5.94355C15.873 5.97443 15.9984 6.05983 16.0795 6.18162C16.1606 6.30342 16.191 6.45203 16.1643 6.59591C16.1377 6.73978 16.056 6.8676 15.9366 6.95224L10.3116 10.7019C10.2196 10.764 10.111 10.797 10 10.7964Z" fill="#ABABAB"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
<defs>
|
|
||||||
<clipPath id="clip0_81_10597">
|
|
||||||
<rect width="20" height="20" fill="white"/>
|
|
||||||
</clipPath>
|
|
||||||
</defs>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.6 KiB |
@@ -1,9 +0,0 @@
|
|||||||
<svg width="18" height="18" viewBox="0 0 18 18" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<g id="Close-one (关闭)">
|
|
||||||
<g id="Close-one (关闭)_2">
|
|
||||||
<path id="Vector" d="M9 16.5C13.1421 16.5 16.5 13.1421 16.5 9C16.5 4.85786 13.1421 1.5 9 1.5C4.85786 1.5 1.5 4.85786 1.5 9C1.5 13.1421 4.85786 16.5 9 16.5Z" fill="#CFCFCF" stroke="#CFCFCF" stroke-width="1.125" stroke-linejoin="round"/>
|
|
||||||
<path id="Vector_2" d="M11.1213 6.87891L6.87866 11.1215" stroke="white" stroke-width="1.125" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
<path id="Vector_3" d="M6.87866 6.87891L11.1213 11.1215" stroke="white" stroke-width="1.125" stroke-linecap="round" stroke-linejoin="round"/>
|
|
||||||
</g>
|
|
||||||
</g>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 751 B |
@@ -1,10 +0,0 @@
|
|||||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<g id="Frame" clip-path="url(#clip0_246_5226)">
|
|
||||||
<path id="Vector" d="M9.99884 17.9997C7.59311 17.9997 3.11719 14.4141 3.11719 11.0227V4.54952C3.11719 4.39249 3.24869 4.26563 3.41152 4.26234L3.80139 4.25576C3.81628 4.25576 5.34461 4.22502 6.92013 3.60115C8.53703 2.96298 9.57919 2.22714 9.59021 2.2196L9.81976 2.05677C9.87194 2.02017 9.93413 2.00052 9.99787 2.00049C10.0612 2.00008 10.123 2.01942 10.1748 2.0558L10.4088 2.21999C10.4194 2.22753 11.4626 2.96259 13.0775 3.60154C14.6546 4.2254 16.1829 4.25615 16.1986 4.25615L16.5854 4.26273C16.7484 4.26601 16.8795 4.39288 16.8795 4.54991L16.8828 11.0231C16.8828 14.4141 12.4061 18.0001 9.99825 18.0001L9.99884 17.9997ZM15.8211 5.30334C15.2295 5.25886 13.9849 5.10608 12.6919 4.59419C11.3707 4.07205 10.3993 3.48473 9.99884 3.2254C9.59949 3.48377 8.62753 4.07127 7.30671 4.59419C6.01605 5.10492 4.77489 5.2577 4.1752 5.30334V11.0227C4.1752 13.6824 8.07484 16.9334 9.99884 16.9334C10.7445 16.9334 12.1976 16.3283 13.626 14.9995C15.0029 13.7197 15.8248 12.2328 15.8248 11.0231L15.8211 5.30334ZM9.44691 12.1105C9.39833 12.1603 9.34025 12.1999 9.2761 12.2269C9.21196 12.2538 9.14306 12.2677 9.07348 12.2676C9.00371 12.2675 8.93464 12.2537 8.87027 12.2267C8.8059 12.1998 8.74752 12.1604 8.69851 12.1107L7.10984 10.5118C7.01064 10.4114 6.95501 10.2759 6.95501 10.1347C6.95501 9.99353 7.01064 9.85804 7.10984 9.7576C7.15877 9.70799 7.21708 9.6686 7.28137 9.64171C7.34566 9.61482 7.41465 9.60097 7.48433 9.60097C7.55402 9.60097 7.62301 9.61482 7.68729 9.64171C7.75158 9.6686 7.80989 9.70799 7.85882 9.7576L9.07348 10.9792L12.1402 7.89026C12.189 7.84057 12.2473 7.8011 12.3116 7.77416C12.3758 7.74721 12.4448 7.73334 12.5145 7.73334C12.5842 7.73334 12.6532 7.74721 12.7174 7.77416C12.7817 7.8011 12.8399 7.84057 12.8888 7.89026C12.9886 7.99039 13.0447 8.12599 13.0447 8.26737C13.0447 8.40874 12.9886 8.54435 12.8888 8.64447L9.44691 12.1105Z" fill="#ABABAB"/>
|
|
||||||
</g>
|
|
||||||
<defs>
|
|
||||||
<clipPath id="clip0_246_5226">
|
|
||||||
<rect width="20" height="20" fill="white"/>
|
|
||||||
</clipPath>
|
|
||||||
</defs>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 2.1 KiB |
@@ -1,10 +0,0 @@
|
|||||||
<svg width="20" height="20" viewBox="0 0 20 20" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<g id="Frame" clip-path="url(#clip0_81_10600)">
|
|
||||||
<path id="Vector" d="M5.54545 7.6V6.2C5.54545 3.8802 7.53939 2 10 2C12.4606 2 14.4545 3.8792 14.4545 6.2V7.6H14.6669C15.9549 7.6 17 8.5862 17 9.8V15.8C17 17.0154 15.9566 18 14.6669 18H5.33333C4.04512 18 3 17.0138 3 15.8V9.8C3 8.5846 4.04342 7.6 5.33312 7.6H5.54545ZM6.81818 7.6H13.1818V6.2C13.1818 4.542 11.7578 3.2 10 3.2C8.24236 3.2 6.81818 4.543 6.81818 6.2V7.6ZM4.27273 9.8V15.8C4.27273 16.3512 4.7483 16.8 5.33312 16.8H14.6667C14.806 16.8002 14.944 16.7744 15.0727 16.7242C15.2015 16.674 15.3185 16.6003 15.417 16.5075C15.5155 16.4146 15.5936 16.3043 15.6469 16.1829C15.7001 16.0615 15.7274 15.9314 15.7273 15.8V9.8C15.7273 9.2488 15.2517 8.8 14.6669 8.8H5.33333C5.19401 8.79984 5.05601 8.8256 4.92726 8.8758C4.7985 8.926 4.68152 8.99965 4.583 9.09254C4.48448 9.18543 4.40636 9.29573 4.35312 9.41713C4.29988 9.53853 4.27256 9.66863 4.27273 9.8Z" fill="#ABABAB"/>
|
|
||||||
</g>
|
|
||||||
<defs>
|
|
||||||
<clipPath id="clip0_81_10600">
|
|
||||||
<rect width="20" height="20" fill="white"/>
|
|
||||||
</clipPath>
|
|
||||||
</defs>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 54 KiB |
@@ -1,10 +0,0 @@
|
|||||||
<svg width="64" height="64" viewBox="0 0 64 64" fill="none" xmlns="http://www.w3.org/2000/svg">
|
|
||||||
<g clip-path="url(#clip0_408_56)">
|
|
||||||
<path d="M47.1582 14.4283C47.1582 13.8368 47.4684 13.2886 47.9757 12.9842L61.4494 4.89891C62.5721 4.22529 64.0003 5.03389 64.0003 6.34306V20.2103C64.0003 21.1405 63.2461 21.8945 62.3161 21.8945H48.8424C47.9124 21.8945 47.1582 21.1405 47.1582 20.2103V14.4283Z" fill="#455FE9"/>
|
|
||||||
<path fill-rule="evenodd" clip-rule="evenodd" d="M24.3966 26.4593C23.8893 26.7637 23.5789 27.3118 23.5789 27.9034V43.7921L23.5789 45.4751L23.5789 45.4763L23.5789 48.0001C23.5789 48.9301 22.8249 49.6001 21.8947 49.6001H18.5263C17.5962 49.6001 16.8421 48.9301 16.8421 48.0001V45.4751V34.976C16.8421 33.6669 15.4139 32.8583 14.2913 33.5319L0.817607 41.6171C0.310362 41.9216 0 42.4696 0 43.0615V60.6342C0 61.5642 0.754048 62.3184 1.68421 62.3184H15.1579C16.0881 62.3184 16.8421 61.5642 16.8421 60.6342V58.9488V56.8314C16.8421 55.9011 17.5962 55.3376 18.5263 55.3376H21.8947C22.8249 55.3376 23.5789 55.9011 23.5789 56.8314V58.9488L23.5789 60.6342C23.5789 61.5642 24.333 62.3184 25.2632 62.3184H38.7368C39.6669 62.3184 40.4211 61.5642 40.4211 60.6342V45.4763V43.7921V19.8182C40.4211 18.509 38.9928 17.7004 37.8701 18.374L24.3966 26.4593Z" fill="#455FE9"/>
|
|
||||||
<path d="M47.1592 28.7999V60.7999C47.1592 61.6836 47.9132 62.3999 48.8434 62.3999H62.3171C63.2472 62.3999 64.0013 61.6836 64.0013 60.7999V28.7999C64.0013 27.9162 63.2472 27.1999 62.3171 27.1999H48.8434C47.9132 27.1999 47.1592 27.9162 47.1592 28.7999Z" fill="#455FE9"/>
|
|
||||||
</g>
|
|
||||||
<defs>
|
|
||||||
|
|
||||||
</defs>
|
|
||||||
</svg>
|
|
||||||
|
Before Width: | Height: | Size: 1.5 KiB |