Files
TPSchedule/scripts/build-android.ps1

33 lines
1.9 KiB
PowerShell

param(
[string]$ToolchainRoot = 'C:/Users/david/Desktop/app/.tools',
[ValidateSet('debug', 'release')][string]$Mode = 'release'
)
$ErrorActionPreference = 'Stop'
$env:HEPAN_TOOLCHAIN_ROOT=$ToolchainRoot
. "$PSScriptRoot/android-env.ps1"
$projectRoot=Split-Path $PSScriptRoot -Parent
Push-Location "$projectRoot/mobile"
try {
# Refresh local dependency metadata without network. The build then regenerates
# plugin registration for its mode, excluding test-only plugins from release.
flutter.bat pub get --offline
if($LASTEXITCODE -ne 0) { throw '本地依赖准备失败,未开始构建' }
flutter.bat build apk "--$Mode"
if($LASTEXITCODE -ne 0) { throw 'Android 构建失败,未复制 APK' }
$built=Join-Path (Get-Location) "build/app/outputs/flutter-apk/app-$Mode.apk"
if(!(Test-Path -LiteralPath $built)) { throw '本次构建未生成 APK' }
$taskSigner = Join-Path $env:ANDROID_HOME 'build-tools/36.0.0/apksigner.bat'
$taskSignature = & $taskSigner verify --print-certs $built
if ($LASTEXITCODE -ne 0) { throw 'APK 签名验证失败,未复制 APK' }
$taskExpectedCertificate = 'AF5C21B1BA1E48E461D8EA38DF0FE1C3653F64EB7E8E7728BAE6E5D988BA0D0A'
$taskSignatureText = $taskSignature -join "`n"
if ($taskSignatureText -notmatch 'certificate SHA-256 digest:\s*([a-fA-F0-9]{64})' -or
$Matches[1].ToUpperInvariant() -ne $taskExpectedCertificate) {
throw '签名证书与原证书不一致,未复制 APK。请保留原有签名文件,不要重新生成。'
}
New-Item -ItemType Directory -Force "$projectRoot/dist" | Out-Null
$taskArtifact = if ($Mode -eq 'release') { 'TPSchedule.apk' } else { 'TPSchedule-debug.apk' }
Copy-Item -LiteralPath $built -Destination "$projectRoot/dist/$taskArtifact" -Force
Get-Item -LiteralPath "$projectRoot/dist/$taskArtifact" | Select-Object FullName,Length,LastWriteTime
} finally { Pop-Location }