深色模式「黑字」根因修复
根容器是自绘渐变 Box 而非 Material Surface,导致 LocalContentColor 停在默认黑,所有没显式设色的文字 / 图标在深色下全糊。修法是在主题层用 CompositionLocalProvider 注入 onSurface,而不是逐个补 tint。同版还修了用户气泡误挂「无知识库佐证」、能力开关换成 iOS 风格 Switch 并持久化。
本地技术原型的版本演进与更新优化记录。以下按代次梳理有代表性的功能落地与问题修复。
报告原文覆盖几百个构建包,这里只挑有代表性的节点。往下滑时,每个版本会像首页那样从下往上渐入, 底部的追踪条会跟着你正在看的版本走,左侧脊线也会随滚动逐渐点亮。
早期包体积还偏大、命名规则也还没定型,重点是先解决深色模式渲染这种“看不见但很扎眼”的根因。
根容器是自绘渐变 Box 而非 Material Surface,导致 LocalContentColor 停在默认黑,所有没显式设色的文字 / 图标在深色下全糊。修法是在主题层用 CompositionLocalProvider 注入 onSurface,而不是逐个补 tint。同版还修了用户气泡误挂「无知识库佐证」、能力开关换成 iOS 风格 Switch 并持久化。
命名规则固定成「版本号读成日期」,并把调试版一次性 release 化,安全与体积隐患基本自愈。
最早分析到的版本是 debug 构建:debuggable=true、allowBackup=true、44.7MB 未混淆主 DEX、网络安全配置给公网 IP 放行明文 HTTP。架构规范,但全是「分享 / 上架」的风险点。
R8 混淆 + 资源瘦身,体积 17.9MB→1.68MB;allowBackup=false、移除多余权限、关 debuggable;首次带 Baseline Profile(Compose 跟手感的头号开关);接口默认 HTTPS 与硬件加密凭据。
enableEdgeToEdge 沉浸、derivedStateOf 防键盘逐帧计算、PressScale 弹簧按压、Haptics 触感反馈、StaggerIn 防列表回收重播、流式气泡用纯 Text 避解析、流式跟随 sample(100ms) 防抖动。
把连接复用、缓存统计、计费记账这些“算得准不准”的事情收口,并落地一套 iOS 设计语言。
连接复用(reset 时清理 clientCache)、流式跟随改单一副作用 sample(100ms)、PDF 后台拷贝并清扫上传临时文件、缓存占用改为统计整个 cacheDir;删掉无效的 perfbase 假 A/B 变体。
四层主题(语义色板 / Dynamic Type / 连续圆角 Squircle / 全临界阻尼弹簧组)+ AppleList、AppleTabBar。两个真 bug:cos(π/2) 在 Float 下是负 4e-8,开方得 NaN 整条圆角曲线消失;TabBar 把 49dp 定高和底部 inset 加在同一节点,三键导航时 inset 被扣只剩 1dp。
这一代共 18 个包,绝大多数是当天实机反馈直接触发。下面挑几条“同一个问题跨好几个版本才真正闭掉”的代表。
设置页朗读 / 语音输入两个开关 + 气泡下方朗读按钮。朗读按条计费,做成「点一下才合成播放」,不做自动播报,避免静默烧钱。
五个屏大标题切换时闪旧字(两页约 100ms 重叠),改成 fade-through 错峰;学习计划展开收起原是硬切,补 expandVertically / shrinkVertically。主题蓝定为 0080C8(压明度不降饱和,白底对比度 3.36→4.27)。
卡顿真因不是标题鬼影,而是 AnimatedContent 把整屏销毁重建(切 Tab 回顶部、入场凭证重播、LaunchedEffect 重发请求)。改 SaveableStateHolder + SaveableStateProvider 包五屏;删掉二级页每帧新建全屏 RenderEffect 的 blur(卡顿真凶)。
思路换成换色相不调明度:千问蓝 082DFF,白底对比度 4.27→7.42;深色配 7C93FF。前三版在青蓝轴调明度都偏闷,转折点是意识到该换色相而非换明度。
记账头加上后,发现反代把它丢了,学习对话仍在漏记;补透传后才真正闭合。同轮新增 AI 拆解任务(预览 / 落库 / 复盘三个端点),模型直连以压低单次成本。
.10 修三条根因(发送中也收输入栏 / 补 clearFocus / 展开后延迟滚);.11 回调策略(只在未出第一个字时收);.12 补 6 秒兜底——某条对话链路没有流式端点,判据等不到出字。
输入框去硬边框改微背景 + 聚焦双环(不用阴影,避免浅底发灰);等宽数字补齐七处;复制按钮配 2.5 秒弹簧提示条(巧法:把列表区包进 weight(1f) 的 Box,其底边即输入栏上沿,无需写死高度)。
复制 → 收缩成圆 → 一笔画勾并迸六粒子 → 显示「已复制」;计划卡加完成度细条、完成数纵向翻滚、全部完成底色成功绿。任务行一行没动,行高靠 onGloballyPositioned 实测,加内边距会让重排错位。
降级回复正文与「未保存 · 模型没答上来」两段被塞进同一 Box 叠放,字打在同一行。修法是在分支内套一层 Column。判定关键:放大截图三倍能同时认出两段不同笔画,据此排除解析失败。