ZapretKVN-android/scripts/collect-stable-gate-windows.cmd
2026-07-23 23:48:13 +03:00

174 lines
6.7 KiB
Batchfile

@echo off
setlocal EnableExtensions
set "ZAPRET_PKG=io.github.zapretkvn.android"
set "ZAPRET_IDLE_SECONDS=180"
set "ZAPRET_VIDEO_SECONDS=120"
set "ADB=adb.exe"
if exist "%~dp0adb.exe" set "ADB=%~dp0adb.exe"
if exist "%~dp0adb.exe" goto adb_ready
where adb.exe >nul 2>&1
if not errorlevel 1 goto adb_ready
echo ERROR: adb.exe was not found.
echo Extract this script into the Android platform-tools directory and run it there.
pause
exit /b 1
:adb_ready
"%ADB%" get-state >nul 2>&1
if not errorlevel 1 goto device_ready
echo ERROR: no authorized Android device is available through ADB.
"%ADB%" devices -l
pause
exit /b 1
:device_ready
for /f %%T in ('powershell.exe -NoProfile -Command "Get-Date -Format yyyyMMdd-HHmmss"') do set "ZAPRET_STAMP=%%T"
set "ZAPRET_EVIDENCE=%USERPROFILE%\Desktop\zapret-stable-gate-%ZAPRET_STAMP%"
set "ZAPRET_ARCHIVE=%ZAPRET_EVIDENCE%.zip"
mkdir "%ZAPRET_EVIDENCE%" >nul 2>&1
"%ADB%" devices -l > "%ZAPRET_EVIDENCE%\devices.txt" 2>&1
"%ADB%" shell dumpsys package %ZAPRET_PKG% > "%ZAPRET_EVIDENCE%\package.txt" 2>&1
findstr /i "versionCode versionName" "%ZAPRET_EVIDENCE%\package.txt" > "%ZAPRET_EVIDENCE%\installed-version.txt"
findstr /c:"versionName=0.2.1" "%ZAPRET_EVIDENCE%\installed-version.txt" >nul
if not errorlevel 1 goto package_ready
echo ERROR: stable Zapret KVN 0.2.1 is not installed.
type "%ZAPRET_EVIDENCE%\installed-version.txt"
pause
exit /b 1
:package_ready
"%ADB%" shell getprop ro.build.version.release > "%ZAPRET_EVIDENCE%\android-release.txt"
"%ADB%" shell getprop ro.build.version.sdk > "%ZAPRET_EVIDENCE%\android-api.txt"
"%ADB%" shell getprop ro.product.cpu.abi > "%ZAPRET_EVIDENCE%\android-abi.txt"
"%ADB%" shell getprop ro.product.manufacturer > "%ZAPRET_EVIDENCE%\manufacturer.txt"
"%ADB%" shell getprop ro.product.model > "%ZAPRET_EVIDENCE%\model.txt"
"%ADB%" shell settings get global private_dns_mode > "%ZAPRET_EVIDENCE%\private-dns-mode.txt" 2>&1
"%ADB%" shell settings get global private_dns_specifier > "%ZAPRET_EVIDENCE%\private-dns-specifier.txt" 2>&1
"%ADB%" shell dumpsys -l > "%ZAPRET_EVIDENCE%\dumpsys-services.txt" 2>&1
"%ADB%" logcat -c
(
echo collector_version=1
echo package=%ZAPRET_PKG%
echo idle_seconds=%ZAPRET_IDLE_SECONDS%
echo video_seconds=%ZAPRET_VIDEO_SECONDS%
echo started=%DATE% %TIME%
) > "%ZAPRET_EVIDENCE%\collector.txt"
echo.
echo Stable Gate collector
echo ---------------------
type "%ZAPRET_EVIDENCE%\installed-version.txt"
echo.
echo Four objective phases will be captured. The script never changes VPN,
echo DNS, Wi-Fi, mobile data, profiles, or application data.
echo.
echo Phase 1/4: disconnect Zapret KVN, open its main screen once, return Home,
echo lock the phone, then press any key here.
pause >nul
call :capture_phase vpn-off-idle %ZAPRET_IDLE_SECONDS% no
echo.
echo Phase 2/4: unlock the phone, connect Zapret KVN with the profile being
echo tested, return Home, lock the phone, then press any key here.
pause >nul
call :capture_phase vpn-on-idle %ZAPRET_IDLE_SECONDS% no
echo.
echo Phase 3/4: unlock the phone and play the problem video in an application
echo selected for VPN. Enable the player's technical statistics if available.
echo Leave the video playing and press any key here.
pause >nul
call :capture_phase proxy-video %ZAPRET_VIDEO_SECONDS% yes
echo.
echo Phase 4/4: leave the same video playing. During the next measurement,
echo switch Wi-Fi to mobile data, wait for recovery, then switch back to Wi-Fi.
echo Keep USB debugging connected and press any key to start.
pause >nul
call :capture_phase network-switch %ZAPRET_VIDEO_SECONDS% yes
"%ADB%" logcat -d -b main -b system -b crash -v threadtime > "%ZAPRET_EVIDENCE%\logcat.txt" 2>&1
"%ADB%" shell dumpsys connectivity > "%ZAPRET_EVIDENCE%\connectivity-final.txt" 2>&1
"%ADB%" shell dumpsys netd > "%ZAPRET_EVIDENCE%\netd-final.txt" 2>&1
"%ADB%" shell dumpsys batterystats --charged > "%ZAPRET_EVIDENCE%\batterystats-final.txt" 2>&1
"%ADB%" shell dumpsys procstats %ZAPRET_PKG% > "%ZAPRET_EVIDENCE%\procstats-final.txt" 2>&1
"%ADB%" shell dumpsys gfxinfo %ZAPRET_PKG% > "%ZAPRET_EVIDENCE%\gfxinfo-final.txt" 2>&1
powershell.exe -NoProfile -Command "Compress-Archive -Path ($env:ZAPRET_EVIDENCE + '\*') -DestinationPath $env:ZAPRET_ARCHIVE -Force"
if not errorlevel 1 goto archive_ready
echo ERROR: PowerShell could not create the ZIP archive.
pause
exit /b 1
:archive_ready
echo.
echo Evidence archive created:
echo %ZAPRET_ARCHIVE%
echo.
echo If VPN or DNS failed, also export the redacted diagnostic from
echo Settings - Diagnostics and send it next to this ZIP.
echo Raw system evidence can contain network and device identifiers.
pause
exit /b 0
:capture_phase
set "PHASE=%~1"
set "PHASE_SECONDS=%~2"
set "PHASE_TRACE=%~3"
set "PHASE_DIR=%ZAPRET_EVIDENCE%\%PHASE%"
mkdir "%PHASE_DIR%" >nul 2>&1
(
echo phase=%PHASE%
echo seconds=%PHASE_SECONDS%
echo started=%DATE% %TIME%
) > "%PHASE_DIR%\phase.txt"
"%ADB%" shell log -t ZapretStableGate "phase_start:%PHASE%" >nul 2>&1
"%ADB%" shell pidof -s %ZAPRET_PKG% > "%PHASE_DIR%\pid.txt" 2>&1
set "ZAPRET_PID="
set /p "ZAPRET_PID="<"%PHASE_DIR%\pid.txt"
call :snapshot before
"%ADB%" exec-out screencap -p > "%PHASE_DIR%\screen-before.png" 2>nul
if /i not "%PHASE_TRACE%"=="yes" goto no_trace
"%ADB%" shell atrace -z -b 32768 -t 15 sched freq idle am wm gfx view binder_driver > "%PHASE_DIR%\trace.atrace" 2>&1
:no_trace
set /a TOP_ITERATIONS=(PHASE_SECONDS+4)/5
if defined ZAPRET_PID (
"%ADB%" shell top -b -d 5 -n %TOP_ITERATIONS% -H -p %ZAPRET_PID% > "%PHASE_DIR%\top.txt" 2>&1
) else (
"%ADB%" shell sleep %PHASE_SECONDS%
)
call :snapshot after
"%ADB%" exec-out screencap -p > "%PHASE_DIR%\screen-after.png" 2>nul
"%ADB%" shell log -t ZapretStableGate "phase_end:%PHASE%" >nul 2>&1
echo finished=%DATE% %TIME%>> "%PHASE_DIR%\phase.txt"
exit /b 0
:snapshot
set "SNAPSHOT=%~1"
"%ADB%" shell date > "%PHASE_DIR%\%SNAPSHOT%-device-time.txt" 2>&1
"%ADB%" shell dumpsys meminfo %ZAPRET_PKG% > "%PHASE_DIR%\%SNAPSHOT%-meminfo.txt" 2>&1
"%ADB%" shell dumpsys cpuinfo > "%PHASE_DIR%\%SNAPSHOT%-cpuinfo.txt" 2>&1
"%ADB%" shell dumpsys battery > "%PHASE_DIR%\%SNAPSHOT%-battery.txt" 2>&1
"%ADB%" shell dumpsys batterystats --charged %ZAPRET_PKG% > "%PHASE_DIR%\%SNAPSHOT%-batterystats.txt" 2>&1
"%ADB%" shell ip -s link > "%PHASE_DIR%\%SNAPSHOT%-network-links.txt" 2>&1
"%ADB%" shell dumpsys connectivity > "%PHASE_DIR%\%SNAPSHOT%-connectivity.txt" 2>&1
"%ADB%" shell dumpsys activity activities > "%PHASE_DIR%\%SNAPSHOT%-activities.txt" 2>&1
"%ADB%" shell cat /sys/class/power_supply/battery/charge_counter > "%PHASE_DIR%\%SNAPSHOT%-charge-counter.txt" 2>&1
if not defined ZAPRET_PID exit /b 0
"%ADB%" shell cat /proc/%ZAPRET_PID%/stat > "%PHASE_DIR%\%SNAPSHOT%-proc-stat.txt" 2>&1
"%ADB%" shell cat /proc/%ZAPRET_PID%/status > "%PHASE_DIR%\%SNAPSHOT%-proc-status.txt" 2>&1
exit /b 0