惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
量子位
M
MIT News - Artificial intelligence
Y
Y Combinator Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Google DeepMind News
Google DeepMind News
Hugging Face - Blog
Hugging Face - Blog
博客园_首页
雷峰网
雷峰网
I
InfoQ
罗磊的独立博客
博客园 - 聂微东
酷 壳 – CoolShell
酷 壳 – CoolShell
大猫的无限游戏
大猫的无限游戏
D
Docker
H
Hackread – Cybersecurity News, Data Breaches, AI and More
腾讯CDC
博客园 - 三生石上(FineUI控件)
The GitHub Blog
The GitHub Blog
K
Kaspersky official blog
P
Privacy & Cybersecurity Law Blog
S
SegmentFault 最新的问题
T
Threat Research - Cisco Blogs
H
Help Net Security
小众软件
小众软件
Cyber Security Advisories - MS-ISAC
Cyber Security Advisories - MS-ISAC
C
CERT Recently Published Vulnerability Notes
WordPress大学
WordPress大学
T
Tenable Blog
T
The Blog of Author Tim Ferriss
C
Cisco Blogs
Simon Willison's Weblog
Simon Willison's Weblog
博客园 - Franky
A
Arctic Wolf
T
Threatpost
Scott Helme
Scott Helme
C
Cybersecurity and Infrastructure Security Agency CISA
D
Darknet – Hacking Tools, Hacker News & Cyber Security
T
The Exploit Database - CXSecurity.com
G
GRAHAM CLULEY
Security Latest
Security Latest
Spread Privacy
Spread Privacy
L
LINUX DO - 热门话题
V
Vulnerabilities – Threatpost
P
Privacy International News Feed
S
Schneier on Security
Latest news
Latest news
cs.CL updates on arXiv.org
cs.CL updates on arXiv.org
C
Cyber Attacks, Cyber Crime and Cyber Security
C
CXSECURITY Database RSS Feed - CXSecurity.com

Grtsinry43 的前端札记

从头开始的勇气 列车上的生活 分享一点体测的小事 「手搓系列 02」深入浅出 Agent Skills:架构、实现与思考 路的尽头还是路 二十一岁,然后...... 我患上了 token 的瘾 Xiaomi 17 标准版刷机折腾记:解锁、官改ROM与必备模块 思考 在焦虑与代码中缓慢前行 从 v1 到 v2,谈谈这个简单博客背后的架构演进与实现 Go 语言初体验:Less is more,一种丑但可靠的工程美学 职规赛,一次特别的体验 2025 年终总结——从晨光到雾散,化经历为成长 2025 实习札记:关于一场未完成的迁徙与落地 新时代的 PHP:RSC 的边界错位与工程代价 从想法到实践:在无序的生活里,试图用代码敲出一点秩序 命运开了个无情的玩笑 「手搓系列 01」 从零搭建 Vue 文档站,学习从静态生成到语法解析 手把手带你玩转 Monorepo,拥抱现代前端开发新范式 好久不见,这是一份来自作者的独白
PureFlow 简析:用 Kotlin 跨平台构建 RSS 阅读器
grtinry43 · 2025-09-22 · via Grtsinry43 的前端札记

之前研究那么久 KMP…但是直到现在也没写什么 demo 项目,这次因为身体原因刚好出不去,唉,正好有时间探索这个了。

[!NOTE]

目前只是个 demo ,之后我有时间有精力会慢慢添加功能

项目地址:https://github.com/grtsinry43/PureFlow

整个项目其实就写了四天,不过因为几乎 90% 的时间都在写代码,并且现在有 claude code 能干一点脏活累活,所以说自己写好重要部分就行。

它基于 Kotlin Multiplatform 和 Compose Multiplatform 技术栈,一套代码,同时支持 Android、iOS、macOS、Windows、Linux 甚至 Web 平台。

原本我计划用 ovCompose 跨到 HarmonyOS 的,但是没有 UI 库,先这样吧。

技术栈总览

Kotlin Multiplatform 和 Compose Multiplatform 无疑是项目首选,实现了几乎全栈 Kotlin,从 UI 到业务逻辑,甚至服务端和数据库交互,带来的是开发者开发效率提升和心智统一。

  • 核心框架:
    • Kotlin Multiplatform: 跨平台的核心引擎。
    • Compose Multiplatform: 声明式 UI 的未来,一套代码搞定多端 UI。
  • 数据层:
    • SQLDelight: 类型安全的 SQL 数据库。
    • Multiplatform Settings: 跨平台配置存储。
  • 网络层:
    • Ktor Client: JetBrains 自家的 HTTP 客户端,跨平台支持很到位。
    • RSS Parser: 使用 com.prof18.rssparser 开源解析库。
    • Coil: 强大的图片加载和缓存库,多平台版本用起来也很香。
  • 状态管理与异步:
    • StateFlow & SharedFlow: 响应式状态管理的核心,数据流转非常清晰。
    • ViewModel: MVVM 架构模式中的核心组件。
    • Kotlin Coroutines: 异步编程的利器,让复杂任务变得简单。

这几乎是一个纯正的 Kotlin 全家桶方案,也是我认为其值得一试的原因所在。

核心架构设计

PureFlow 设计成一个典型的模块化架构,就像搭积木一样,每块积木都有明确的功能和边界。

1. shared 模块

