本文档旨在记录并汇总近期对 XposedSmsCode 项目进行的系统性重构与性能优化工作。所有改进均严格遵循 Google 官方的 Jetpack Compose 最佳实践及 Kotlin 编程规范。
- Material 3 Expressive 深度迁移:全面升级至
androidx.compose.material3:material3:1.5.0-alpha12,引入原生支持的表现力 (Expressive) 组件、形状、动效及现代化的排版系统。 - 反馈系统重塑:弃用传统的
Toast,在所有主要 Screen (RuleList,RuleEdit,Settings) 中引入SnackbarHostState,实现异步且风格一致的交互反馈。 - 组件规范化:重构
ComposeSettingsScreen.kt中的自定义项,全面基于 M3ListItem标准实现,确保点击波纹、内边距及字体比例完美符合规范。
- Swipe-to-Dismiss:在规则列表 (
RuleListScreen) 中实现滑动删除,提升管理效率。 - Exposed Dropdown Menus:在规则编辑页 (
RuleEditScreen) 的快速选择功能中使用官方ExposedDropdownMenuBox,替换非标准的自定义按钮。
- 可选择文本:在短信记录列表 (
CodeRecordScreen) 中为短信内容应用SelectionContainer,方便用户快速复制验证码。 - 长文本排版:对 FAQ 等长段落应用
LineBreak.Paragraph和渐进式连接符,优化中英文混排的视觉平衡。
- 高亮展示:使用
AnnotatedString为列表中的正则关键字添加主色高亮,增强界面扫描效率。 - 输入引导:在正则输入框中使用
prefix特性(显示 "RE: "),明确输入意图。 - 自动跑马灯:为长标题应用
basicMarquee效果,避免文本截断。
- 异步图标加载:封装
AppIconImage模块,通过LaunchedEffect在 IO 线程加载应用图标,并提供占位符与淡入动效,防止 UI 线程阻塞。 - 规范剪裁:使用
Modifier.clip统一应用标准的 M3 圆角形状。
- 语义增强:补全所有图标及关键组件的
contentDescription,为Checkbox添加动态状态描述。 - 对比度优化:基于 M3 调色板重新校准颜色使用。
- 平滑状态切换:使用
AnimatedContent包装 Screen 级状态切换(加载中/空数据/内容区),消除界面跳变。 - 列表自适应动效:在
LazyColumn中引入Modifier.animateItem(),使列表项在增删改时具备自然的物理移动感。
- 组件显隐动画:使用
AnimatedVisibility配合expandVertically等过渡效果处理校验信息及进度条的显示。 - 自定义 Reveal 动效:在切换主题时,利用
graphicsLayer实现基于点击坐标的圆形揭露动效。
- 完全不可变性:将核心实体类 (
SmsMsg,SmsCodeRule,AppInfo) 的所有属性从var改为val。 - 编译期跳过 (Skipping):添加
@Immutable注解,允许 Compose 编译器在重组过程中安全地跳过未变化的数据项,极大降低重组频率。
- 集合稳定性包装:引入
ImmutableListWrapper<T>自定义包装类,解决标准List接口在 Compose 编译器中被视为“不稳定”的问题,确保列表滚动时零冗余重组。
- 绘制逻辑下放:审计复杂自定义动效,确保高频变化的数值读取(如
revealAnim.value)仅在绘制阶段(lambda 内部)进行,避开开销巨大的重组阶段。
- 属性代理 (Property Delegation):全面普及
by remember { mutableStateOf(...) }语法,淘汰繁杂的.value手写访问,使代码逻辑更简洁。 - 基本类型优化:在计数、索引等场景引入
mutableIntStateOf等专用状态函数,避免 JVM 自动装箱带来的额外内存开销。
- Modifier 链标准:确保所有内部 Composable 组件遵循
modifier: Modifier = Modifier惯例,并作为首个可选参数,赋予组件高度的外部扩展性。 - Trailing Lambdas:严格遵守 Kotlin lambda 结尾写法,提升 DSL 风格代码的可读性。
Tip
后续开发建议:
- 新增数据实体时,请务必保持属性不可变(val)并添加
@Immutable标签。 - 展示列表数据前,应使用
ImmutableListWrapper进行包装。 - 避免在 Composable 内部进行复杂的、未记住的逻辑计算。