<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>MacOS on 落日余晖</title>
    <link>https://is-i7.cn/tags/macos/</link>
    <description>Recent content in MacOS on 落日余晖</description>
    <generator>Hugo</generator>
    <language>zh-cn</language>
    <lastBuildDate>Mon, 07 Sep 2026 14:43:21 +0800</lastBuildDate>
    <atom:link href="https://is-i7.cn/tags/macos/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>飞书多开指南:一份 .app 改出完全隔离的第二实例</title>
      <link>https://is-i7.cn/posts/feishu-multi-instance-guide/</link>
      <pubDate>Mon, 07 Sep 2026 14:43:21 +0800</pubDate>
      <guid>https://is-i7.cn/posts/feishu-multi-instance-guide/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;目标:一台 macOS 上同时运行&lt;strong&gt;两个相互隔离的飞书&lt;/strong&gt;(主实例 &lt;code&gt;Lark.app&lt;/code&gt; + 第二实例 &lt;code&gt;Lark-org2.app&lt;/code&gt;),登录不同账号;数据目录、TCC/通知身份互不影响;第二实例不与主实例抢全局快捷键、不会被官方升级覆盖、菜单栏图标可区分。
本文&lt;strong&gt;自包含&lt;/strong&gt;:不依赖任何现成脚本,按步骤逐条执行即可完成。实测版本:143.0.7499.203(macOS,Apple Silicon)。
这是飞书折腾系列第三篇:撤回机制与加密的逆向原理见&lt;a href=&#34;https://is-i7.cn/posts/feishu-recall-reverse-engineering/&#34;&gt;《飞书撤回消息逆向分析》&lt;/a&gt;,防撤回 asar 补丁见&lt;a href=&#34;https://is-i7.cn/posts/feishu-anti-recall-patch-guide/&#34;&gt;《飞书防撤回补丁复现指南》&lt;/a&gt;。&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;0-前置条件&#34;&gt;0. 前置条件&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;项&lt;/th&gt;
          &lt;th&gt;要求&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;系统&lt;/td&gt;
          &lt;td&gt;macOS(Apple Silicon;Intel 需把下文 clang 的 &lt;code&gt;-arch&lt;/code&gt; 换成 &lt;code&gt;x86_64&lt;/code&gt; 自测)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;源应用&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;/Applications/Lark.app&lt;/code&gt; 已安装(是否打了别的补丁无所谓,副本会原样带上)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;工具&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;python3&lt;/code&gt; + &lt;code&gt;Pillow&lt;/code&gt;(&lt;code&gt;pip3 install pillow&lt;/code&gt;)、&lt;code&gt;clang&lt;/code&gt;(Xcode CLT)、&lt;code&gt;codesign&lt;/code&gt;/&lt;code&gt;install_name_tool&lt;/code&gt;/&lt;code&gt;otool&lt;/code&gt;(随 CLT)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;磁盘&lt;/td&gt;
          &lt;td&gt;预留一份飞书体积(~1.5GB)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;约定:下文 &lt;code&gt;$VERDIR&lt;/code&gt; 一律指当前飞书的版本目录,先取好:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;VERDIR&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;$(&lt;/span&gt;ls &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;/Applications/Lark.app/Contents/Frameworks/Lark Framework.framework/Versions&amp;#34;&lt;/span&gt; | grep -E &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#39;^[0-9]&amp;#39;&lt;/span&gt; | sort -V | tail -1&lt;span style=&#34;color:#ff79c6&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;FW&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;/Applications/Lark-org2.app/Contents/Frameworks/Lark Framework.framework/Versions/&lt;/span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;$VERDIR&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;DATA&lt;/span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;$HOME&lt;/span&gt;&lt;span style=&#34;color:#f1fa8c&#34;&gt;/Library/Application Support/LarkShell-org2&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;h2 id=&#34;1-步骤一复制-app-并改身份&#34;&gt;1. 步骤一:复制 .app 并改身份&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cp -R /Applications/Lark.app /Applications/Lark-org2.app
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/usr/libexec/PlistBuddy -c &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;Set :CFBundleIdentifier com.electron.lark.org2&amp;#34;&lt;/span&gt; /Applications/Lark-org2.app/Contents/Info.plist
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/usr/libexec/PlistBuddy -c &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;Set :CFBundleName Feishu2&amp;#34;&lt;/span&gt;                       /Applications/Lark-org2.app/Contents/Info.plist
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/usr/libexec/PlistBuddy -c &lt;span style=&#34;color:#f1fa8c&#34;&gt;&amp;#34;Set :CFBundleDisplayName 飞书2&amp;#34;&lt;/span&gt;                  /Applications/Lark-org2.app/Contents/Info.plist 2&amp;gt;/dev/null &lt;span style=&#34;color:#ff79c6&#34;&gt;||&lt;/span&gt; &lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;改 &lt;code&gt;CFBundleIdentifier&lt;/code&gt; 后,macOS 视其为独立 app:TCC(屏幕录制/麦克风等)、通知、
Dock 固定各自一套,与主实例互不干扰。&lt;/p&gt;</description>
    </item>
    <item>
      <title>飞书防撤回补丁复现指南:手工 patch asar 的 19 处注入</title>
      <link>https://is-i7.cn/posts/feishu-anti-recall-patch-guide/</link>
      <pubDate>Mon, 07 Sep 2026 14:35:00 +0800</pubDate>
      <guid>https://is-i7.cn/posts/feishu-anti-recall-patch-guide/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;目标:一名工程师&lt;strong&gt;不依赖任何现成脚本&lt;/strong&gt;,仅凭本文在任何一台 macOS 机器上,对飞书(Lark.app)手工完成防撤回补丁的注入、验证与排障。
撤回机制与加密等深层逆向原理见上一篇&lt;a href=&#34;https://is-i7.cn/posts/feishu-recall-reverse-engineering/&#34;&gt;《飞书撤回消息逆向分析》&lt;/a&gt;;本文只讲&lt;strong&gt;怎么做&lt;/strong&gt;。
实测版本:143.0.7499.203(macOS,Electron/Chromium 143,补丁 v31c)。
131 及更早版本的锚点差异较大(布局都不同),但方法论完全一致,见文末「升级适配」。&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr&gt;
&lt;h2 id=&#34;0-前置条件&#34;&gt;0. 前置条件&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;项&lt;/th&gt;
          &lt;th&gt;要求&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;系统&lt;/td&gt;
          &lt;td&gt;macOS(Apple Silicon / Intel 均可),已安装飞书 &lt;code&gt;/Applications/Lark.app&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;工具&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;node&lt;/code&gt;、&lt;code&gt;npx&lt;/code&gt;、&lt;code&gt;python3&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;npm 包&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;@electron/asar&lt;/code&gt;(npx 自动拉取)、&lt;code&gt;esbuild&lt;/code&gt;(语法校验用,npx 自动拉取)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;权限&lt;/td&gt;
          &lt;td&gt;能读写 &lt;code&gt;/Applications/Lark.app/Contents/...&lt;/code&gt;(默认可写)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;&lt;strong&gt;关键事实(先记住,贯穿全文)&lt;/strong&gt;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;撤回推送会把消息 content &lt;strong&gt;一并抹空&lt;/strong&gt;(本地 DB 和前端都拿不到原文)——所以必须「渲染时存档、撤回时还原」,只改渲染布尔位只会得到空气泡。&lt;/li&gt;
&lt;li&gt;普通消息撤回的&lt;strong&gt;原生样式&lt;/strong&gt;(居中灰字「你撤回了一条消息」)来自 &lt;code&gt;featureTypeParser&lt;/code&gt; 的 RECALLED 分支;行级闸门 return 的提示条组件&lt;strong&gt;只服务话题根消息&lt;/strong&gt;(threadMessageType===1)。&lt;/li&gt;
&lt;li&gt;原生「（已编辑）」标记&lt;strong&gt;不是 richText 数据元素&lt;/strong&gt;,是富文本引擎在渲染尾部按 &lt;code&gt;message.editVersion&lt;/code&gt; 标志挂的 suffix 槽位——所以撤回标记要改引擎门槛,而不是往数据里塞元素。&lt;/li&gt;
&lt;li&gt;飞书主进程名是 &lt;strong&gt;Feishu&lt;/strong&gt;(&lt;code&gt;pgrep -x Lark&lt;/code&gt; 匹配不到);重启 = &lt;code&gt;pkill -x Feishu&lt;/code&gt; + &lt;code&gt;open -a Lark.app&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;聊天窗口与设置窗口共用 &lt;code&gt;profile_main&lt;/code&gt; 分区的 localStorage(&lt;code&gt;file://&lt;/code&gt; origin)——这是开关跨窗口生效的基础。&lt;/li&gt;
&lt;li&gt;Info.plist 里的 &lt;code&gt;AsarIntegrity&lt;/code&gt;(SHA256)校验&lt;strong&gt;实测不拦截修改后的 asar&lt;/strong&gt;(改包后正常启动,校验逻辑只记录)。&lt;/li&gt;
&lt;li&gt;开关语义:&lt;strong&gt;开&lt;/strong&gt;(默认,&lt;code&gt;frk_hide&lt;/code&gt; 不存在)= 显示原文 + 末位「（已撤回）」;&lt;strong&gt;关&lt;/strong&gt;(&lt;code&gt;frk_hide=1&lt;/code&gt;)= 完全恢复原生行为(parser 保留 isRecalled → 原生 RECALLED 居中灰字提示条,与未打补丁一模一样)。&lt;/li&gt;
&lt;/ol&gt;
&lt;hr&gt;
&lt;h2 id=&#34;1-总流程&#34;&gt;1. 总流程&lt;/h2&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;备份 asar(3 个) ──► 解包 ──► 定位锚点(特征串 grep) ──► 六类补丁逐文件修改
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   ──► 语法校验(node --check + esbuild 双检) ──► 打包 ──► 安装 ──► 重启飞书
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   ──► 验证(包内 grep 标记 → 功能测试 → 必要时读 leveldb 诊断)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;涉及的三个 asar(相对 &lt;code&gt;webcontent/&lt;/code&gt; 目录;143 起 &lt;strong&gt;messenger-next.asar 已取消&lt;/strong&gt;并入 messenger.asar):&lt;/p&gt;</description>
    </item>
    <item>
      <title>飞书撤回消息逆向分析:原文是怎么被抹掉的</title>
      <link>https://is-i7.cn/posts/feishu-recall-reverse-engineering/</link>
      <pubDate>Mon, 07 Sep 2026 14:10:00 +0800</pubDate>
      <guid>https://is-i7.cn/posts/feishu-recall-reverse-engineering/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;分析对象:飞书 macOS 客户端 &lt;code&gt;/Applications/Lark.app&lt;/code&gt;(v131.0.6778.268 起分析,143.0.7499.203 复验,Electron/Chromium 内核)。
方法:静态逆向(strings / 反汇编 / asar 解包)+ 真实撤回的落盘观察 + 前端 asar 补丁注入的实测迭代。
本文讲&lt;strong&gt;原理与逆向过程&lt;/strong&gt;;拿着结论去动手改客户端,见下一篇&lt;a href=&#34;https://is-i7.cn/posts/feishu-anti-recall-patch-guide/&#34;&gt;《飞书防撤回补丁复现指南》&lt;/a&gt;。&lt;/p&gt;&lt;/blockquote&gt;
&lt;h2 id=&#34;tldr撤回是怎么实现的&#34;&gt;TL;DR:撤回是怎么实现的&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;撤回 = 服务端下发一条带撤回标记的消息资源更新,客户端把本地 SQLite 行打上 &lt;code&gt;is_recalled=1&lt;/code&gt; 等标记列,前端按标记切换渲染成「撤回了一条消息」提示。而原始 content 会被一并抹掉&lt;/strong&gt;(实测:绕过渲染门之后,被撤回的消息渲染成空气泡;DB 加载与撤回推送两路拿到的 content 均为空)。所以单纯改前端的布尔分支只能得到空气泡——&lt;strong&gt;防撤回必须「渲染即存档、撤回时还原」&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;完整链路:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;发起方&lt;/strong&gt;:前端菜单 → JSB 命令 &lt;code&gt;RECALL_GROUP_MESSAGE&lt;/code&gt; / &lt;code&gt;RECALL_MESSAGE&lt;/code&gt; → Rust 核心 &lt;code&gt;liblark.dylib&lt;/code&gt;(&lt;code&gt;lark-message&lt;/code&gt; 模块)→ 长连接(pipe/websocket protobuf,非 REST)→ 服务端。日志串:&lt;code&gt;recall_message callback for id:&lt;/code&gt; / &lt;code&gt;recall message success: id=&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;接收方&lt;/strong&gt;:服务端推送更新后的 Message protobuf(字段含 &lt;code&gt;is_recalled / recaller_identity / recall_type / recall_user_id&lt;/code&gt;)→ &lt;code&gt;lark-message/src/logic/dependencies/processor.rs&lt;/code&gt; 校验(&lt;code&gt;chat recall message validate failed, recaller not found&lt;/code&gt; 等)→ 更新本地库 → 通知前端。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;本地库&lt;/strong&gt;:SQLCipher 加密的 SQLite,&lt;code&gt;messages&lt;/code&gt; 表同一行内:&lt;code&gt;content BLOB&lt;/code&gt;(原始内容)+ &lt;code&gt;is_recalled BOOLEAN&lt;/code&gt; + &lt;code&gt;recaller_id BIGINT&lt;/code&gt; + &lt;code&gt;recaller_identity INTEGER&lt;/code&gt; + &lt;code&gt;recall_type INTEGER&lt;/code&gt; + &lt;code&gt;recall_user_id BIGINT&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;前端渲染&lt;/strong&gt;(messenger asar,已提取实证代码):
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#282a36;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#8be9fd;font-style:italic&#34;&gt;let&lt;/span&gt;{isRecalled&lt;span style=&#34;color:#ff79c6&#34;&gt;:&lt;/span&gt;r,isDeleted&lt;span style=&#34;color:#ff79c6&#34;&gt;:&lt;/span&gt;a,recallerIdentity&lt;span style=&#34;color:#ff79c6&#34;&gt;:&lt;/span&gt;n}&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;t;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#ff79c6&#34;&gt;return&lt;/span&gt; r &lt;span style=&#34;color:#ff79c6&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;lt;&lt;/span&gt;E recallerIdentity&lt;span style=&#34;color:#ff79c6&#34;&gt;=&lt;/span&gt;{n}&lt;span style=&#34;color:#ff79c6&#34;&gt;/&amp;gt;&lt;/span&gt;   &lt;span style=&#34;color:#6272a4&#34;&gt;// &amp;#34;X 撤回了一条消息&amp;#34; 提示条
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#6272a4&#34;&gt;&lt;/span&gt;         &lt;span style=&#34;color:#ff79c6&#34;&gt;:&lt;/span&gt; a &lt;span style=&#34;color:#ff79c6&#34;&gt;?&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;lt;&lt;/span&gt;S.A&lt;span style=&#34;color:#ff79c6&#34;&gt;/&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#ff79c6&#34;&gt;&amp;lt;&lt;/span&gt;N {...e}&lt;span style=&#34;color:#ff79c6&#34;&gt;/&amp;gt;&lt;/span&gt;     &lt;span style=&#34;color:#6272a4&#34;&gt;// 正常消息
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;以及 &lt;code&gt;function L(e){return !e.isRecalled &amp;amp;&amp;amp; !!e.content.filePath}&lt;/code&gt; —— 撤回消息对象上 &lt;code&gt;content&lt;/code&gt; 依然存在,只是被布尔位挡住(但值已被掏空)。&lt;/li&gt;
&lt;li&gt;通知/红点同步收尾:&lt;code&gt;do not push notice to oneself when is recalled&lt;/code&gt;(自己撤回的不推通知)、thread 根消息标记 &lt;code&gt;root_message_is_recalled&lt;/code&gt;、回复计数修正 &lt;code&gt;update reply count for msg has recalled&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;一客户端架构&#34;&gt;一、客户端架构&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;层&lt;/th&gt;
          &lt;th&gt;位置&lt;/th&gt;
          &lt;th&gt;作用&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Electron 主进程&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;Contents/MacOS/Feishu&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;壳、窗口、升级&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;渲染进程&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;Lark Helper (Renderer)&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;加载 &lt;code&gt;webcontent/*.asar&lt;/code&gt;(messenger.asar = 聊天 UI)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;aha-service 后台进程&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;Lark Helper --type=backend&lt;/code&gt;(加载 liblark)&lt;/td&gt;
          &lt;td&gt;&lt;strong&gt;Rust 核心&lt;/strong&gt;:同步、存储、JSB 命令&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;核心库&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;Libraries/liblark.dylib&lt;/code&gt;(84MB)&lt;/td&gt;
          &lt;td&gt;全部业务逻辑,Rust 编写,字符串含 &lt;code&gt;lark-message/src/*.rs&lt;/code&gt; 等源码路径&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;DB 层&lt;/td&gt;
          &lt;td&gt;liblark 内静态链接 SQLCipher 4&lt;/td&gt;
          &lt;td&gt;本地库全加密&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;前后端通信:JS Bridge 命令表(全大写,如 &lt;code&gt;GET_CHAT_MESSAGES&lt;/code&gt;、&lt;code&gt;RECALL_GROUP_MESSAGE&lt;/code&gt;、&lt;code&gt;HANDLE_PIPE_PACKET&lt;/code&gt;、&lt;code&gt;HANDLE_WEBSOCKET_PACKET&lt;/code&gt;);服务端长连接推送走 pipe/websocket 包,protobuf 编码。&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
