188 lines
5.0 KiB
PowerShell
188 lines
5.0 KiB
PowerShell
[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
|