# Phase 1 build chain: Rust .so -> jniLibs -> Gradle debug APK -> install -> launch # # Keep this file ASCII-only (PS 5.1 reads BOM-less .ps1 as GBK; see lessons). # # Usage (from apps/android-viewer/): # powershell -ExecutionPolicy Bypass -File build-android.ps1 [-Host_ 192.168.1.5] [-Port 47800] [-Code t] [-SkipRust] # (param is Host_ because $Host is a PowerShell automatic variable) # # Prereqs (Windows dev box): # - Rust + Android targets + cargo-ndk + NDK (see personal docs/baseline.md toolchain table) # - JDK 17 + Gradle 8.14 (paths in $vars below, adjust to your machine) # - local.properties with sdk.dir (gitignored; template: sdk.dir=) param( [string]$Host_ = "192.168.1.5", [int]$Port = 47800, [string]$Code = "t", [switch]$SkipRust ) $ErrorActionPreference = "Stop" # repo root = two levels up from this script (apps/android-viewer -> repo) $proj = $PSScriptRoot $repo = (Resolve-Path "$proj\..\..").Path $env_ = "D:\working\environment" $gradle = "D:\working\android\gradle\gradle-8.14.3\bin\gradle.bat" $adb = "D:\working\android\sdk\platform-tools\adb.exe" $env:RUSTUP_HOME = "$env_\rust" $env:CARGO_HOME = "$env_\cargo" $env:PATH = "$env_\mingw64\bin;$env_\cargo\bin;$env:PATH" $env:ANDROID_HOME = "D:\working\android\sdk" $env:ANDROID_NDK_HOME = "D:\working\android\sdk\ndk\30.0.16248370" $env:GRADLE_USER_HOME = "D:\working\android\gradle-home" $env:JAVA_HOME = "D:\working\java\jdk17" if (-not (Test-Path "$proj\local.properties")) { Set-Content "$proj\local.properties" 'sdk.dir=D\:\\working\\android\\sdk' -Encoding ascii Write-Host "generated local.properties (sdk.dir)" } if (-not $SkipRust) { Write-Host "=== 1/4 cargo ndk: android-ffi (arm64 release) ===" -ForegroundColor Cyan Push-Location $repo # cargo writes progress to stderr; PS 5.1 + ErrorActionPreference=Stop turns # every stderr line into a terminating error. Relax for native calls and # judge by exit code (same for gradle below). $ErrorActionPreference = "Continue" cargo ndk -t arm64-v8a build -p android-ffi --release 2>&1 | Select-String "error|Finished|Building" if ($LASTEXITCODE -ne 0) { throw "cargo ndk build failed (exit $LASTEXITCODE)" } $ErrorActionPreference = "Stop" Pop-Location } Write-Host "=== 2/4 copy .so into app/libs ===" -ForegroundColor Cyan $so = "$repo\target\aarch64-linux-android\release\libandroidffi.so" if (-not (Test-Path $so)) { throw "missing $so (run without -SkipRust)" } New-Item -ItemType Directory -Force -Path "$proj\app\libs\arm64-v8a" | Out-Null Copy-Item $so "$proj\app\libs\arm64-v8a\libandroidffi.so" -Force Write-Host (" libandroidffi.so: {0:N0} KB" -f ((Get-Item $so).Length/1KB)) Write-Host "=== 3/4 gradle assembleDebug ===" -ForegroundColor Cyan Push-Location $proj $ErrorActionPreference = "Continue" & $gradle :app:assembleDebug --console=plain 2>&1 | Select-Object -Last 25 $code = $LASTEXITCODE $ErrorActionPreference = "Stop" Pop-Location if ($code -ne 0) { throw "gradle build failed (exit $code)" } $apk = "$proj\app\build\outputs\apk\debug\app-debug.apk" if (-not (Test-Path $apk)) { throw "apk not found: $apk" } Write-Host (" APK: {0:N0} KB" -f ((Get-Item $apk).Length/1KB)) Write-Host "=== 4/4 install + launch ===" -ForegroundColor Cyan $ErrorActionPreference = "Continue" & $adb install -r $apk if ($LASTEXITCODE -ne 0) { throw "install failed (phone must allow USB install)" } & $adb logcat -c | Out-Null & $adb shell am start -n com.verify.remote/.MainActivity ` --es host $Host_ --ei port $Port --es code $Code | Out-Null $ErrorActionPreference = "Stop" Write-Host "launched. watch: adb logcat -s MainActivity:H264Decoder RustBridge:* viewer-core:* AndroidRuntime:E" Write-Host "after 10s capture screen: adb exec-out screencap -p > screen.png"