知乎++架构全景图:Kotlin Multiplatform如何打造跨Android与桌面的知乎客户端
【免费下载链接】zhihu-plus-plusZhihu++ | 知乎++: Ad-free, low cost, AI powered zhihu android 3rd-party client. 去广告、占用低、AI大模型的新时代知乎安卓端体验项目地址: https://gitcode.com/gh_mirrors/zh/zhihu-plus-plus
知乎++(Zhihu++)是一款免费、去广告的知乎第三方客户端,基于 Kotlin Multiplatform(KMP)跨平台技术,用同一套核心代码同时驱动 Android 应用与 Windows / Linux / macOS 桌面客户端。本文带你快速看懂它的架构全景:从共享代码分层、数据库复用,到平台入口,一次讲透这个"轻量化知乎客户端"是怎么搭起来的。
一、先认识知乎++:一个不一样的知乎客户端
在官方客户端越来越"重"的今天,知乎++走的是另一条路:
- 去广告:去广告、去推广软文、去带货推销、去盐选专栏
- 体积小巧:Lite 版 APK 不到 4 MB,告别 110 MB+ 的官方客户端
- AI 加持:Full 版本内置端侧 AI 推理,支持基于 LLM embedding 的智能内容过滤
- 本地推荐算法:把内容推荐完全放在本地,摆脱"算法奴役"
更有趣的细节:它甚至内置了知乎经典表情包,
[惊喜]强势回归 🎉,相关资源在 misc/emojis/。
这些卖点背后,是一套相当现代的多平台工程架构。
二、模块全景:一个仓库,多个应用
打开仓库根目录的 settings.gradle.kts,你会看到整个项目注册的模块清单——这就是知乎++的"全家福":
| 模块 | 角色 | 一句话说明 |
|---|---|---|
app | 📱 Android 主应用 | Jetpack Compose UI,分 lite / full 两个版本 |
desktopApp | 💻 桌面应用 | Compose Desktop,产出 Windows / Linux 可执行程序 |
macosApp | 🍎 macOS 原生应用 | Kotlin/Native 编译,arm64 原生体验 |
shared | 🧠 核心共享层 | 90% 以上的业务逻辑都在这里 |
shared-local-db | 🗄️ 本地数据库 | 跨平台 Room 数据库封装 |
sentence_embeddings | 🤖 端侧 AI | Rust 编写的词元化工具(仅 full 版) |
third_party | 📚 渲染引擎 | 内置的 Markdown / LaTeX / 代码高亮库 |
这种"薄平台壳 + 厚共享层"的结构,是 KMP 项目最典型的形态。
三、共享层 shared:一套代码,四处开花
shared/ 是整座大厦的地基。它的 shared/build.gradle.kts 里声明了全部编译目标:
- androidLibrary:Android 库(compileSdk 37 / minSdk 27)
- jvm:JVM 目标,桌面端(Windows / Linux)共用
- iosArm64 / iosSimulatorArm64 / macosArm64:苹果平台原生目标
配套的源码目录则按"平台圈层"划分:
shared/src/ ├── commonMain/ ← 所有平台共享:数据模型、ViewModel、UI 页面、导航 ├── androidMain/ ← 仅 Android:通知、扫码、主题、更新等 ├── jvmMain/ ← 仅桌面 JVM:文件、剪贴板、WebView 等 ├── macosMain/ ← 仅 macOS:原生窗口、侧栏、工具栏 └── nativeMain/ ← iOS + macOS 共享3.1 expect/actual:KMP 处理平台差异的"官方姿势"
比如"打开外部链接""保存图片""系统剪贴板"这类能力,各平台实现方式完全不同。知乎++在 PlatformCapabilities.kt 中用expect声明能力契约:
expect fun rememberSystemUrlOpener(): SystemUrlOpener expect fun rememberImageSaver(): ImageSaver expect fun rememberPlainTextClipboard(): PlainTextClipboard然后在androidMain/jvmMain/macosMain里各自提供actual实现。共享 UI 只面向expect接口编程,完全不用关心底层是 Android Intent 还是 JavaFX 窗口 👌
3.2 数据层:Room 数据库的跨平台复用
本地历史、收藏、屏蔽词都要落库。shared-local-db/ 模块在 shared-local-db/build.gradle.kts 中把Room 2.8.4 同时编译到 Android、JVM 和 Native 三个目标,并用 KSP 在各平台自动生成 DAO 实现——Android 上查历史记录、桌面端导出收藏夹,走的是同一套 SQL 与数据模型。
四、内容渲染:把"知乎的味道"内置进客户端
知乎内容 = 富文本 + 公式 + 代码块。知乎++直接在 third_party/ 内置了三个 KMP 渲染引擎,保证各平台阅读体验完全一致:
- markdown-parser / markdown-renderer:Compose 声明式渲染的 Markdown 引擎
- latex-parser / latex-renderer:数学公式渲染(字体动态下载,见 LatexFontDownloader.kt)
- codehighlight-parser / codehighlight-render:代码块语法高亮
渲染引擎之外,还有两个 Rust 编写的配套项目值得一提:
- rs-zse-sign/:实现 zse96 v2 签名算法,可调用 99% 的知乎网页端 API
- aigc-vote-server/:AIGC 内容投票的服务端组件
五、三个平台入口,同一个界面
5.1 Android:app 模块
Android 端是功能最全的主场。app/ 通过flavorDimensions划分两个构建变体:
- lite:轻量版,无 ML 功能,体积仅约 4 MB
- full:完整版,含 ONNX 端侧推理与智能内容过滤
UI 入口在 ZhihuMainAndroidContent.kt,内部直接复用 shared 层定义的全部页面。
5.2 Windows / Linux:desktopApp 模块
桌面端入口只有短短十几行:desktopApp/Main.kt 用 Compose Desktop 的application { Window { ... } }包住DesktopZhihuMain(),套上同一个ZhihuTheme主题——这就是"跨平台"最直观的体现:窗口是新的,内容全是共享的。
5.3 macOS:macosApp 原生运行时
macOS 走的是更硬核的路线:macosApp/Main.kt 用 Kotlin/Native 直接对接 AppKit(NSApplication/NSWindow),原生侧栏见 MacosNativeSidebar.kt,最终挂载的依然是 shared 层那棵共享 UI 树。
六、这套架构给普通用户带来了什么?
- 体验一致:手机端和桌面端共享同一套页面、主题与数据模型,行为不会"各玩各的"
- 轻量快速:共享层不背平台包袱,lite 版 APK 才能做到 4 MB 级
- 可持续演进:新增一个平台(比如 iOS)只需补一个
source set+actual实现,业务逻辑几乎零改动 - 对贡献者友好:想修 bug 或加功能,90% 的工作集中在 shared/src/commonMain/ 一处完成
想深入了解 UI 与交互设计约定,可参考 docs/ai-ui-design-guide.md 与 docs/notification-center.md。
七、小结
知乎++用一张清晰的 KMP 架构图展示了"一份核心逻辑,N 个平台外壳"的可能性:shared承载业务灵魂,shared-local-db统一数据地基,third_party内置渲染引擎,app/desktopApp/macosApp各自穿上平台的"外衣"。对于想了解 Kotlin Multiplatform 工程实践的同学,这个仓库本身就是一份难得的完整样本 📖
【免费下载链接】zhihu-plus-plusZhihu++ | 知乎++: Ad-free, low cost, AI powered zhihu android 3rd-party client. 去广告、占用低、AI大模型的新时代知乎安卓端体验项目地址: https://gitcode.com/gh_mirrors/zh/zhihu-plus-plus
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考