包含了所有平台共享的业务逻辑、数据模型、数据库接口、网络请求封装和 RSS 解析器。它的 build.gradle.kts 配置编译到了各个平台目标:

通过这个配置,共享代码能编译成 Android 的 .jar、iOS 的 .framework、桌面端的 .jar 和 Web 用的 .js 库,真正实现了一套代码,多端运行。其中 generateTypeScriptDefinitions()webApp 模块的 TypeScript 集成铺平了道路,TypeScript 可以直接使用 Kotlin 共享模块定义的接口和数据结构,减少了重复定义。

2. composeApp 模块:统一的 UI 界面

这里是 Compose Multiplatform 的战场…终于 iOS stable,可以放心去写。它负责所有平台的 UI 渲染。得益于 shared 模块提供的稳定业务逻辑,composeApp 可以专注于 UI 交互和视觉呈现。

isStatic = trueComposeApp 模块在 iOS 上打包成静态框架,便于在 iosApp 中集成。

3. server 模块:轻量级后端支持(Planned)

虽然 PureFlow 主要是一个客户端应用,但我还是打算用 Ktor 实现一个轻量级后端。它的主要任务是提供 RSS 同步和用户数据管理功能,为将来的云同步、多设备数据一致性打下基础。

数据层:SQLDelight

数据存储是任何应用的核心,这里选择 SQLDelight 来处理本地数据库。它提供类型安全的 Kotlin API,避免了运行时错误,开发体验直线提升。

数据库设计

项目使用 SQLDelight 配置了数据库:

实际的数据库表结构

从项目的 RssDatabase.sq 文件可以看到表设计:

  1. RSS 条目表 (rssItem)

  2. 订阅源表 (subscription)

  3. 收藏表 (favorite)

性能优化索引设计:

这些索引优化了常见查询的性能,比如按订阅源查询文章、按时间排序等操作。

expect/actual 机制在数据库驱动中的应用

还记得之前说的 expect/actual 吗?(现代 Android 开发探索)

它在这里完美解决了不同平台数据库驱动的差异:

这种分离让共享逻辑无需关心底层实现细节。

UI 实现细节:Compose Multiplatform 的响应式与主题

PureFlow 的 UI 完全由 Compose Multiplatform 构建,目标是实现真正的“一次编写,多端体验优化”。

实际的依赖配置

composeApp/build.gradle.kts 可以看到项目使用的 UI 相关依赖:

项目采用了完整的 Material 3 设计系统,使用 Coil 进行图片加载,KSoup 进行 HTML 解析。

主题系统

项目包含了完整的主题系统,在 THEME_GUIDE.md 中详细说明了如何使用和自定义主题。支持浅色/深色模式切换,以及 Material Design 3 的动态颜色特性。

(这部分是Claude Code写的)

网络层核心实现

网络请求选择了 Ktor Client,它的跨平台能力让不同平台复用了 HTTP 客户端的配置。

项目使用了 com.prof18.rssparser 库而不是手动解析:

这种做法的好处是利用了成熟的开源库,避免了重复造轮子,同时保持了代码的简洁性。

平台特异性网络配置

shared/build.gradle.kts 为不同平台选择了合适的 HTTP 引擎:

这个没啥说的:Android 使用 Android 引擎,iOS 使用 Darwin 引擎,Desktop 使用 OkHttp 引擎。

数据管理:Repository 模式

项目采用了 Repository 模式来抽象数据源,实际的实现比较直接:

这种实现直接使用 Kotlin 的 Result 类型处理成功/失败状态,并通过 SQLDelight 的 Flow 支持实现响应式数据更新。

服务层架构

项目实现了一个 RssServiceManager 作为核心服务管理器:

这个服务管理器整合了所有核心功能,包括订阅管理、增量更新、定时同步等。

依赖注入:expect/actual 模式

项目采用了简洁的依赖注入方案,基于 expect/actual 模式:

这种方式避免了重型 DI 框架的复杂性,同时保持了清晰的依赖关系。

构建和部署细节

项目实现了多平台的自动化构建和发布。

实际的打包脚本 (package.sh)

项目包含了一个真实的多平台打包脚本,支持:

桌面应用打包配置

composeApp/build.gradle.kts 可以看到详细的桌面应用打包配置,包括:

  • 根据操作系统自动选择打包格式
  • 平台特有的配置(如 macOS 的 Bundle ID,Windows 的升级 UUID)
  • 应用程序的元数据和图标配置

CI/CD 流水线

GitHub Actions 配置实现了:

  • 多平台构建矩阵: 在不同环境中分别构建各平台的安装包
  • 标签驱动的自动发布: 基于 Git 标签自动触发发布流程
  • 构建缓存优化: 使用 Gradle 缓存提升构建速度
  • 详细的构建报告: 自动生成构建状态总结

总结与思考

这个项目算是一个活生生的案例,证明了在保证代码质量的同时,完全可以实现真正的一次编写、多端运行。

因为时间问题,这里选择了务实写法,使用成熟的第三方库而不是重复造轮子,采用简洁的依赖注入方案而不是重型框架

如果你也对跨平台开发感兴趣,或者正纠结于技术选型,希望这篇文章能为你带来一些启发和帮助。项目展现了现代 Kotlin 生态的强大能力,也让我对跨平台开发的未来充满信心。