Files
DadaoTask/android/README.md
T
dadao 4565fad255
CI / backend (push) Canceled after 0s
chore(android): 让安卓端第一次真正编译出 APK
之前安卓代码一行都没编译过,这次从零把编译链搭起来,第一遍编译就炸了 5 处。

代码 bug(5 个):
- Api.kt 的 SmsRequest/LoginRequest/WorkspaceCreateRequest/RefreshRequest 都没加
  @Serializable,json.encodeToString(x) 于是匹配到 encodeToString(strategy, value) 重载,
  报 "SerializationStrategy<T> expected" + "No value passed for parameter 'value'"
- 三处 mapOf/buildMap 拼请求体(Map<String, Any>)没法序列化,全换成具名 @Serializable 请求类
- ticketAction 的 body 参数从 Map<String, Any> 改成 String,避免把序列化责任散在调用方
- KnowledgeScreen 的 Card(Modifier, onClick=…) 命中无点击的重载,参数重名报错,
  改成 Card(onClick=…, modifier=…)
- 补 import kotlinx.serialization.encodeToString

环境固化(写进仓库,附理由注释,避免下次重踩):
- gradle.properties 加 kotlin.compiler.execution.strategy=in-process
  (受限环境里 Kotlin 编译守护进程连不回来)
- settings.gradle.kts 先走阿里云镜像再回落 google()/mavenCentral(),依赖下载从 5 分钟 2MB 变 90 秒 94MB
- 工程内 debug keystore(android/keystore/debug.keystore)+ app/build.gradle.kts 显式指向
  (受限用户对 ~/.android 无写权限,用系统默认 debug.keystore 会 AccessDenied)
- app/src/debug/AndroidManifest.xml 给 debug 变体放开明文 HTTP:
  真机连 http://192.168.8.x:8100 需要它,release 仍受 network_security_config 白名单约束
- android/README.md 换成实测过的构建/安装说明 + 坑表

结果:BUILD SUCCESSFUL,app-debug.apk 9.94 MB。
未验证:本机没有 system-image、也没连设备,所以只到"能编译、能装",没跑过界面。
2026-10-28 15:35:47 +08:00

3.5 KiB
Raw Blame History

安卓端

Kotlin + Jetpack Compose。功能与 Web 端同构:登录 → 工作区 → 任务 / 工单 / 知识。

它已经能编译出 APK 了(本机实测)

BUILD SUCCESSFUL in 38s
app/build/outputs/apk/debug/app-debug.apk   9.94 MB

本机从零把编译链搭起来踩过的坑都固化在仓库里了,别再走一遍:

现象 原因 仓库里的解法
Failed to load native library 'native-platform.dll' 旧 ~/.gradle 缓存坏了 用独立 GRADLE_USER_HOME(我用的 .local/gradle-home)
validateSigningDebug: AccessDeniedException debug.keystore.lock 沙箱/受限用户对 ~/.android 无写权限 工程内 keystore:android/keystore/debug.keystore,app/build.gradle.kts 显式指向
compileDebugKotlin: AccessDeniedException %TEMP%\kotlin-compiler-*.alive %TEMP% 不可写 构建前把 TEMP/TMP 指到工程内可写目录
Could not connect to Kotlin compile daemon 受限环境里 Kotlin 编译守护进程连不回来 gradle.properties 里 kotlin.compiler.execution.strategy=in-process
依赖下载极慢(5 分钟 2MB) Google Maven 直连慢 settings.gradle.kts 先走阿里云镜像,再回落 google/mavenCentral

需要:JDK 17(JAVA_HOME)、Android SDK platform 35 + build-tools。

cd android
gradle :app:assembleDebug          # 或 ./gradlew(wrapper 需 Android Studio 补齐)

连哪个后端

android/local.properties(不入库):

dadao.apiBase=http://10.0.2.2:8100      # 模拟器访问宿主机
# dadao.apiBase=http://192.168.8.160:8100   # 真机走局域网

真机调试时后端必须监听 0.0.0.0 而不是 127.0.0.1:

uvicorn app.main:app --host 0.0.0.0 --port 8100

app/src/debug/AndroidManifest.xml 对 debug 变体放开了明文 HTTP—— release 仍然只允许 network_security_config.xml 里列出的域,别把这条挪到 main。

安装到手机

adb install -r app/build/outputs/apk/debug/app-debug.apk

首次打开 → 手机号登录(开发环境验证码在接口响应里回显,形如 开发环境验证码:123456)。

结构

app/src/main/java/com/dadao/task/
├── MainActivity.kt          入口 + Splash/Login/Home/Tasks/Knowledge 路由
├── data/
│   ├── Api.kt               OkHttp + kotlinx.serialization;信封解包、业务码抛 ApiException
│   └── TokenStore.kt        令牌本地存储(TODO:换 EncryptedSharedPreferences)
└── ui/
    ├── Theme.kt             与 Web 一致的墨青 + 陶土色板
    ├── LoginScreen.kt       手机号 + 验证码
    ├── HomeScreen.kt        工作区列表 / 新建 / 生成邀请码
    ├── TaskListScreen.kt    任务视图切换、快速新建、勾选完成、详情与评论
    └── KnowledgeScreen.kt   知识四态 tab、手记、按状态给动作(发布需 owner/admin)

已知待办

  • 工单页还没做(Web 已有):需要"我指派的 / 我发起的"两栏 + 接收/开工/提交/验收按钮; 接口在 Api.kt 里已经齐了(tickets / ticketAction / verifyTicket / promote)。
  • 明文令牌存储(TokenStore 里已标 TODO)。
  • 无离线缓存,弱网直接报错——与产品 D7「在线优先」一致。
  • 邀请链接 https://dadaotask.com/join/<wsId>/<code> 已在 Manifest 注册,落地处理尚未实现。
  • 未在本机跑过模拟器(无 system-image、无连接设备),端到端只验证到"能编译、能装"。