Files
DadaoTask/android/scripts/emulator.ps1
T
dadao f683436689
CI / backend (push) Canceled after 0s
feat(android): 安卓端第一次真跑起来,修两个联调才暴露的解析 bug
上一轮只是"能编译"。这一轮在模拟器上真装了、真登录、真点了,才发现两个问题:

1. workspaces() / members() 直接按 List 解析,但服务端列表接口返回的是
   {"items": [...]}。表现就是登录成功后首页红字「响应格式异常(HTTP 200)」,
   而且工作区永远显示为空。新增 WorkspacePage / MemberPage 容器类型。
2. 之前 Api.kt 的请求体全是没加 @Serializable 的普通 data class(上一提交已修),
   这次把成员/工作区的解析也按同样思路收口。

环境侧(写进 android/README + 新增 android/scripts/emulator.ps1):
- sdkmanager 拉不到远端索引,系统镜像是直连 dl.google.com 手动装的;
  压缩包里多一层 x86_64/,要把内容提上一层,否则 AGP 找不到 system.img
- AVD 放工程内(~/.android 受限不可写),建 AVD 与启动都靠 ANDROID_USER_HOME / ANDROID_AVD_HOME
- 无头启动要 -no-window -gpu swiftshader_indirect
- 点按坐标要拿 uiautomator dump 的 bounds,别拿降采样截图猜
- adb shell input text 打不了中文(NPE),中文数据走接口或直接写库

验证(模拟器 API 35,连 fnsvr-01 的真库):
登录 → 建工作区 ShipFast → 任务列表显示 4 条中文任务(状态、截止日都对)
→ 勾选完成,条目从「进行中」消失(乐观锁生效)→ 工单页、知识页均正常渲染。
截图放进 2.Design/screens/android-{login,tasks}.png。
2026-10-28 17:04:35 +08:00

83 lines
3.2 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.
# 启动本机模拟器并装上 debug APK。
#
# 之所以写这个脚本而不是让人手敲:这台机器上 Gradle 与 emulator 都需要几个
# 环境变量(受限沙箱下 ~/.android 不可写、%TEMP% 不可写),漏一个就报
# "AccessDeniedException" 或 "Could not connect to Kotlin compile daemon"。
#
# pwsh -File android/scripts/emulator.ps1 # 只启动模拟器
# pwsh -File android/scripts/emulator.ps1 -Install # 顺带编译并安装 APK
#
# 首次使用前需要有:
# - JDK 17(默认 .local/jdk17/...,可用 -JdkHome 覆盖)
# - Android SDK platform 35 + system-images;android-35;google_apis;x86_64
# - 已创建的 AVD(默认名 dadao,可用 -AvdName 覆盖)
param(
[switch]$Install,
[string]$AvdName = "dadao",
[string]$JdkHome = "",
[string]$SdkHome = "$env:LOCALAPPDATA\Android\Sdk"
)
$ErrorActionPreference = "Stop"
$repo = Split-Path -Parent (Split-Path -Parent $PSScriptRoot) # android/.. -> 仓库根
$local = Join-Path $repo ".local"
if (-not $JdkHome) {
$JdkHome = Join-Path $local "jdk17\jdk-17.0.21.0.2+1"
}
if (-not (Test-Path $JdkHome)) { throw "找不到 JDK 17:$JdkHome(用 -JdkHome 指定)" }
if (-not (Test-Path (Join-Path $SdkHome "platform-tools\adb.exe"))) { throw "找不到 Android SDK:$SdkHome" }
# 这几个目录必须是可写的,否则 Gradle/Kotlin/AGP 会以各种 AccessDenied 失败
$env:JAVA_HOME = $JdkHome
$env:GRADLE_USER_HOME = Join-Path $local "gradle-home"
$env:ANDROID_HOME = $SdkHome
$env:ANDROID_SDK_ROOT = $SdkHome
$env:ANDROID_USER_HOME = Join-Path $local "android-user"
$env:ANDROID_AVD_HOME = Join-Path $local "android-avd"
$env:TEMP = Join-Path $local "tmp"
$env:TMP = $env:TEMP
foreach ($d in @($env:GRADLE_USER_HOME, $env:ANDROID_USER_HOME, $env:ANDROID_AVD_HOME, $env:TEMP)) {
New-Item -ItemType Directory -Force -Path $d | Out-Null
}
$adb = Join-Path $SdkHome "platform-tools\adb.exe"
$emulator = Join-Path $SdkHome "emulator\emulator.exe"
if ($Install) {
Push-Location (Join-Path $repo "android")
try {
& (Join-Path $local "gradle-8.13\bin\gradle.bat") :app:assembleDebug --no-daemon --console=plain
} finally {
Pop-Location
}
}
& $adb start-server | Out-Null
$running = & $adb devices | Select-String "emulator-\d+\s+device"
if (-not $running) {
Write-Host "启动模拟器 $AvdName ..."
Start-Process -FilePath $emulator -ArgumentList @(
"-avd", $AvdName, "-no-window", "-no-audio", "-no-boot-anim",
"-no-snapshot", "-gpu", "swiftshader_indirect"
) -WindowStyle Hidden
}
Write-Host "等待开机完成 ..."
for ($i = 0; $i -lt 60; $i++) {
Start-Sleep -Seconds 5
$boot = (& $adb shell getprop sys.boot_completed 2>$null) -join ""
if ($boot.Trim() -eq "1") { break }
}
if ($boot.Trim() -ne "1") { throw "模拟器 5 分钟内没起来,看 $local\emulator.log" }
if ($Install) {
$apk = Join-Path $repo "android\app\build\outputs\apk\debug\app-debug.apk"
& $adb install -r $apk
& $adb shell am start -n com.dadao.task/.MainActivity | Out-Null
Write-Host "已安装并启动。后端要在 8100 端口,模拟器通过 10.0.2.2 访问宿主机。"
} else {
Write-Host "模拟器就绪。"
}