<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>CleanArchitecture on zed的博客</title><link>https://www.dust-zed.site/tags/cleanarchitecture/</link><description>Recent content in CleanArchitecture on zed的博客</description><generator>Hugo -- gohugo.io</generator><language>zh-cn</language><lastBuildDate>Sun, 11 Jan 2026 13:02:10 +0800</lastBuildDate><atom:link href="https://www.dust-zed.site/tags/cleanarchitecture/index.xml" rel="self" type="application/rss+xml"/><item><title>Clean Architecture + Rust：Kotlin UI 与 Rust Core 的边界</title><link>https://www.dust-zed.site/android/clean-architecture-rust-practice/</link><pubDate>Sun, 11 Jan 2026 13:02:10 +0800</pubDate><guid>https://www.dust-zed.site/android/clean-architecture-rust-practice/</guid><description>&lt;p>把 Rust 引入 Android 项目时，最重要的问题不是“能不能调用 Rust”，而是“哪些逻辑值得放到 Rust”。如果边界不清楚，跨语言调用只会增加复杂度。&lt;/p>
&lt;h2 id="核心结论">核心结论
&lt;/h2>&lt;ol>
&lt;li>Kotlin 适合处理 Android 平台能力、生命周期、权限、UI 和依赖注入。&lt;/li>
&lt;li>Rust 适合承载可跨平台复用、计算密集、协议解析或强一致性的核心逻辑。&lt;/li>
&lt;li>Domain 层应该定义稳定接口和模型，隔离 UI 与具体实现。&lt;/li>
&lt;li>FFI 边界要尽量窄，避免 Kotlin 和 Rust 互相泄漏内部细节。&lt;/li>
&lt;li>使用 Rust 的收益必须大于构建、调试、类型映射和团队学习成本。&lt;/li>
&lt;/ol>
&lt;h2 id="架构模型">架构模型
&lt;/h2>&lt;pre tabindex="0">&lt;code class="language-mermaid" data-lang="mermaid">graph LR
UI[&amp;#34;Kotlin UI / Compose&amp;#34;]
VM[&amp;#34;ViewModel&amp;#34;]
Domain[&amp;#34;Domain Interfaces / Models&amp;#34;]
Adapter[&amp;#34;Kotlin Adapter / UniFFI Binding&amp;#34;]
Rust[&amp;#34;Rust Core&amp;#34;]
UI --&amp;gt; VM
VM --&amp;gt; Domain
Domain --&amp;gt; Adapter
Adapter --&amp;gt; Rust
&lt;/code>&lt;/pre>&lt;p>职责划分：&lt;/p>
&lt;table>
&lt;thead>
&lt;tr>
&lt;th>层&lt;/th>
&lt;th>职责&lt;/th>
&lt;/tr>
&lt;/thead>
&lt;tbody>
&lt;tr>
&lt;td>Kotlin UI&lt;/td>
&lt;td>渲染、交互、生命周期&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>ViewModel&lt;/td>
&lt;td>UI 状态管理、调用 UseCase&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Domain&lt;/td>
&lt;td>接口、领域模型、用例边界&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Adapter&lt;/td>
&lt;td>Kotlin 与 Rust 类型适配&lt;/td>
&lt;/tr>
&lt;tr>
&lt;td>Rust Core&lt;/td>
&lt;td>核心逻辑、协议、计算、跨平台能力&lt;/td>
&lt;/tr>
&lt;/tbody>
&lt;/table>
&lt;h2 id="domain-作为契约">Domain 作为契约
&lt;/h2>&lt;p>Domain 层不应该关心底层是 Kotlin、Rust 还是 C++。&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-kotlin" data-lang="kotlin">&lt;span class="line">&lt;span class="cl">&lt;span class="k">interface&lt;/span> &lt;span class="nc">GameRepository&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">suspend&lt;/span> &lt;span class="k">fun&lt;/span> &lt;span class="nf">getGameDetails&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">id&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">String&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="n">Game&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">suspend&lt;/span> &lt;span class="k">fun&lt;/span> &lt;span class="nf">startSession&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">config&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">SessionConfig&lt;/span>&lt;span class="p">):&lt;/span> &lt;span class="n">SessionResult&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>ViewModel 只依赖这个接口：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-kotlin" data-lang="kotlin">&lt;span class="line">&lt;span class="cl">&lt;span class="k">class&lt;/span> &lt;span class="nc">GameViewModel&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">private&lt;/span> &lt;span class="k">val&lt;/span> &lt;span class="py">repository&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">GameRepository&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">)&lt;/span> &lt;span class="p">:&lt;/span> &lt;span class="n">ViewModel&lt;/span>&lt;span class="p">()&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>Rust 只是接口的一种实现来源。&lt;/p>
&lt;h2 id="kotlin-侧边界">Kotlin 侧边界
&lt;/h2>&lt;p>Kotlin 保留这些职责：&lt;/p>
&lt;ol>
&lt;li>Compose / View UI；&lt;/li>
&lt;li>Android 生命周期；&lt;/li>
&lt;li>权限、通知、Intent 等平台能力；&lt;/li>
&lt;li>Hilt/Koin 依赖装配；&lt;/li>
&lt;li>UI 状态和一次性事件。&lt;/li>
&lt;/ol>
&lt;p>不要把 Android &lt;code>Context&lt;/code>、&lt;code>Activity&lt;/code>、&lt;code>View&lt;/code> 等平台对象传进 Rust Core。&lt;/p>
&lt;h2 id="rust-侧边界">Rust 侧边界
&lt;/h2>&lt;p>Rust 更适合：&lt;/p>
&lt;ol>
&lt;li>协议解析；&lt;/li>
&lt;li>编解码辅助逻辑；&lt;/li>
&lt;li>复杂业务规则；&lt;/li>
&lt;li>高并发网络核心；&lt;/li>
&lt;li>跨 Android/iOS/桌面复用的能力。&lt;/li>
&lt;/ol>
&lt;p>Rust 不适合直接处理：&lt;/p>
&lt;ol>
&lt;li>Android 生命周期；&lt;/li>
&lt;li>UI 状态；&lt;/li>
&lt;li>权限弹窗；&lt;/li>
&lt;li>依赖注入容器；&lt;/li>
&lt;li>和平台强绑定的对象。&lt;/li>
&lt;/ol>
&lt;h2 id="依赖装配">依赖装配
&lt;/h2>&lt;p>Hilt 负责把 Rust 实现装配成 Domain 接口：&lt;/p>
&lt;div class="highlight">&lt;pre tabindex="0" class="chroma">&lt;code class="language-kotlin" data-lang="kotlin">&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@Module&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="nd">@InstallIn&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">SingletonComponent&lt;/span>&lt;span class="o">::&lt;/span>&lt;span class="k">class&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="k">object&lt;/span> &lt;span class="nc">DataModule&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="nd">@Provides&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">fun&lt;/span> &lt;span class="nf">provideGameRepository&lt;/span>&lt;span class="p">(&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="n">rustService&lt;/span>&lt;span class="p">:&lt;/span> &lt;span class="n">RustGameService&lt;/span>&lt;span class="p">,&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">):&lt;/span> &lt;span class="n">GameRepository&lt;/span> &lt;span class="p">{&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="k">return&lt;/span> &lt;span class="n">RustGameRepository&lt;/span>&lt;span class="p">(&lt;/span>&lt;span class="n">rustService&lt;/span>&lt;span class="p">)&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl"> &lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;span class="line">&lt;span class="cl">&lt;span class="p">}&lt;/span>
&lt;/span>&lt;/span>&lt;/code>&lt;/pre>&lt;/div>&lt;p>这样 UI 层不需要知道 Rust 细节。&lt;/p>
&lt;h2 id="回看清单">回看清单
&lt;/h2>&lt;ol>
&lt;li>Rust Core 应该服务架构边界，而不是制造新的耦合。&lt;/li>
&lt;li>Domain 层定义稳定协议，Kotlin/Rust 都围绕它实现。&lt;/li>
&lt;li>FFI 传输模型要简单、明确、可版本化。&lt;/li>
&lt;li>平台对象留在 Kotlin，核心逻辑放到 Rust。&lt;/li>
&lt;li>引入 Rust 前先问：这段逻辑是否真的需要跨平台或高性能核心。&lt;/li>
&lt;/ol></description></item></channel></rss>