web_shell_flutter/tool/flutter_run_fresh.ps1

188 lines
5.0 KiB
PowerShell
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

[CmdletBinding()]
param(
[ValidateSet('Auto', 'Disable', 'Enable', 'Keep')]
[string]$WebViewMultiprocess = 'Auto',
[Parameter(ValueFromRemainingArguments = $true)]
[string[]]$FlutterArgs
)
$ErrorActionPreference = 'Stop'
$projectRoot = Split-Path -Parent $PSScriptRoot
$localPropertiesPath = Join-Path $projectRoot 'android\local.properties'
$packageName = 'com.yuanxuan.webshell.web_android_shell'
function Get-LocalPropertyValue {
param(
[string]$Path,
[string]$Name
)
if (-not (Test-Path $Path)) {
return $null
}
$escapedName = [regex]::Escape($Name)
foreach ($line in Get-Content $Path) {
if ($line -match "^$escapedName=(.+)$") {
return $matches[1].Trim() -replace '\\\\', '\'
}
}
return $null
}
function Get-DeviceIdFromArgs {
param([string[]]$ArgsToScan)
for ($index = 0; $index -lt $ArgsToScan.Length; $index += 1) {
$arg = $ArgsToScan[$index]
if ($arg -eq '-d' -or $arg -eq '--device-id') {
if ($index + 1 -lt $ArgsToScan.Length) {
return $ArgsToScan[$index + 1]
}
}
if ($arg.StartsWith('--device-id=')) {
return $arg.Substring('--device-id='.Length)
}
}
return $null
}
function Get-DeviceModel {
param(
[string]$AdbPath,
[string[]]$AdbArgsPrefix
)
return ((& $AdbPath @AdbArgsPrefix shell getprop ro.product.model) | Out-String).Trim()
}
function Get-WebViewUpdateState {
param(
[string]$AdbPath,
[string[]]$AdbArgsPrefix
)
return (& $AdbPath @AdbArgsPrefix shell dumpsys webviewupdate | Out-String)
}
function Get-WebViewInfo {
param(
[string]$AdbPath,
[string[]]$AdbArgsPrefix
)
$state = Get-WebViewUpdateState -AdbPath $AdbPath -AdbArgsPrefix $AdbArgsPrefix
$multiprocessEnabled = $state -match 'Multiprocess enabled:\s+true'
$versionName = $null
if ($state -match 'Current WebView package \(name, version\): \([^\),]+,\s*([^\)]+)\)') {
$versionName = $matches[1].Trim()
}
$majorVersion = $null
if ($versionName) {
$majorToken = $versionName.Split('.')[0]
$parsedMajor = 0
if ([int]::TryParse($majorToken, [ref]$parsedMajor)) {
$majorVersion = $parsedMajor
}
}
return @{
MultiprocessEnabled = $multiprocessEnabled
VersionName = $versionName
MajorVersion = $majorVersion
RawState = $state
}
}
function Set-WebViewMultiprocessState {
param(
[string]$AdbPath,
[string[]]$AdbArgsPrefix,
[bool]$Enabled
)
$command = if ($Enabled) { 'enable-multiprocess' } else { 'disable-multiprocess' }
& $AdbPath @AdbArgsPrefix shell cmd webviewupdate $command | Out-Host
Start-Sleep -Seconds 1
}
$sdkDir = Get-LocalPropertyValue -Path $localPropertiesPath -Name 'sdk.dir'
$adbPath = $null
if ($sdkDir) {
$candidate = Join-Path $sdkDir 'platform-tools\adb.exe'
if (Test-Path $candidate) {
$adbPath = $candidate
}
}
if (-not $adbPath) {
$adbCommand = Get-Command adb.exe -ErrorAction SilentlyContinue
if ($adbCommand) {
$adbPath = $adbCommand.Source
}
}
if (-not $adbPath) {
throw "未找到 adb.exe请检查 android/local.properties 中的 sdk.dir。"
}
$deviceId = Get-DeviceIdFromArgs -ArgsToScan $FlutterArgs
$adbArgsPrefix = @()
if ($deviceId) {
$adbArgsPrefix = @('-s', $deviceId)
}
Write-Host "Using adb: $adbPath"
if ($deviceId) {
Write-Host "Target device: $deviceId"
}
& $adbPath @adbArgsPrefix start-server | Out-Null
$deviceModel = Get-DeviceModel -AdbPath $adbPath -AdbArgsPrefix $adbArgsPrefix
$webViewInfo = Get-WebViewInfo -AdbPath $adbPath -AdbArgsPrefix $adbArgsPrefix
Write-Host "Device model: $deviceModel"
if ($webViewInfo.VersionName) {
Write-Host "System WebView: $($webViewInfo.VersionName)"
}
Write-Host "WebView multiprocess enabled: $($webViewInfo.MultiprocessEnabled)"
$shouldDisableMultiprocess = $false
switch ($WebViewMultiprocess) {
'Disable' {
$shouldDisableMultiprocess = $true
}
'Auto' {
$shouldDisableMultiprocess =
$deviceModel -eq 'F136A' -or
($webViewInfo.MajorVersion -ne $null -and $webViewInfo.MajorVersion -le 101)
}
}
if ($shouldDisableMultiprocess -and $webViewInfo.MultiprocessEnabled) {
Write-Host "Disabling Android WebView multiprocess for compatibility..."
Set-WebViewMultiprocessState -AdbPath $adbPath -AdbArgsPrefix $adbArgsPrefix -Enabled:$false
} elseif ($WebViewMultiprocess -eq 'Enable' -and -not $webViewInfo.MultiprocessEnabled) {
Write-Host "Re-enabling Android WebView multiprocess..."
Set-WebViewMultiprocessState -AdbPath $adbPath -AdbArgsPrefix $adbArgsPrefix -Enabled:$true
}
Write-Host "Force-stopping previous app process: $packageName"
& $adbPath @adbArgsPrefix shell am force-stop $packageName | Out-Null
Start-Sleep -Milliseconds 800
Write-Host "Starting flutter run..."
& flutter run @FlutterArgs
exit $LASTEXITCODE