<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Shiyan</title><description>Stay Free</description><link>https://blog.zlion.top/</link><templateTheme>Firefly</templateTheme><templateThemeVersion>6.16.8</templateThemeVersion><templateThemeUrl>https://github.com/CuteLeaf/Firefly</templateThemeUrl><lastBuildDate>2026年10月1日 13:49:53</lastBuildDate><item><title>Firefly 博客接入 Pages CMS：浏览器里写文章，不用本地环境</title><link>https://blog.zlion.top/posts/firefly-pages-cms-setup/</link><guid isPermaLink="true">https://blog.zlion.top/posts/firefly-pages-cms-setup/</guid><description>给 Firefly（Astro）博客仓库放一份 .pages.yml，接入 Pages CMS 后在浏览器里就能写文章、传图片、改独立页面，保存即提交 GitHub 并自动部署；附完整配置与踩坑记录</description><pubDate>Sat, 12 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;本文档面向使用 Firefly（Astro）主题、仓库托管在 GitHub 的博主，涵盖 Pages CMS 的接入步骤、&lt;code&gt;.pages.yml&lt;/code&gt; 逐段讲解与踩坑记录。
&lt;strong&gt;适用主题：&lt;/strong&gt; Firefly（Astro 内容集合架构，其他 Astro 博客同样适用）
&lt;strong&gt;适用平台：&lt;/strong&gt; &lt;a href=&quot;https://app.pagescms.org&quot; target=&quot;_blank&quot;&gt;app.pagescms.org&lt;/a&gt;（浏览器内操作，无需本地环境）&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;一、Pages CMS 是什么&lt;a href=&quot;#一pages-cms-是什么&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;a href=&quot;https://pagescms.org&quot; target=&quot;_blank&quot;&gt;Pages CMS&lt;/a&gt; 是一个架在 GitHub 仓库之上的在线内容管理后台：登录后选好仓库和分支，它把仓库里的 Markdown 文章渲染成可视化的编辑界面，写完点保存就是一次 Git 提交。&lt;/p&gt;&lt;p&gt;对静态博客来说，这条链路非常舒服：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;浏览器里写作&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;Pages CMS 保存&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;GitHub 自动 commit&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;部署平台构建&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;网站更新&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;浏览器里写作&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;Pages CMS 保存&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;GitHub 自动 commit&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;部署平台构建&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;网站更新&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;不用开电脑上的编辑器，不用敲 git 命令，手机、平板、别人的电脑都能写；部署平台（Vercel / Cloudflare Pages / EdgeOne 等）本来就会在收到提交后自动构建，所以「保存」约等于「发布」。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;建议&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;如果你在本地已经有一套顺手的写作流程，Pages CMS 也不冲突：出门在外用 CMS 补一篇，回来 git pull 接着写就行，两边操作的是同一个仓库。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二、接入三步走&lt;a href=&quot;#二接入三步走&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;2.1 仓库根目录新建 &lt;code&gt;.pages.yml&lt;/code&gt;&lt;a href=&quot;#21-仓库根目录新建-pagesyml&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这是 Pages CMS 的唯一配置文件，它读取内容集合、字段、媒体目录全靠它。一份能直接用的完整配置在&lt;a href=&quot;#%E5%9B%9B%E5%AE%8C%E6%95%B4%E9%85%8D%E7%BD%AE%E5%8F%AF%E7%9B%B4%E6%8E%A5%E6%8A%84&quot;&gt;第四节&lt;/a&gt;，抄进去先跑通，再看第五节的逐段讲解按需调整。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2 建好媒体上传目录&lt;a href=&quot;#22-建好媒体上传目录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;配置里会把上传图片的目录指到 &lt;code&gt;public/images&lt;/code&gt;，空目录 Git 不会跟踪，先放一个占位文件：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;public/images&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;touch&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;public/images/.gitkeep&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.3 打开 CMS 确认&lt;a href=&quot;#23-打开-cms-确认&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;登录 &lt;a href=&quot;https://app.pagescms.org&quot; target=&quot;_blank&quot;&gt;app.pagescms.org&lt;/a&gt;（用 GitHub 账号授权），选中你的仓库和分支，左侧就会出现配置里定义的内容集合和 Media 面板。侧边栏 Admin 里的 &lt;strong&gt;Configuration&lt;/strong&gt; 页面显示的就是 &lt;code&gt;.pages.yml&lt;/code&gt; 本身，以后想改配置也可以直接在这个输入框里改，保存即提交。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;提示&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Pages CMS 按分支读配置，确认页面地址里的分支和你部署用的分支一致（Firefly 默认是 &lt;code&gt;master&lt;/code&gt;）。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三、避坑前置：字段必须覆盖 front matter&lt;a href=&quot;#三避坑前置字段必须覆盖-front-matter&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;这一节是整篇文章最重要的一句话，先说结论：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;警告&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;CMS 编辑器里没有的字段，保存时会被直接从 front matter 里删掉。&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Pages CMS 保存一篇文章时，是按 &lt;code&gt;.pages.yml&lt;/code&gt; 里定义的字段列表重新生成 front matter 的。我在接入过程中就实际中过招：旧配置里没有定义 &lt;code&gt;author&lt;/code&gt; 字段，用 CMS 保存一次文章后，front matter 里的 &lt;code&gt;author: 世琰&lt;/code&gt; 就没了。&lt;/p&gt;&lt;p&gt;所以动手之前，先翻一下自己文章的 front matter，把所有想保留的键都在配置里给出对应字段——包括 &lt;code&gt;author&lt;/code&gt;、&lt;code&gt;password&lt;/code&gt;、&lt;code&gt;series&lt;/code&gt; 这类低频字段。Firefly 主题自带的字段全集见 &lt;code&gt;src/content.config.ts&lt;/code&gt;，照着抄不会漏。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;四、完整配置（可直接抄）&lt;a href=&quot;#四完整配置可直接抄&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# Pages CMS 配置，字段与 src/content.config.ts 的 Astro 内容集合一一对应；&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 留空的字段保存时会被自动省略，交给 Astro 的 zod 默认值处理，不会写出 null / &quot;&quot;。&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;media&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;input&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;public/images&lt;/span&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;# 上传的文件存到仓库的这个目录&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;output&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;/images&lt;/span&gt;&lt;span&gt;             &lt;/span&gt;&lt;span&gt;# 写进文章里的 URL 前缀&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;rename&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;random&lt;/span&gt;&lt;span&gt;              &lt;/span&gt;&lt;span&gt;# 上传时随机重命名，避免中文文件名和重名覆盖&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;content&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# ── 文章 ─────────────────────────────────────────────&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;posts&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;文章&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;collection&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;src/content/posts&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;format&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;yaml-frontmatter&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;filename&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;template&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;{year}-{month}-{day}-{primary}.md&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;field&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;           &lt;/span&gt;&lt;span&gt;# 新建文章时弹出文件名输入框，自己起名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;view&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;fields&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;draft&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;category&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;primary&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;sort&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;23&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;24&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;sort&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;25&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;order&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;desc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;26&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;# 集合会把目录里的图片也当成条目列出来，把已有配图的文件名列进来即可&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;27&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;exclude&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;cover.png&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;hero.png&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;my-cover.png&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;28&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;fields&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;29&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;30&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;标题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;31&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;32&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;required&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;33&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;34&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;发布日期&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;35&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;36&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;required&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;37&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;updated&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;38&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;更新日期&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;39&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;40&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;&apos;&lt;/span&gt;&lt;span&gt;           &lt;/span&gt;&lt;span&gt;# 不自动填今天，需要时再手动选&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;41&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;draft&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;42&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;草稿&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;43&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;boolean&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;44&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;45&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;46&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;摘要&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;47&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;48&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;49&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;封面图&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;50&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;51&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;category&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;52&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;分类&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;53&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;54&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;tags&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;55&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;标签&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;56&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;57&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;list&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;58&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;pinned&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;59&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;置顶&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;60&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;boolean&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;61&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;62&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;lang&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;63&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;语言&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;64&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;65&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;留空跟随站点默认&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;66&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;author&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;67&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;作者&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;68&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;69&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;comment&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;70&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;开启评论&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;71&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;boolean&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;72&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;73&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;password&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;74&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;访问密码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;75&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;76&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;留空则不加密&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;77&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;passwordHint&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;78&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;密码提示&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;79&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;80&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;series&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;81&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;系列名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;82&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;83&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;seriesOrder&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;84&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;系列序号&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;85&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;number&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;86&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;sourceLink&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;87&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;原文链接&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;88&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;89&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;licenseName&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;90&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;许可证名称&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;91&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;92&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;licenseUrl&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;93&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;许可证链接&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;94&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;95&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;96&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;正文&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;97&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;rich-text&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;98&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;99&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# ── 动态（说说 / 微博式短内容）────────────────────────&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;100&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;dynamic&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;101&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;动态&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;102&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;collection&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;103&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;src/content/dynamic&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;104&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;format&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;yaml-frontmatter&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;105&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;filename&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;{year}-{month}-{day}-{hour}{minute}{second}.md&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;106&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;view&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;107&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;fields&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;pinned&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;108&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;primary&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;109&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;sort&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;110&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;111&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;sort&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;112&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;order&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;desc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;113&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;fields&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;114&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;115&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;发布时间&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;116&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;117&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;required&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;118&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;options&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;119&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;120&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;format&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;yyyy-MM-dd HH:mm:ss&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;121&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;pinned&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;122&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;置顶&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;123&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;boolean&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;124&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;125&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;location&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;126&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;位置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;127&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;128&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;129&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;内容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;130&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;rich-text&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;131&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;132&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# ── 独立页面（about / friends / guestbook）────────────&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;133&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# 路由在主题里是写死的，禁用新建 / 重命名 / 删除&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;134&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;spec&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;135&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;独立页面&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;136&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;collection&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;137&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;src/content/spec&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;138&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;format&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;yaml-frontmatter&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;139&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;operations&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;140&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;141&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;rename&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;142&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;delete&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;143&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;view&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;144&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;fields&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;145&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;primary&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;146&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;fields&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;147&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;148&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;页面标题&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;149&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;150&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;151&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;页面描述&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;152&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;153&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;154&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;页面内容&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;155&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;span&gt;           &lt;/span&gt;&lt;span&gt;# 纯文本源码模式，防止富文本弄乱 JSX&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;156&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;157&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;# ── 项目展示（可选，不需要就整段删掉）────────────────&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;158&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;projects&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;159&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;项目&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;160&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;collection&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;161&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;src/content/projects&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;162&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;format&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;yaml-frontmatter&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;163&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;filename&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;164&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;template&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;{primary}.md&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;165&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;field&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;create&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;166&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;exclude&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;images&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;167&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;view&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;168&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;fields&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;status&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;order&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;169&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;primary&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;170&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;sort&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;171&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;      &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;172&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;sort&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;173&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;order&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;desc&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;174&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;fields&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;175&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;title&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;176&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;项目名&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;177&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;178&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;required&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;179&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;180&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;发布日期&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;181&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;182&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;required&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;183&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;draft&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;184&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;草稿&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;185&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;boolean&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;186&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;default&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;187&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;order&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;188&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;排序权重&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;189&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;number&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;190&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;越大越靠前&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;191&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;192&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;描述&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;193&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;text&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;194&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;195&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;封面图&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;196&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;image&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;197&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;status&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;198&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;状态&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;199&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;select&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;200&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;options&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;201&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;values&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;planning&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;developing&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;archived&lt;/span&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;202&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;placeholder&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;未设置&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;203&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;tags&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;204&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;标签&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;205&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;206&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;list&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;207&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;lang&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;208&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;语言&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;209&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;210&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;link&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;211&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;相关链接&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;212&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;object&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;213&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;list&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;214&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;fields&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;215&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;216&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;名称&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;217&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;218&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;icon&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;219&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;图标&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;220&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;221&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;description&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;Iconify 图标名，如 fa7-brands:github&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;222&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;          &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;value&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;223&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;链接地址&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;224&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;            &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;225&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;      &lt;/span&gt;&lt;/span&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;body&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;226&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;label&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;详情&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;227&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;        &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;rich-text&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;提示&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;我的仓库里 &lt;code&gt;exclude&lt;/code&gt; 实际排除了 30 个历史配图文件名，上面为了可读性缩成了示例。把你自己 &lt;code&gt;src/content/posts&lt;/code&gt; 目录下的图片文件名列全就行。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;五、配置逐段拆解&lt;a href=&quot;#五配置逐段拆解&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;5.1 media：图片传到哪、URL 长什么样&lt;a href=&quot;#51-media图片传到哪url-长什么样&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&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;code&gt;input&lt;/code&gt;&lt;/td&gt;&lt;td&gt;上传的文件在仓库里的实际存放路径&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;output&lt;/code&gt;&lt;/td&gt;&lt;td&gt;写进文章 front matter / 正文里的 URL 前缀&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;rename&lt;/code&gt;&lt;/td&gt;&lt;td&gt;上传重命名策略：&lt;code&gt;random&lt;/code&gt; 随机名 / &lt;code&gt;safe&lt;/code&gt; 拼接原名的安全字符 / &lt;code&gt;false&lt;/code&gt; 保留原名&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;Firefly 的封面和正文图片同时支持相对路径、&lt;code&gt;/&lt;/code&gt; 开头的 public 路径和远程 URL，所以 &lt;code&gt;input: public/images&lt;/code&gt; + &lt;code&gt;output: /images&lt;/code&gt; 是最省事的组合：所有图片统一进 public，写进文章的就是 &lt;code&gt;/images/xxx.png&lt;/code&gt;，本地和线上都能直接访问。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5.2 filename：新文件的命名规则&lt;a href=&quot;#52-filename新文件的命名规则&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;{year}&lt;/code&gt; &lt;code&gt;{month}&lt;/code&gt; &lt;code&gt;{day}&lt;/code&gt; &lt;code&gt;{hour}&lt;/code&gt; &lt;code&gt;{minute}&lt;/code&gt; &lt;code&gt;{second}&lt;/code&gt;：创建时间，零填充；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;{primary}&lt;/code&gt;：列表视图的主字段（一般是标题），会做 slug 化处理；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;field: create&lt;/code&gt;：新建时弹出文件名输入框。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;文章的文件名（去掉扩展名）就是 URL 的一部分，所以发布后尽量别再改名。动态这类短内容用纯时间戳命名，完全不用操心。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5.3 view：列表怎么排&lt;a href=&quot;#53-view列表怎么排&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;fields&lt;/code&gt; 是列表里显示的列，&lt;code&gt;primary&lt;/code&gt; 是主标题列，&lt;code&gt;default.sort&lt;/code&gt; + &lt;code&gt;order&lt;/code&gt; 控制默认排序。文章按发布日期倒序，符合直觉。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5.4 exclude：把图片从条目列表里藏起来&lt;a href=&quot;#54-exclude把图片从条目列表里藏起来&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Pages CMS 的集合会&lt;strong&gt;递归&lt;/strong&gt;列出目录下的所有文件——包括 png。不处理的话，文章列表里会混进一堆「空条目」。&lt;code&gt;exclude&lt;/code&gt; 按&lt;strong&gt;精确文件名&lt;/strong&gt;匹配（不支持通配符），把已有配图的文件名列进去就好；新图片一律走 Media 上传到 &lt;code&gt;public/images&lt;/code&gt;，别再往内容目录里放。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5.5 operations：给危险操作上锁&lt;a href=&quot;#55-operations给危险操作上锁&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;create&lt;/code&gt; / &lt;code&gt;rename&lt;/code&gt; / &lt;code&gt;delete&lt;/code&gt; 三个开关控制集合的新建、重命名、删除。独立页面的路由在主题里是写死的（&lt;code&gt;about.astro&lt;/code&gt;、&lt;code&gt;friends.astro&lt;/code&gt;、&lt;code&gt;guestbook.astro&lt;/code&gt; 分别读固定文件），误删一个页面就是 404，所以全部禁用。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5.6 date 字段的 options&lt;a href=&quot;#56-date-字段的-options&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;- &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;published&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;type&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;date&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;options&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;time&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;# 带时间选择器&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;    &lt;/span&gt;&lt;span&gt;format&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&apos;yyyy-MM-dd HH:mm:ss&apos;&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;# 写入文件的格式（date-fns 语法）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;default: &apos;&apos;&lt;/code&gt; 可以阻止日期字段自动填当前时间——&lt;code&gt;updated&lt;/code&gt; 用得上，需要时再手动选。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;六、踩坑记录&lt;a href=&quot;#六踩坑记录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;6.1 日期必须保持「裸格式」，否则构建直接炸&lt;a href=&quot;#61-日期必须保持裸格式否则构建直接炸&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Firefly 的内容 schema 里 &lt;code&gt;published&lt;/code&gt; 是 &lt;code&gt;z.date()&lt;/code&gt;，Astro 解析 front matter 时只把&lt;strong&gt;不带引号&lt;/strong&gt;的日期识别成 Date：&lt;code&gt;published: 2026-09-12&lt;/code&gt; 没问题，&lt;code&gt;published: &quot;2026-09-12&quot;&lt;/code&gt; 会变成字符串，构建报错。&lt;/p&gt;&lt;p&gt;Pages CMS 的 date 字段默认写裸日期，正常用不会出事。风险点在于&lt;strong&gt;绕过 CMS 手改文件&lt;/strong&gt;：在 GitHub 网页上编辑时手一抖给日期加了对引号，下次部署就炸。这是静态博客 + 任何 CMS 组合的共性坑，遇到构建失败先查日期。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6.2 空字段不会写出 null，但必填字段别空着&lt;a href=&quot;#62-空字段不会写出-null但必填字段别空着&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;CMS 保存时会自动省略值为空的键，正好符合 Astro schema 的默认值语义，&lt;code&gt;image&lt;/code&gt;、&lt;code&gt;updated&lt;/code&gt; 这类可选字段留空即可。但 &lt;code&gt;title&lt;/code&gt;、&lt;code&gt;published&lt;/code&gt; 这种 schema 里没有默认值的字段一定要填——配置里给它们标了 &lt;code&gt;required: true&lt;/code&gt;，保存时 CMS 会先拦一道。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6.3 纯中文标题生成不了文件名&lt;a href=&quot;#63-纯中文标题生成不了文件名&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;{primary}&lt;/code&gt; 生成文件名时会做 slug 化，纯中文标题 slug 化后是&lt;strong&gt;空字符串&lt;/strong&gt;。所以文章的 filename 模板用日期打头、并在新建时弹出输入框让你自己起名（中英文都行，Firefly 对中文文件名的 URL 处理是正常的）。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6.4 MDX 文件别用富文本编辑器&lt;a href=&quot;#64-mdx-文件别用富文本编辑器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;friends.mdx&lt;/code&gt; 这类 MDX 文件里可能有 JSX 注释和组件语法，富文本编辑器（Tiptap）往返一遍很可能弄乱结构。所以配置里独立页面的正文用 &lt;code&gt;type: text&lt;/code&gt;——一个纯文本框，所见即所得地编辑原始 Markdown，保存时一个字节都不会动。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6.5 复杂 Markdown 建议切到 source 模式&lt;a href=&quot;#65-复杂-markdown-建议切到-source-模式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;文章正文的富文本编辑器右上角可以切换 &lt;strong&gt;editor / source&lt;/strong&gt; 两种模式。日常写段落、插图用 editor 方便；写 callout（&lt;code&gt;&amp;gt; [!NOTE]&lt;/code&gt;）、复杂表格、大量代码块时切到 source 模式，保存的是原始 Markdown，最稳。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6.6 「via Pages CMS」的提交会规范化文件格式&lt;a href=&quot;#66-via-pages-cms的提交会规范化文件格式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;用 CMS 保存过的文件会被重新序列化：front matter 的行内数组会变成块列表、表格对齐会被重排、多余的空行会被整理。这些都是合法的等价改写，git diff 大不代表内容变了。但如果两个配置的字段列表不一致，就会有第三节的「字段被删」问题——这就是为什么字段要配全。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;七、日常使用&lt;a href=&quot;#七日常使用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;7.1 写一篇新文章&lt;a href=&quot;#71-写一篇新文章&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;侧边栏 → 文章 → 右上角新建；&lt;/li&gt;
&lt;li&gt;弹出文件名输入框，填一个 &lt;code&gt;2026-09-12-my-post&lt;/code&gt; 风格的名字；&lt;/li&gt;
&lt;li&gt;填标题（必填）、发布日期默认今天，标签是一行一个；&lt;/li&gt;
&lt;li&gt;正文用富文本编辑器写，需要图片就点工具栏的插图按钮直接上传，图会传到 &lt;code&gt;public/images&lt;/code&gt; 并插入 &lt;code&gt;/images/xxx.png&lt;/code&gt;；&lt;/li&gt;
&lt;li&gt;保存。此时 GitHub 上多一个 commit，部署平台开始构建，一两分钟后线上可见。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;7.2 草稿流程&lt;a href=&quot;#72-草稿流程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;没写完的文章把「草稿」勾上（&lt;code&gt;draft: true&lt;/code&gt;），主题不会把它渲染进列表和详情页，可以放心保存占位。写完取消勾选再保存即发布。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;7.3 改独立页面&lt;a href=&quot;#73-改独立页面&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;关于页、友链、留言板都在「独立页面」里，正文是原始 Markdown 源码模式，改完直接保存。新增独立页面需要先在主题里加路由，光建 md 文件没用，所以配置里禁掉了新建。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;建议&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;本地改完东西想用 CMS 写作之前，记得先 &lt;code&gt;git pull&lt;/code&gt;，反之 CMS 上写完回来也要先 pull——两边是同一个仓库，别让自己处在冲突状态。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;八、故障排查&lt;a href=&quot;#八故障排查&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&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;保存了但网站没更新&lt;/td&gt;&lt;td&gt;部署平台还在构建，或构建失败&lt;/td&gt;&lt;td&gt;去部署平台看构建日志&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;构建失败，报 &lt;code&gt;z.date()&lt;/code&gt; / Invalid date&lt;/td&gt;&lt;td&gt;日期被写成了带引号的字符串&lt;/td&gt;&lt;td&gt;检查该文 front matter 的日期字段&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;构建失败，报某字段类型错误&lt;/td&gt;&lt;td&gt;手改文件时 front matter 格式错了&lt;/td&gt;&lt;td&gt;对照 &lt;code&gt;src/content.config.ts&lt;/code&gt; 检查&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Media 面板打不开 / 上传失败&lt;/td&gt;&lt;td&gt;&lt;code&gt;public/images&lt;/code&gt; 目录不存在&lt;/td&gt;&lt;td&gt;建目录并提交 &lt;code&gt;.gitkeep&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;文章列表里出现图片「条目」&lt;/td&gt;&lt;td&gt;&lt;code&gt;exclude&lt;/code&gt; 没覆盖到新图片&lt;/td&gt;&lt;td&gt;补 exclude，或把图移去 &lt;code&gt;public/images&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;改了 &lt;code&gt;.pages.yml&lt;/code&gt; 没生效&lt;/td&gt;&lt;td&gt;看错了分支，或页面是旧缓存&lt;/td&gt;&lt;td&gt;确认分支一致后刷新页面&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;注意&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;构建失败时部署平台上的还是上一个成功版本，网站不会白屏，但你的修改也不会生效。修好 front matter 再推一次即可。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;九、结语&lt;a href=&quot;#九结语&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;整套方案的本质是把「能改仓库文件的 GitHub 账号」变成一个带表单校验和媒体库的写作后台：配置成本只有一份 &lt;code&gt;.pages.yml&lt;/code&gt;，收益是随时随地可写、格式有 CMS 兜底、提交历史照样干净。&lt;/p&gt;&lt;p&gt;如果你也在用 Firefly，欢迎直接抄第四节的配置；踩到别的坑欢迎来&lt;a href=&quot;/guestbook/&quot;&gt;留言板&lt;/a&gt;交流。&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;文档版本：&lt;/strong&gt; 2026-09-12
&lt;strong&gt;适用主题：&lt;/strong&gt; Firefly（Astro 内容集合架构）
&lt;strong&gt;适用平台：&lt;/strong&gt; app.pagescms.org / Vercel / Cloudflare Pages / EdgeOne Pages 等自动部署平台&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;</content:encoded></item><item><title>个人主页重写：Vue 3 毛玻璃 Bento + 洛雪音源</title><link>https://blog.zlion.top/posts/zlion-home-vue3/</link><guid isPermaLink="true">https://blog.zlion.top/posts/zlion-home-vue3/</guid><description>用 Vue 3 + Vite 重写个人导航主页：唯一运行时依赖是 vue，构建产物 gzip 约 60KB。毛玻璃 Bento 布局 + 全配置驱动的「探索更多」面板（新闻/热榜/音乐/Epic 限免/历史上的今天/站点监控）；音乐播放器接上洛雪音源，自定义音源脚本跑在 serverless 函数里。零环境变量部署到 Vercel，fork 改一个 config.js 就能变成你自己的主页</description><pubDate>Sat, 12 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;在线访问：&lt;/strong&gt; &lt;a href=&quot;https://www.zlion.top&quot; target=&quot;_blank&quot;&gt;www.zlion.top&lt;/a&gt; ｜ &lt;strong&gt;开源仓库：&lt;/strong&gt; &lt;a href=&quot;https://github.com/Zlion-Y/homepage&quot; target=&quot;_blank&quot;&gt;Zlion-Y/homepage&lt;/a&gt;
布局思路最初参考了 &lt;a href=&quot;https://github.com/imsyy/home&quot; target=&quot;_blank&quot;&gt;imsyy/home&lt;/a&gt;（MIT License，已存档），在此致谢——除此之外没有搬它的代码，依赖也全部换掉了。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;主页效果：壁纸背景 + 毛玻璃卡片&quot; loading=&quot;lazy&quot; width=&quot;1440&quot; height=&quot;801&quot; src=&quot;/_astro/preview.Cn3XdYvG_Z48Bu6.webp&quot; /&gt;&lt;figcaption&gt;主页效果：壁纸背景 + 毛玻璃卡片&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;
&lt;section&gt;&lt;h2&gt;为什么自己写一份&lt;a href=&quot;#为什么自己写一份&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;想要的东西其实很简单：&lt;strong&gt;站点导航 + 一言 + 时钟 + 天气 + 音乐&lt;/strong&gt;。imsyy/home 的布局我很喜欢，但它已经归档不再维护，而且 Element Plus、Pinia、APlayer、Swiper 一整套对一个导航页来说太重了。于是用 Vue 3 + Vite 重写了一份：&lt;strong&gt;唯一运行时依赖就是 vue 本身&lt;/strong&gt;，构建产物 gzip 约 60KB（JS 52KB + CSS 9KB）。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;功能一览&lt;a href=&quot;#功能一览&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;毛玻璃 Bento 布局&lt;/strong&gt;：一言、时钟、天气长卡、网站列表小卡自由拼装，移动端自动降级单列&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;一言&lt;/strong&gt;：Hitokoto API，失败自动兜底本地语句，点卡片换一句&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实时时钟&lt;/strong&gt;：农历 + 节日倒数&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;实时天气长卡&lt;/strong&gt;：uapis 聚合接口，&lt;strong&gt;免 Key&lt;/strong&gt;、按访客 IP 自动定位到县级（IPv6 正常），湿度/体感/AQI、未来几天高低温双曲线，可固定城市&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;博客更新卡&lt;/strong&gt;：自动拉取博客 RSS 展示最新 3 篇文章，卡头带 GitHub / 邮箱等社交图标&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;网站列表&lt;/strong&gt;：一行 3 个紧凑卡片，&lt;code&gt;config.js&lt;/code&gt; 里加站点自动扩展&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;二级「探索更多」面板&lt;/strong&gt;：点左上角 Logo 进入，桌面一屏六卡——
&lt;ul&gt;
&lt;li&gt;每日新闻（60s API）&lt;/li&gt;
&lt;li&gt;多平台热榜（微博/B站/V2EX/IT之家等，平台与顺序可配置）&lt;/li&gt;
&lt;li&gt;音乐播放器（下一节重点）&lt;/li&gt;
&lt;li&gt;Epic 限免&lt;/li&gt;
&lt;li&gt;程序员历史上的今天&lt;/li&gt;
&lt;li&gt;站点监控（访客浏览器直连探测自己各站点，绿红点 + 响应耗时，60 秒自动刷新，无需第三方监控服务）&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;动效&lt;/strong&gt;：卡片悬停 3D 倾斜 + 光泽、自定义圆点光标 + 点击涟漪、卡片错峰浮起&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;细节&lt;/strong&gt;：极光渐变背景随昼夜变色、支持自定义壁纸/随机壁纸 API、页脚建站天数、站名 7 款手写字体一键切换&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;所有卡片都能在 &lt;code&gt;config.js&lt;/code&gt; 里开关与排序。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;音乐播放器：多源自愈 + 洛雪音源&lt;a href=&quot;#音乐播放器多源自愈--洛雪音源&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;播放器本身&lt;a href=&quot;#播放器本身&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;多 Meting 源&lt;strong&gt;并发竞速&lt;/strong&gt;拉歌单，谁先返回用谁，单源故障无感&lt;/li&gt;
&lt;li&gt;每首歌自动在多个源之间探测可用播放链接，断链/过期自愈，全败自动跳下一首&lt;/li&gt;
&lt;li&gt;歌单本地缓存 6 小时，进面板秒开；预载但不自动出声，点了播放才响&lt;/li&gt;
&lt;li&gt;歌词同步滚动居中，点歌词行跳转进度&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;为什么要接洛雪音源&lt;a href=&quot;#为什么要接洛雪音源&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;公共 Meting 接口有个绕不过去的边界：&lt;strong&gt;VIP / 版权受限曲目拿不到完整直链&lt;/strong&gt;——它给的是一段能正常播的 30 秒试听片段，不报错、很难察觉。于是把本地的洛雪音源解析搬到 serverless 上，让「点播放」这件事有一个更可靠的后端。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;请求链路&lt;a href=&quot;#请求链路&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;浏览器                       Vercel 边缘&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│ ① 拉歌单（多源并发竞速）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├──────────────────────────────► 公共 Meting × N&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│ ◄── 谁先返回用谁&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│ ② 取直链（同源，无 CORS）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;├──────────────────────────────► /api/url&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│                                  │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│                                  ├─ 命中 CDN 缓存？直接返回（不进函数）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│                                  │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│                                  └─ 未命中 → 函数内并发多音源解析&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│                                                  │&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│                                                  ├─ 按成绩分波对冲&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│                                                  ├─ 赢家一出即掐断其余&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│                                                  ├─ 直链探活&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│                                                  └─ 连续失败熔断&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│ ◄── 完整直链 ────────────────────────────────────┘&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;│ ③ 解析不到 → 自动降级回 Meting（开着也不影响原本能用的）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;21&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;   &lt;/span&gt;&lt;/span&gt;&lt;span&gt;▼&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;22&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;audio&amp;gt; 播放&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;落到代码里，几个关键设计：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;自定义音源脚本跑在 Vercel 函数里&lt;/strong&gt;（&lt;code&gt;api/&lt;/code&gt; + &lt;code&gt;lib/&lt;/code&gt;，跟主页一起部署），多音源按成绩分波对冲、赢家一出即掐断其余、直链探活、连续失败熔断&lt;/li&gt;
&lt;li&gt;前端调&lt;strong&gt;同源&lt;/strong&gt;的 &lt;code&gt;/api/url&lt;/code&gt;：不需要额外域名、证书、CORS 配置，也不用再养一台服务器&lt;/li&gt;
&lt;li&gt;直链缓存在 CDN 边缘（15 分钟），&lt;strong&gt;命中缓存的请求根本不进函数&lt;/strong&gt;，不消耗调用次数&lt;/li&gt;
&lt;li&gt;解析不到时自动降级回 Meting，开着也不影响原来能用的情况&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;&lt;code&gt;config.js&lt;/code&gt; 里两个开关：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;musicSource&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;proxy&quot;&lt;/span&gt;&lt;span&gt;,    &lt;/span&gt;&lt;span&gt;// &quot;meting&quot; = 只走公共 Meting；&quot;proxy&quot; = 走自带的 serverless 解析&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;musicQuality&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&quot;320k&quot;&lt;/span&gt;&lt;span&gt;,    &lt;/span&gt;&lt;span&gt;// 128k / 320k / flac / flac24bit&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;音源脚本放 &lt;a href=&quot;https://github.com/Zlion-Y/homepage/tree/main/sources&quot; target=&quot;_blank&quot;&gt;&lt;code&gt;sources/&lt;/code&gt;&lt;/a&gt; 一起部署；也可以配 &lt;code&gt;SOURCE_URLS&lt;/code&gt; 环境变量指向在线脚本——改完远端脚本请求一次 &lt;code&gt;/api/health?refresh=1&lt;/code&gt;，函数立刻重装全部音源，&lt;strong&gt;连重新部署都不用&lt;/strong&gt;。部署后打开 &lt;code&gt;/api/health&lt;/code&gt; 能看到装上了哪些音源、各自的平台与失败原因。&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;提醒：函数默认跑在香港（&lt;code&gt;hkg1&lt;/code&gt;，离国内接口最近），实测与国内出口的成功率一致；但这类「直链解析」本身在灰区，建议自用、别公开分发。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;部署&lt;a href=&quot;#部署&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;平台托管（推荐）&lt;a href=&quot;#平台托管推荐&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Vercel / Netlify / Cloudflare Pages 均可，Framework 选 &lt;code&gt;Vite&lt;/code&gt;，根目录 &lt;code&gt;./&lt;/code&gt;、输出目录 &lt;code&gt;dist&lt;/code&gt;、构建命令 &lt;code&gt;npm run build&lt;/code&gt;，&lt;strong&gt;零环境变量&lt;/strong&gt;（免 Key 接口的好处）。&lt;/p&gt;&lt;p&gt;&lt;a href=&quot;https://vercel.com/new/clone?repository-url=https://github.com/Zlion-Y/homepage&amp;amp;project-name=zlion-homepage&amp;amp;repository-name=zlion-homepage&quot; target=&quot;_blank&quot;&gt;&lt;/a&gt;&lt;/p&gt;&lt;figure&gt;&lt;a href=&quot;https://vercel.com/new/clone?repository-url=https://github.com/Zlion-Y/homepage&amp;amp;project-name=zlion-homepage&amp;amp;repository-name=zlion-homepage&quot; target=&quot;_blank&quot;&gt;&lt;img src=&quot;https://vercel.com/button&quot; alt=&quot;Deploy with Vercel&quot; /&gt;&lt;figcaption&gt;Deploy with Vercel&lt;/figcaption&gt;&lt;/a&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;本地开发&lt;a href=&quot;#本地开发&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://github.com/you-github-name/homepage.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;homepage&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;npm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;run&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;dev&lt;/span&gt;&lt;span&gt;     &lt;/span&gt;&lt;span&gt;# http://localhost:5173，配置热更新&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;全部配置化：只改 &lt;code&gt;src/config.js&lt;/code&gt;&lt;a href=&quot;#全部配置化只改-srcconfigjs&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;个性化集中在一个文件，改完 push 即自动重新部署。常用的几项：&lt;/p&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;code&gt;siteName&lt;/code&gt; / &lt;code&gt;pageTitle&lt;/code&gt; / &lt;code&gt;greet&lt;/code&gt; / &lt;code&gt;desc&lt;/code&gt; / &lt;code&gt;motto&lt;/code&gt;&lt;/td&gt;&lt;td&gt;站名、标签页标题、问候语、一句话介绍、打字机轮换标语&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;siteFont&lt;/code&gt;&lt;/td&gt;&lt;td&gt;站名手写体，内置 7 款开源字体一键切换&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;logo&lt;/code&gt;&lt;/td&gt;&lt;td&gt;留空用内置「Z」徽章，填图片路径/URL 整体替换&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;siteStart&lt;/code&gt; / &lt;code&gt;author&lt;/code&gt; / &lt;code&gt;repo&lt;/code&gt;&lt;/td&gt;&lt;td&gt;建站日期（页脚运行天数）、署名、署名链接&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;homeCards&lt;/code&gt;&lt;/td&gt;&lt;td&gt;主页各卡片开关（greet / blog / hitokoto / clock / weather / siteLinks）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;panelCards&lt;/code&gt;&lt;/td&gt;&lt;td&gt;二级面板卡片排列：数组顺序 = 排列顺序，删掉某项 = 隐藏该卡&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;musicPlaylist&lt;/code&gt; / &lt;code&gt;musicSource&lt;/code&gt; / &lt;code&gt;musicQuality&lt;/code&gt;&lt;/td&gt;&lt;td&gt;歌单 ID、直链来源、音质&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;weatherCity&lt;/code&gt;&lt;/td&gt;&lt;td&gt;天气城市 adcode，留空 = 按访客 IP 自动定位&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;bgApi&lt;/code&gt;&lt;/td&gt;&lt;td&gt;背景：留空极光渐变 / 放 &lt;code&gt;public/images/background.jpg&lt;/code&gt; / 填随机壁纸 API&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;hotPlatforms&lt;/code&gt;&lt;/td&gt;&lt;td&gt;热榜平台与顺序&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;siteMonitors&lt;/code&gt;&lt;/td&gt;&lt;td&gt;站点监控卡的目标站点列表&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;socialLinks&lt;/code&gt; / &lt;code&gt;siteLinks&lt;/code&gt;&lt;/td&gt;&lt;td&gt;社交图标、网站列表&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;换成你自己的站点，改 &lt;code&gt;siteLinks&lt;/code&gt; 和 &lt;code&gt;socialLinks&lt;/code&gt; 就行。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;TODO&lt;a href=&quot;#todo&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt; 更多卡片支持（欢迎 PR / Issue 讨论）&lt;/li&gt;
&lt;li&gt; 卡片位置自定义（拖拽排序 / 布局记忆）&lt;/li&gt;
&lt;li&gt; 音乐卡 AMLL 歌词动效（逐字点亮、弹性动画、灵感封面背景）&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;致谢&lt;a href=&quot;#致谢&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/imsyy/home&quot; target=&quot;_blank&quot;&gt;imsyy/home&lt;/a&gt;——布局灵感来源；&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://github.com/CuteLeaf/Firefly&quot; target=&quot;_blank&quot;&gt;CuteLeaf/Firefly&lt;/a&gt;——音乐播放器多源自愈设计参考；&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://uapis.cn/&quot; target=&quot;_blank&quot;&gt;uapis.cn&lt;/a&gt;、&lt;a href=&quot;https://github.com/vikiboss/60s&quot; target=&quot;_blank&quot;&gt;60s API&lt;/a&gt;、&lt;a href=&quot;https://hitokoto.cn/&quot; target=&quot;_blank&quot;&gt;hitokoto.cn&lt;/a&gt;——免 Key 数据接口；&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://lucide.dev/&quot; target=&quot;_blank&quot;&gt;Lucide&lt;/a&gt;——图标。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;项目为 vibe coding 实现，若侵犯了您的权益请联系我删除。觉得有用的话，去 &lt;a href=&quot;https://github.com/Zlion-Y/homepage&quot; target=&quot;_blank&quot;&gt;仓库&lt;/a&gt; 点个 Star 就是对我最大的支持～&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>fileserver：单文件自建文件服务器（GO）</title><link>https://blog.zlion.top/posts/fileserver-single-binary/</link><guid isPermaLink="true">https://blog.zlion.top/posts/fileserver-single-binary/</guid><description>用一个 Go 编译的二进制文件在服务器 / NAS / 路由器上自建文件服务：分片断点续传上传、限时限次分享链接、WebDAV、媒体相册预览、一键自更新，零运行时依赖。另有一个介绍页站点，先把功能和部署方式讲清楚再让你下载。</description><pubDate>Wed, 09 Sep 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;本文档面向想在服务器 / NAS / 路由器上自建文件分享服务的用户，涵盖功能介绍、三种部署方式、安全设计与介绍页站点。
&lt;strong&gt;适用版本：&lt;/strong&gt; fileserver v1.3.5
&lt;strong&gt;适用系统：&lt;/strong&gt; Linux（amd64 / arm64 / armv7 / armv5 / mipsle / 386）/ Windows / macOS
&lt;strong&gt;适用平台：&lt;/strong&gt; 云服务器 / 本地虚拟机 / NAS / 软路由 / Docker&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;一、为什么要再造一个文件服务器&lt;a href=&quot;#一为什么要再造一个文件服务器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;网盘限速、第三方工具要装 Docker 拉一堆镜像、老 NAS 上连 Node 都跑不动——fileserver 就是为了解决这些场景：&lt;strong&gt;一个可执行文件，拷过去就能跑&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;它的定位很简单：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;单个二进制文件&lt;/strong&gt;：Go 编写、零第三方库，前端页面经 &lt;code&gt;go:embed&lt;/code&gt; 直接编译进二进制，无任何运行时依赖；图片缩略图、文本预览、统计图全部在浏览器端渲染，弱机服务器只负责透传字节流&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;8 个平台开箱即用&lt;/strong&gt;：从 x86 云服务器到 mipsle 架构的老路由器，总有一个包能跑&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;核心功能齐全&lt;/strong&gt;：目录管理、分片断点续传上传、限时限次分享链接、WebDAV 直连、回收站、一键自更新&lt;/li&gt;
&lt;/ul&gt;&lt;a href=&quot;https://github.com/Zlion-Y/fileserver&quot; target=&quot;_blank&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Zlion-Y&lt;/div&gt;&lt;/div&gt;&lt;div&gt;/&lt;/div&gt;&lt;div&gt;fileserver&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Description not set&lt;/div&gt;&lt;div&gt;&lt;div&gt;—&lt;/div&gt;&lt;div&gt;—&lt;/div&gt;&lt;div&gt;no-license&lt;/div&gt;&lt;span&gt;Go&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;&lt;section&gt;&lt;h3&gt;配套介绍页&lt;a href=&quot;#配套介绍页&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;仓库之外还有一个独立的介绍页站点，把「这东西是干什么的、能干什么、怎么装」在一页里讲完，比翻 README 快得多：&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;介绍页：&lt;/strong&gt; &lt;a href=&quot;https://storage.zlion.top&quot; target=&quot;_blank&quot;&gt;storage.zlion.top&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p&gt;页面结构大致是：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;介绍页 (fileserver.zlion.top)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├─ 首屏       一句话定位 + 一键部署命令 + Release 下载入口&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├─ 功能总览   分片上传 / 分享链接 / WebDAV / 相册视图 …逐项配截图&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├─ 部署方式   直接运行 / 一键脚本 / Docker 三条路径并列对比&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├─ 安全设计   PBKDF2、AES-GCM、路径越权防护等实现说明&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└─ 常见问题   反代 127.0.0.1、413、别名冲突 …就地给排查方向&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;定位上它是「软件的门面」，承担三件事：&lt;strong&gt;讲清楚是什么&lt;/strong&gt;（省得用户读完 README 还在猜）、&lt;strong&gt;给出最快的上手路径&lt;/strong&gt;（首屏就放 curl 一键部署）、&lt;strong&gt;沉淀文档&lt;/strong&gt;（安全设计、故障排查这些正文不适合塞进 README 的内容）。介绍页与本文内容同源，改动软件时两边一起更新。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二、功能总览&lt;a href=&quot;#二功能总览&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&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;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&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;≥8MB 自动分片断点续传：失败只补缺失分片，服务重启自动重建会话，对网页端无感&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&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;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;媒体 / 文本预览&lt;/td&gt;&lt;td&gt;图片 / 视频 / 音频浏览器内直接播放（支持拖动）；txt / md / 源码 / 配置直接查看&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&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;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;分享链接&lt;/td&gt;&lt;td&gt;有效期（1 小时 ~ 30 天 / 永久 / 自定义）+ 下载次数（1/5/20/不限）双限制&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;自定义别名&lt;/td&gt;&lt;td&gt;分享链接可设自定义尾段（如 &lt;code&gt;/s/发布会-materials&lt;/code&gt;），对外发布更好看，原 token 链接兼容&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;防盗链&lt;/td&gt;&lt;td&gt;按分享开启 Referer 校验，拒绝其他网站的页面引用，直访与下载工具不受影响&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;分享密码&lt;/td&gt;&lt;td&gt;PBKDF2 哈希校验，密码 AES-GCM 加密存储，管理端可查看&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&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;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;下载统计&lt;/td&gt;&lt;td&gt;分享管理页展示最近 30 天下载 / 失败趋势图（canvas 客户端绘制）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;访问日志&lt;/td&gt;&lt;td&gt;每条分享记录最近 50 次访问（IP / UA / 成败原因），行内展开查看&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;回收站&lt;/td&gt;&lt;td&gt;删除先进回收站，可逐条或勾选批量恢复 / 彻底删除，超期自动清理&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;WebDAV&lt;/td&gt;&lt;td&gt;&lt;code&gt;/dav/&lt;/code&gt; 挂载文件根目录，Salt Player 等播放器与移动端文件管理器可直连&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&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;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;深色模式 / PWA&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;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;防爆破&lt;/td&gt;&lt;td&gt;同一 IP 5 分钟内认证失败 10 次自动封禁 15 分钟&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;定时清理&lt;/td&gt;&lt;td&gt;过期分享记录自动清理，保留时长可视化配置&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三、大文件分片上传&lt;a href=&quot;#三大文件分片上传&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;家用宽带上传几个 GB 的文件，最怕的就是传到 90% 断网重来。大文件（≥8MB）自动走分片通道：前端把文件切成 4MB 的分片逐个上传，服务端顺序追加落盘，完成后同盘原子改名——&lt;strong&gt;中途断网只补缺失的分片，已经传上去的字节不会浪费&lt;/strong&gt;。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;是&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;否&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;选择 ≥8MB 大文件&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;init：服务端建立分片会话&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;前端按 4MB 逐片上传追加&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;是否中断&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;按服务端实际进度校正偏移&lt;br /&gt;&lt;br /&gt;只重传缺失分片&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;complete：校验长度后原子改名生效&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;是&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;否&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;选择 ≥8MB 大文件&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;init：服务端建立分片会话&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;前端按 4MB 逐片上传追加&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;是否中断&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;按服务端实际进度校正偏移&lt;br /&gt;&lt;br /&gt;只重传缺失分片&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;complete：校验长度后原子改名生效&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;会话对客户端完全透明：普通小文件仍走一次性请求，分片文件在完成前对文件列表、搜索、WebDAV、ZIP 打包全部不可见，不会外泄半成品。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;四、分享与浏览的几处细节&lt;a href=&quot;#四分享与浏览的几处细节&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;4.1 相册视图&lt;a href=&quot;#41-相册视图&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;管理图片目录时点「相册」，列表切换为缩略图网格——服务端依旧只返回原图字节，由浏览器懒加载，不增加服务器负担。翻图点开即看，不用先下载到本地。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.2 分享别名&lt;a href=&quot;#42-分享别名&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;创建分享时可自定义链接尾段，把默认的随机 token 换成可读的短词：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;默认：  https://files.example.com/s/a7f3c9e21b8d4f06&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;别名：  https://files.example.com/s/发布会-materials&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;发到网站 / 公众号里体面得多。别名全局唯一，原 token 链接保持兼容；别名段同样计入有效期与下载次数限制，不额外开权限口子。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.3 防盗链&lt;a href=&quot;#43-防盗链&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;对公开外发的链接可单独&lt;strong&gt;按分享&lt;/strong&gt;开启 Referer 校验：其他网站的页面引用直接返回 403，而直接在浏览器打开链接、用 IDM / aria2 这类下载工具拉取都不受影响——防的是被别站白嫖流量，不是防真实访客。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;五、快速开始&lt;a href=&quot;#五快速开始&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;5.1 直接运行&lt;a href=&quot;#51-直接运行&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;从 &lt;a href=&quot;https://github.com/Zlion-Y/fileserver/releases&quot; target=&quot;_blank&quot;&gt;Releases&lt;/a&gt; 下载对应架构的二进制，赋予执行权限后运行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+x&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fileserver&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./fileserver&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--port&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;16666&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--dir&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/data/files&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--user&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;admin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--pass&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;你的密码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;打开 &lt;code&gt;http://服务器IP:16666&lt;/code&gt; 即可使用。不设 &lt;code&gt;--user/--pass&lt;/code&gt; 时无认证，仅建议纯内网使用。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5.2 常用启动参数&lt;a href=&quot;#52-常用启动参数&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&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;&lt;code&gt;--port&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;8080&lt;/code&gt;&lt;/td&gt;&lt;td&gt;监听端口&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--dir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;无&lt;/td&gt;&lt;td&gt;文件根目录（也可启动后在网页里选）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--data-dir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;./data&lt;/code&gt;&lt;/td&gt;&lt;td&gt;配置与分享记录存放目录，&lt;strong&gt;必须持久化&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--user&lt;/code&gt; / &lt;code&gt;--pass&lt;/code&gt;&lt;/td&gt;&lt;td&gt;无&lt;/td&gt;&lt;td&gt;管理端账号密码&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--max-upload-mb&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;&lt;td&gt;单文件上传上限（MB），0 不限制，对分片上传同样生效&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;--trust-proxy&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;0&lt;/code&gt;&lt;/td&gt;&lt;td&gt;反向代理场景置 1&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;同名环境变量（&lt;code&gt;PORT&lt;/code&gt;、&lt;code&gt;ROOT_DIR&lt;/code&gt;、&lt;code&gt;AUTH_PASS&lt;/code&gt; 等）同样生效，命令行优先。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;建议&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;code&gt;--data-dir&lt;/code&gt; 务必放在持久目录，分享记录存在里面的 &lt;code&gt;shares.json&lt;/code&gt;，目录丢了链接全部失效；加密分享密码的主密钥 &lt;code&gt;.masterkey&lt;/code&gt; 也在这里，迁移服务器时一并带走。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;六、三种部署方式怎么选&lt;a href=&quot;#六三种部署方式怎么选&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;介绍页里把三条路径并列放在一起，选哪条看你的环境：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;有 systemd 的 Linux&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;已跑 Docker&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;临时试用 / 特殊平台&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;你的环境&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;一键脚本&lt;br /&gt;&lt;br /&gt;识别架构 · 注册自启&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;Docker Compose&lt;br /&gt;&lt;br /&gt;数据卷持久化&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;直接运行&lt;br /&gt;&lt;br /&gt;下载二进制手起&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;网页访问 :16666&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;有 systemd 的 Linux&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;已跑 Docker&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;临时试用 / 特殊平台&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;你的环境&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;一键脚本&lt;br /&gt;&lt;br /&gt;识别架构 · 注册自启&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;Docker Compose&lt;br /&gt;&lt;br /&gt;数据卷持久化&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;直接运行&lt;br /&gt;&lt;br /&gt;下载二进制手起&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;网页访问 :16666&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;section&gt;&lt;h3&gt;6.1 一键部署到 Linux（推荐）&lt;a href=&quot;#61-一键部署到-linux推荐&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;部署脚本自动识别 CPU 架构、从 Release 下载二进制、放行防火墙、注册 systemd 开机自启：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;curl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-fsSL&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://raw.githubusercontent.com/Zlion-Y/fileserver/main/install-remote.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-o&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install-remote.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bash&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install-remote.sh&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--dry-run&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sudo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;FS_USER=admin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;FS_PASS=你的密码&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;bash&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install-remote.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;提示&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;code&gt;--dry-run&lt;/code&gt; 只预览将要执行的操作，不改系统，建议先跑一次确认。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;装好后的常用运维操作：&lt;/p&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;&lt;code&gt;sudo DIR=/mnt/disk/share PORT=9000 bash install-remote.sh&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;指定版本安装&lt;/td&gt;&lt;td&gt;&lt;code&gt;sudo VERSION=v1.3.5 bash install-remote.sh&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&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;journalctl -u fileserver -f&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;卸载&lt;/td&gt;&lt;td&gt;&lt;code&gt;sudo bash install-remote.sh --uninstall&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;配置文件在 &lt;code&gt;/etc/fileserver.env&lt;/code&gt;，改完 &lt;code&gt;systemctl restart fileserver&lt;/code&gt; 生效。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6.2 Docker 部署&lt;a href=&quot;#62-docker-部署&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.env.example&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.env&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;docker&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;compose&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;up&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;docker-compose.yml&lt;/code&gt; 默认只监听 &lt;code&gt;127.0.0.1:16666&lt;/code&gt;，由 Nginx / Caddy 反代后对外。数据落在 &lt;code&gt;./files&lt;/code&gt; 与 &lt;code&gt;./data&lt;/code&gt;，容器重建不丢。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;警告&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Docker 场景升级请重新构建镜像，不要在容器内替换二进制；未注入 &lt;code&gt;--build-arg VERSION&lt;/code&gt; 时版本为 &lt;code&gt;dev&lt;/code&gt;，网页会禁用一键更新。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;七、一键自更新是怎么工作的&lt;a href=&quot;#七一键自更新是怎么工作的&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;个人服务器最烦的就是升级：登服务器、找架构、下载、替换、重启。fileserver 把这整套做成了一个按钮：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;通过&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;失败&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;网页点击一键更新&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;服务端查询 GitHub 最新 Release&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;按当前架构下载对应二进制&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;校验二进制魔数&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;原子替换旧文件&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;中止并报错&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;自动重启新版本&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;网页展示版本更新日志&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;通过&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;失败&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;网页点击一键更新&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;服务端查询 GitHub 最新 Release&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;按当前架构下载对应二进制&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;校验二进制魔数&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;原子替换旧文件&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;中止并报错&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;自动重启新版本&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;网页展示版本更新日志&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;服务器连不上 GitHub 也没关系：本地下载好二进制，从网页直接上传更新包（上限 256MB），校验通过后同样替换重启。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;八、WebDAV：播放器直连&lt;a href=&quot;#八webdav播放器直连&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;服务地址即 &lt;code&gt;http://&amp;lt;主机&amp;gt;:&amp;lt;端口&amp;gt;/dav/&lt;/code&gt;，认证同管理端账号密码。Salt Player、foobar2000、常规移动端文件管理器都能直连，音乐 / 视频流式播放支持拖动进度条；通过 WebDAV 删除的文件同样进回收站，防误删。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;说明&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;未实现 LOCK/UNLOCK（Class 2），Windows 资源管理器「映射网络驱动器」不受支持；常规播放器与文件管理器不受影响。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;九、安全设计&lt;a href=&quot;#九安全设计&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;口令哈希&lt;/strong&gt;：管理端与分享密码均用 PBKDF2-HMAC-SHA256（管理端 10 万轮 / 分享端 5 万轮），旧版单次 SHA-256 记录校验通过后自动就地升级，无需用户操作&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;密码加密存储&lt;/strong&gt;：分享密码以 AES-GCM 加密落盘，主密钥独立文件存放；&lt;code&gt;config.json&lt;/code&gt;（管理密码哈希）、&lt;code&gt;shares.json&lt;/code&gt;（加密密码与访问日志）、主密钥文件均以 0600 权限落盘，泄露不再连带交出密码&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;改密踢会话&lt;/strong&gt;：修改管理员密码后立即踢出其他所有登录会话，被盗会话不会永久有效&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;续传授权&lt;/strong&gt;：下载断点续传必须持有真实下载后签发的 ticket Cookie，伪造 &lt;code&gt;Range: bytes=1-&lt;/code&gt; 无法绕过一次性链接的次数限制&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;路径越权&lt;/strong&gt;：所有路径参数做根目录校验 + 符号链接兜底，&lt;code&gt;../&lt;/code&gt; 逃逸与 root 内软链指向外部均无效&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;防盗链&lt;/strong&gt;：按分享开启 Referer 校验，外站页面引用返回 403，直访与下载工具不受影响&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;上传限制&lt;/strong&gt;：&lt;code&gt;MAX_UPLOAD_MB&lt;/code&gt; 对普通与分片上传同样生效；分片临时文件对列表 / 搜索 / WebDAV / ZIP 不可见，半成品不会外泄&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;十、注意事项与故障排查&lt;a href=&quot;#十注意事项与故障排查&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;重要&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;公网部署务必设置 &lt;code&gt;AUTH_USER&lt;/code&gt; / &lt;code&gt;AUTH_PASS&lt;/code&gt;，否则任何人都能管理你的文件。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;反代注意&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;反向代理场景需设置 &lt;code&gt;TRUST_PROXY=1&lt;/code&gt;，否则生成的分享链接会是 &lt;code&gt;http://127.0.0.1:...&lt;/code&gt;；Nginx 需放开 &lt;code&gt;client_max_body_size 0&lt;/code&gt; 并关闭 &lt;code&gt;proxy_buffering&lt;/code&gt;。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;常见问题排查：&lt;/p&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;分享链接打开 404&lt;/td&gt;&lt;td&gt;&lt;code&gt;shares.json&lt;/code&gt; 是否随 &lt;code&gt;--data-dir&lt;/code&gt; 丢失；文件是否被移动或删除&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&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;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;别名提示已被占用&lt;/td&gt;&lt;td&gt;别名全局唯一，换一个或留空使用随机 token&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;反代后链接是 127.0.0.1&lt;/td&gt;&lt;td&gt;未设 &lt;code&gt;TRUST_PROXY=1&lt;/code&gt;，或反代来源不在环回 / 内网信任范围&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;上传大文件失败 413&lt;/td&gt;&lt;td&gt;触发了 &lt;code&gt;MAX_UPLOAD_MB&lt;/code&gt; 限制，或 Nginx 未放开 &lt;code&gt;client_max_body_size&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&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;服务器连不上 GitHub，改用网页上传更新包方式&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;忘记管理密码&lt;/td&gt;&lt;td&gt;在配置中改 &lt;code&gt;AUTH_PASS&lt;/code&gt; 后重启；网页改过密码的话删除 &lt;code&gt;config.json&lt;/code&gt; 中的 &lt;code&gt;authPassHash&lt;/code&gt; 字段即可回退到启动参数密码&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;在线体验：&lt;/strong&gt; &lt;a href=&quot;https://fileserver.zlion.top:446&quot; target=&quot;_blank&quot;&gt;fileserver.zlion.top&amp;lt;446&amp;gt;&lt;/a&gt; ｜ &lt;strong&gt;介绍页：&lt;/strong&gt; &lt;a href=&quot;https://fileserver.zlion.top&quot; target=&quot;_blank&quot;&gt;fileserver.zlion.top&lt;/a&gt; ｜ &lt;strong&gt;开源仓库：&lt;/strong&gt; &lt;a href=&quot;https://github.com/Zlion-Y/fileserver&quot; target=&quot;_blank&quot;&gt;Zlion-Y/fileserver&lt;/a&gt;
&lt;strong&gt;文档版本：&lt;/strong&gt; 2026-09-22
&lt;strong&gt;软件版本：&lt;/strong&gt; fileserver v1.3.5
&lt;strong&gt;适用平台：&lt;/strong&gt; 云服务器 / 本地虚拟机 / NAS / 软路由 / Docker&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;</content:encoded></item><item><title>中兴巡天AX3000 (E2631) 主线 Linux 内核移植全记录</title><link>https://blog.zlion.top/posts/zte-e2631-mainline-linux-port/</link><guid isPermaLink="true">https://blog.zlion.top/posts/zte-e2631-mainline-linux-port/</guid><description>从固件解密、SoC 逆向到 6.18.38 主线内核上板验证的完整记录，覆盖 mihomo 全功能适配、Windows 交叉编译与开源复现流程</description><pubDate>Mon, 31 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;本文档面向嵌入式开发与路由器逆向爱好者，完整记录中兴巡天 AX3000（E2631）从固件解密、SoC 逆向、交叉编译到主线内核上板验证的全过程，并给出 mihomo（Clash.Meta）全功能适配的配置与开源复现方式。
&lt;strong&gt;适用系统：&lt;/strong&gt; Windows 10/11（MSYS2 构建） / WSL2（可选提速）
&lt;strong&gt;适用平台：&lt;/strong&gt; 中兴 ZTE ZXHN E2631（巡天 AX3000，ZX279128S）&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;a href=&quot;https://github.com/Zlion-Y/e2631-mainline-zx279128s&quot; target=&quot;_blank&quot;&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;Zlion-Y&lt;/div&gt;&lt;/div&gt;&lt;div&gt;/&lt;/div&gt;&lt;div&gt;e2631-mainline-zx279128s&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;Description not set&lt;/div&gt;&lt;div&gt;&lt;div&gt;—&lt;/div&gt;&lt;div&gt;—&lt;/div&gt;&lt;div&gt;NOASSERTION&lt;/div&gt;&lt;span&gt;C&lt;/span&gt;&lt;/div&gt;&lt;/a&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;一、项目背景与目标&lt;a href=&quot;#一项目背景与目标&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;E2631 是中兴巡天 AX3000 千兆双频路由器，采用自研 ZX279128S SoC，运营商定制固件、源码不开放，内核特性老旧，既没有 TPROXY / nftables 等现代防火墙能力，也无法直接运行 mihomo（Clash.Meta）。网上流传的 openwrt-e2631 镜像只能通过 U-Boot 导入，实际只有镜像头能被识别为 OpenWrt，内核根本无法启动。&lt;/p&gt;&lt;p&gt;因此本项目决定走一条完整链路：&lt;strong&gt;固件解密 → SoC 逆向 → 串口/U-Boot 打通 → 主线内核编译 → 上板验证 → mihomo 适配 → 开源发布&lt;/strong&gt;。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;固件解密&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;SoC 逆向&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;串口 / U-Boot 打通&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;交叉编译主线 6.18.38&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;上板验证&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;mihomo 全功能适配&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;开源仓库发布&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;固件解密&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;SoC 逆向&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;串口 / U-Boot 打通&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;交叉编译主线 6.18.38&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;上板验证&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;mihomo 全功能适配&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;开源仓库发布&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;最终成果：主线内核 &lt;strong&gt;6.18.38&lt;/strong&gt; 已在真实硬件上从 U-Boot 启动到交互式 busybox shell，TPROXY / TUN / nftables / zram 等特性全部验证通过，mihomo 可跑在 armv5 软浮点二进制下，且全部源码、工具、一键编译脚本已开源，可以直接拉取复现。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;二、硬件规格与 SoC 逆向&lt;a href=&quot;#二硬件规格与-soc-逆向&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;2.1 硬件规格&lt;a href=&quot;#21-硬件规格&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&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;SoC&lt;/td&gt;&lt;td&gt;中兴 ZX279128S（双核 Cortex-A9 rev1 @ 1GHz）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;内存&lt;/td&gt;&lt;td&gt;256MB DDR3-1333（U-Boot 实测 256MiB；DTS 当前写 128MB 占位，可按需调整）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;闪存&lt;/td&gt;&lt;td&gt;128MB SPI NAND（AMD/Spansion HYF1GQ4UTACAE）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;有线&lt;/td&gt;&lt;td&gt;千兆 PHY（GEPHY ×4，驱动待移植）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;无线&lt;/td&gt;&lt;td&gt;MT7916 WiFi（走 PCIe，驱动待移植）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;USB&lt;/td&gt;&lt;td&gt;无对外 USB 口（dwc2 / dwc3 驱动已验证，DT 保持禁用）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;调试串口&lt;/td&gt;&lt;td&gt;ZTE 定制 PL011 @ 0x94404000&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;重要&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;这台机器&lt;strong&gt;没有 USB 口&lt;/strong&gt;，后续所有调试、部署、镜像搬运都只能依赖 TFTP 和串口，这是整个调试方案设计的出发点。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2 CPU 能力（最重要的事实）&lt;a href=&quot;#22-cpu-能力最重要的事实&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;由 &lt;code&gt;cat /proc/cpuinfo&lt;/code&gt; 实测，CPU features 为：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;half thumb fastmult edsp thumbee tls&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;对照 ARMv7 完整特性集，结论如下：&lt;/p&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;ARMv7（Cortex-A9）&lt;/td&gt;&lt;td&gt;✅ 支持&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Thumb / ThumbEE&lt;/td&gt;&lt;td&gt;✅ 支持&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;EDSP（增强 DSP 指令）&lt;/td&gt;&lt;td&gt;✅ 支持&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TLS（线程本地存储）&lt;/td&gt;&lt;td&gt;✅ 支持&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;VFP 浮点单元&lt;/td&gt;&lt;td&gt;❌ 不支持（无硬件 FPU）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;NEON SIMD&lt;/td&gt;&lt;td&gt;❌ 不支持&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;硬件整数除法 idiv&lt;/td&gt;&lt;td&gt;❌ 不支持&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;注意&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;无 VFP / NEON / idiv 意味着：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;所有二进制必须&lt;strong&gt;软浮点&lt;/strong&gt;编译（&lt;code&gt;-mfloat-abi=soft&lt;/code&gt;），用 &lt;code&gt;-mfpu=vfp&lt;/code&gt; 或 hard-float 的二进制会直接非法指令崩溃；&lt;/li&gt;
&lt;li&gt;除法、浮点运算全部走软件库，CPU 占用高，跑加密代理时会出现明显的 CPU 瓶颈；&lt;/li&gt;
&lt;li&gt;内核编译时必须强制 &lt;code&gt;-marm&lt;/code&gt;，避免工具链默认 Thumb 模式带来的启动问题。&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.3 串口 IP 逆向&lt;a href=&quot;#23-串口-ip-逆向&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;E2631 的调试串口是 ZTE 定制的 PL011 兼容 IP，基地址 &lt;code&gt;0x94404000&lt;/code&gt;，&lt;code&gt;earlycon=zteuart&lt;/code&gt; 可输出引导日志，periphid 为 &lt;code&gt;0x001feffe&lt;/code&gt;。它与标准 PL011 的寄存器偏移不同（与 ZX279133 是同一 IP）：&lt;/p&gt;

&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;寄存器&lt;/th&gt;&lt;th&gt;标准 PL011 偏移&lt;/th&gt;&lt;th&gt;E2631（ZTE 定制）偏移&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;DR（数据寄存器）&lt;/td&gt;&lt;td&gt;0x00&lt;/td&gt;&lt;td&gt;0x04&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;FR（标志寄存器）&lt;/td&gt;&lt;td&gt;0x18&lt;/td&gt;&lt;td&gt;0x14&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;IBRD&lt;/td&gt;&lt;td&gt;0x24&lt;/td&gt;&lt;td&gt;0x24&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;FBRD&lt;/td&gt;&lt;td&gt;0x28&lt;/td&gt;&lt;td&gt;0x28&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;LCRH&lt;/td&gt;&lt;td&gt;0x2C&lt;/td&gt;&lt;td&gt;0x30&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;CR&lt;/td&gt;&lt;td&gt;0x30&lt;/td&gt;&lt;td&gt;0x34&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;IFLS&lt;/td&gt;&lt;td&gt;0x34&lt;/td&gt;&lt;td&gt;0x38&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;IMSC&lt;/td&gt;&lt;td&gt;0x38&lt;/td&gt;&lt;td&gt;0x40&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;提示&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;早期主线内核没有这个 ZTE 定制 earlycon 的适配，需要为 &lt;code&gt;zteuart&lt;/code&gt; 编写 earlycon 驱动（已包含在项目的 patches 中）。串口物理参数为 3.3V TTL，115200-8-N-1。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.4 与 SR1010 的外设差异&lt;a href=&quot;#24-与-sr1010-的外设差异&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;本项目基于 cnjn 的 SR1010 主线移植（linux-mainline-zte-zxslc-sr1010），但 &lt;strong&gt;E2631 的外围方案与 SR1010 不同&lt;/strong&gt;，SoC 周边芯片不能直接照搬：&lt;/p&gt;

&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;外设&lt;/th&gt;&lt;th&gt;SR1010&lt;/th&gt;&lt;th&gt;E2631&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;有线 PHY&lt;/td&gt;&lt;td&gt;与 E2631 不同&lt;/td&gt;&lt;td&gt;GEPHY（千兆）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;WiFi&lt;/td&gt;&lt;td&gt;与 E2631 不同&lt;/td&gt;&lt;td&gt;MT7916（PCIe）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SPI NAND&lt;/td&gt;&lt;td&gt;与 E2631 不同&lt;/td&gt;&lt;td&gt;HYF1GQ4UTACAE（128MB）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;UART IP&lt;/td&gt;&lt;td&gt;同源&lt;/td&gt;&lt;td&gt;同源（ZTE 定制 PL011）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;所以设备树、网卡/PHY 驱动、闪存驱动都需要针对 E2631 单独适配，这也是”待办与未来工作”一章里列出的主要缺口。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;三、固件获取与解密&lt;a href=&quot;#三固件获取与解密&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;3.1 加密与密钥&lt;a href=&quot;#31-加密与密钥&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;原厂固件的 kernel 分区使用 &lt;strong&gt;AES-128-ECB&lt;/strong&gt; 加密，密钥常量为 &lt;code&gt;E263111559d0dfde&lt;/code&gt;。解密后即得到标准 uImage（ih_load 为 &lt;code&gt;0x40008000&lt;/code&gt;，这也是后面 XIP 陷阱的根源）。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.2 分区布局&lt;a href=&quot;#32-分区布局&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;128MB SPI NAND 上的功能分区（具体偏移以固件 dump 为准）：&lt;/p&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;bootloader&lt;/td&gt;&lt;td&gt;U-Boot&lt;/td&gt;&lt;td&gt;串口可交互，命令未被完全阉割&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;kernel&lt;/td&gt;&lt;td&gt;加密内核&lt;/td&gt;&lt;td&gt;AES-128-ECB 解密后为 uImage&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;rootfs&lt;/td&gt;&lt;td&gt;只读根文件系统&lt;/td&gt;&lt;td&gt;JFFS2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;kmodule&lt;/td&gt;&lt;td&gt;内核模块 + 用户态程序&lt;/td&gt;&lt;td&gt;JFFS2&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;配置区&lt;/td&gt;&lt;td&gt;出厂配置 / 无线参数&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.3 kmodule 解包与 vendor 运行库&lt;a href=&quot;#33-kmodule-解包与-vendor-运行库&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;把 kmodule 分区按 JFFS2 解包后，拿到两样关键资产：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;busybox v1.17.2&lt;/strong&gt;（原厂用户态，后续 initramfs 直接复用）；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;uClibc 0.9.33.2 运行库&lt;/strong&gt;（libc.so.0 / libm.so.0 / libresolv.so.0 等）。&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;警告&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;vendor 的库文件在打包时被记录成了符号链接（直接拷出来是”不是 ELF 文件”），需要解析 &lt;code&gt;.symlink&lt;/code&gt; 文件还原真实内容，才能用于构建 initramfs。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;四、串口与 U-Boot 引导&lt;a href=&quot;#四串口与-u-boot-引导&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;4.1 进入 U-Boot&lt;a href=&quot;#41-进入-u-boot&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;上电后&lt;strong&gt;立即连续按 1&lt;/strong&gt; 进入引导菜单，输入密码 &lt;code&gt;5cE080@fyBD&lt;/code&gt;，回车后停在 U-Boot 命令行（自动启动已被停止）。原厂 U-Boot 支持 tftp / bootm / md / mw 等常用命令，可以直接用来引导主线内核。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 电脑端准备一个 TFTP 服务器（仓库里的 e2631-tools/tftpd2.py 即可）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 串口里配置网络并下载内核&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;setenv&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;serverip&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.1.100&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;setenv&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ipaddr&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.1.1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tftp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0x43000000&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;uImage-e2631.img&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bootm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0x43000000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.2 XIP 陷阱（本项目最大的坑）&lt;a href=&quot;#42-xip-陷阱本项目最大的坑&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;注意&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;strong&gt;绝对不要在 &lt;code&gt;0x40008000&lt;/code&gt; 加载内核。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;uImage 头的 ih_load 就是 &lt;code&gt;0x40008000&lt;/code&gt;。如果 tftp 直接下到这个地址，bootm 会认为镜像”已经就位”，走 XIP（就地执行）路径跳过搬运，64 字节的 uImage 头直接压在内核入口上，结果就是&lt;strong&gt;静默崩溃——串口没有任何输出&lt;/strong&gt;。&lt;/p&gt;&lt;p&gt;另外 &lt;code&gt;0x42000000&lt;/code&gt; 区域是 U-Boot 自用区，大文件传输会失败，也要避开。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;正确姿势：&lt;code&gt;tftp 0x43000000&lt;/code&gt; → &lt;code&gt;bootm 0x43000000&lt;/code&gt;&lt;/strong&gt;，bootm 会把镜像搬到 &lt;code&gt;0x40008000&lt;/code&gt; 再跳转。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.3 完整引导链路&lt;a href=&quot;#43-完整引导链路&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;上电&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;立即按 1 进菜单&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;输入密码 5cE080@fyBD&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;停在 U-Boot 命令行&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;tftp 0x43000000 下载 uImage&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;bootm 0x43000000&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;搬运镜像到 0x40008000&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;解压并跳转内核&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;earlycon=zteuart 输出启动日志&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;解包嵌入式 initramfs&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;init 挂载 console&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;spawn busybox sh&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;上电&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;立即按 1 进菜单&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;输入密码 5cE080@fyBD&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;停在 U-Boot 命令行&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;tftp 0x43000000 下载 uImage&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;bootm 0x43000000&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;搬运镜像到 0x40008000&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;解压并跳转内核&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;earlycon=zteuart 输出启动日志&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;解包嵌入式 initramfs&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;init 挂载 console&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;spawn busybox sh&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;五、Windows 交叉编译环境&lt;a href=&quot;#五windows-交叉编译环境&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;5.1 环境组成&lt;a href=&quot;#51-环境组成&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;项目在纯 Windows 上完成了整个内核构建，环境如下：&lt;/p&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;MSYS2&lt;/td&gt;&lt;td&gt;提供 make 4.x 与 POSIX 工具链&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Arm GNU Toolchain&lt;/td&gt;&lt;td&gt;10.3（mingw 版），交叉编译内核&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Zig&lt;/td&gt;&lt;td&gt;0.14（arm-linux-musleabi 静态），编译 initramfs 的 init 等用户态程序&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Git&lt;/td&gt;&lt;td&gt;管理源码树与行尾&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;建议&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;同一套源码在 WSL2（Ubuntu）里用完整 GCC 交叉编译，速度明显快于 MSYS2，cpio 打包也更省心。仓库同时提供 &lt;code&gt;build.sh&lt;/code&gt;（Linux/WSL）和 &lt;code&gt;build.bat&lt;/code&gt;（Windows/MSYS2），二选一即可。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5.2 Windows 构建的强制限制&lt;a href=&quot;#52-windows-构建的强制限制&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;重要&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;make -j4&lt;/code&gt; 是上限：MSYS2 下 &lt;code&gt;-j8&lt;/code&gt; 会触发 make 段错误；&lt;/li&gt;
&lt;li&gt;必须强制 &lt;code&gt;-marm&lt;/code&gt;：mingw 工具链默认编 Thumb，会导致内核启动异常；&lt;/li&gt;
&lt;li&gt;源码树必须保持 LF 行尾：clone 时 CRLF 污染了约 9 万文件，fixdep 解析依赖文件会出错，需要 CRLF 补丁。&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;构建命令（对应 build.sh / build.bat 的核心）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ARCH=arm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CROSS_COMPILE=arm-none-eabi-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;zx279128s_e2631_defconfig&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ARCH=arm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CROSS_COMPILE=arm-none-eabi-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-j4&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5.3 踩过的编译坑（均已修复并固化在仓库）&lt;a href=&quot;#53-踩过的编译坑均已修复并固化在仓库&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&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;CRLF 污染&lt;/td&gt;&lt;td&gt;fixdep 依赖文件解析错误&lt;/td&gt;&lt;td&gt;全树转 LF + 补丁&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Thumb 默认编译&lt;/td&gt;&lt;td&gt;内核启动异常&lt;/td&gt;&lt;td&gt;强制 &lt;code&gt;-marm&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;make -j8 段错误&lt;/td&gt;&lt;td&gt;编译中途崩溃&lt;/td&gt;&lt;td&gt;限 &lt;code&gt;-j4&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;ntfs3 需要 gcc11 flag&lt;/td&gt;&lt;td&gt;编译报错&lt;/td&gt;&lt;td&gt;禁用 &lt;code&gt;CONFIG_NTFS3_FS&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;syncconfig 交互式提示&lt;/td&gt;&lt;td&gt;GCC_PLUGINS / DWARF 卡住构建&lt;/td&gt;&lt;td&gt;禁用 / 固定选项&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;initramfs_data.S 被误删&lt;/td&gt;&lt;td&gt;构建失败&lt;/td&gt;&lt;td&gt;git 恢复，重建脚本不再删除 .S&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;uapi netfilter 头文件是 stub&lt;/td&gt;&lt;td&gt;xt_mark.c 等编译失败&lt;/td&gt;&lt;td&gt;从 git 恢复真实内容并修复索引&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;busybox 用 zig 构建时 make 崩溃&lt;/td&gt;&lt;td&gt;段错误&lt;/td&gt;&lt;td&gt;改用 vendor busybox + uClibc 库&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;六、内核配置要点（mihomo 全功能适配）&lt;a href=&quot;#六内核配置要点mihomo-全功能适配&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;6.1 关键特性（全部 &lt;code&gt;=y&lt;/code&gt; 并已上板验证）&lt;a href=&quot;#61-关键特性全部-y-并已上板验证&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&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;TUN 虚拟网卡&lt;/td&gt;&lt;td&gt;&lt;code&gt;CONFIG_TUN&lt;/code&gt;&lt;/td&gt;&lt;td&gt;mihomo TUN 模式&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;TPROXY 透明代理&lt;/td&gt;&lt;td&gt;&lt;code&gt;CONFIG_NETFILTER_XT_TARGET_TPROXY&lt;/code&gt; + &lt;code&gt;CONFIG_NF_TPROXY_IPV4/IPV6&lt;/code&gt;&lt;/td&gt;&lt;td&gt;透明代理核心&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;socket 匹配&lt;/td&gt;&lt;td&gt;&lt;code&gt;CONFIG_NETFILTER_XT_MATCH_SOCKET&lt;/code&gt;&lt;/td&gt;&lt;td&gt;按 socket 分流&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;nftables&lt;/td&gt;&lt;td&gt;&lt;code&gt;CONFIG_NF_TABLES&lt;/code&gt; + nft_tproxy / nft_socket / nft_compat&lt;/td&gt;&lt;td&gt;现代防火墙规则&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;iptables-legacy&lt;/td&gt;&lt;td&gt;&lt;code&gt;CONFIG_IP_NF_IPTABLES_LEGACY&lt;/code&gt; + &lt;code&gt;CONFIG_XTABLES_LEGACY&lt;/code&gt;&lt;/td&gt;&lt;td&gt;兼容原厂规则集&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;conntrack / NAT&lt;/td&gt;&lt;td&gt;&lt;code&gt;CONFIG_NF_CONNTRACK&lt;/code&gt; + MASQUERADE / REDIRECT / MARK&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;CONFIG_IP_ADVANCED_ROUTER&lt;/code&gt; + &lt;code&gt;ip rule fwmark&lt;/code&gt;&lt;/td&gt;&lt;td&gt;按 fwmark 分流&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;IPv6&lt;/td&gt;&lt;td&gt;&lt;code&gt;CONFIG_IPV6&lt;/code&gt;&lt;/td&gt;&lt;td&gt;双栈代理&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;zram&lt;/td&gt;&lt;td&gt;&lt;code&gt;CONFIG_ZRAM&lt;/code&gt;&lt;/td&gt;&lt;td&gt;内存压缩，缓解 256MB 压力&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6.2 netfilter 配置丢失的修复&lt;a href=&quot;#62-netfilter-配置丢失的修复&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;内核默认配置做”平台精简”时会把 netfilter 相关选项丢掉，需要在 &lt;code&gt;olddefconfig&lt;/code&gt; 之后显式重新打开：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ARCH=arm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CROSS_COMPILE=arm-none-eabi-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;olddefconfig&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;scripts/config&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-e&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;NETFILTER&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-e&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;XTABLES_LEGACY&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-e&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;IP_NF_IPTABLES_LEGACY&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;make&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ARCH=arm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;CROSS_COMPILE=arm-none-eabi-&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;olddefconfig&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6.3 嵌入式 initramfs&lt;a href=&quot;#63-嵌入式-initramfs&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;提示&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;最初的方案是把 initrd 打成 uImage 传给内核，但 uImage 的 64 字节头会被内核误读，导致根文件系统无法挂载。最终改用 &lt;code&gt;CONFIG_INITRAMFS_SOURCE&lt;/code&gt;，把 cpio 直接编进内核，干净可靠。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;initramfs 内容（由 &lt;code&gt;e2631-tools/initramfs-src/&lt;/code&gt; 构建）：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;init&lt;/code&gt;：musl 静态编译，&lt;code&gt;O_RDWR&lt;/code&gt; 打开 console、&lt;code&gt;TIOCSCTTY&lt;/code&gt; 接管终端、spawn busybox sh；&lt;/li&gt;
&lt;li&gt;busybox v1.17.2（vendor 版，经 uClibc 库支撑）；&lt;/li&gt;
&lt;li&gt;uClibc 0.9.33.2 运行库（经 &lt;code&gt;.symlink&lt;/code&gt; 修复后的真实 ELF）；&lt;/li&gt;
&lt;li&gt;设备节点：console / null / tty / ttyAMA0(204&amp;lt;64&amp;gt;) / zero / random（&lt;code&gt;pack2.py&lt;/code&gt; 递归 cpio 打包）。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;七、上板验证&lt;a href=&quot;#七上板验证&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;7.1 启动结果&lt;a href=&quot;#71-启动结果&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;主线内核 &lt;strong&gt;6.18.38&lt;/strong&gt; 从 U-Boot 引导成功，&lt;code&gt;earlycon=zteuart&lt;/code&gt; 输出完整启动日志，最终进入交互式 busybox shell。板上实测日志：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;=== E2631 mainline bring-up init reached userspace ===&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[init] kernel booted, zteuart console OK&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[init] Features : half thumb fastmult edsp thumbee tls&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[init] handing console to busybox shell&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/ # iptables -t mangle -L PREROUTING    # 正常&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/ # ip rule add fwmark 1 lookup 100     # 正常&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/ # busybox cat /proc/net/ip_tables_targets&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;TPROXY&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;TPROXY&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;MASQUERADE&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;REDIRECT&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;7.2 特性验证命令&lt;a href=&quot;#72-特性验证命令&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 验证 TPROXY / REDIRECT / MASQUERADE / MARK 等目标已编进内核&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/proc/net/ip_tables_targets&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 确认 CPU 特性（无 VFP / NEON / idiv）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/proc/cpuinfo&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 确认内存识别&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/proc/meminfo&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;/proc/net/ip_tables_targets&lt;/code&gt; 中能看到 &lt;code&gt;TPROXY&lt;/code&gt; 等目标，说明透明代理内核路径完整可用；策略路由（&lt;code&gt;ip rule fwmark&lt;/code&gt;）也已在板上实测通过。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;八、mihomo 适配与部署&lt;a href=&quot;#八mihomo-适配与部署&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;8.1 二进制选择&lt;a href=&quot;#81-二进制选择&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;由于 CPU 无 VFP / NEON / idiv，mihomo 必须使用 &lt;strong&gt;armv5 软浮点&lt;/strong&gt; 二进制：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mihomo-linux-armv5      # GOARM=5，软浮点&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;警告&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;不要用 armv7 或 hard-float 的 mihomo 包，否则在无 FPU 的 A9 上会直接非法指令崩溃。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;8.2 内核侧已就绪&lt;a href=&quot;#82-内核侧已就绪&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;mihomo 需要的内核能力已全部 &lt;code&gt;=y&lt;/code&gt; 编入（见第六章）：TUN、TPROXY（v4/v6）、xt_socket、nftables（nft_tproxy/socket/compat）、iptables-legacy、conntrack、NAT、策略路由、IPv6、zram。无需任何外部内核模块。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;8.3 部署与预期&lt;a href=&quot;#83-部署与预期&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;部署方式：通过 tftp / 串口把 armv5 二进制与配置文件拷入，挂到 TUN 或 TPROXY 模式即可。注意这台机器没有 USB，所以文件传输只能走网络或串口。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;CPU 瓶颈提示&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;无硬件 FPU / NEON，SS / SSR 节点的加解密全部由 CPU 软算，1GHz 双核 A9 + 256MB 内存跑满速代理时 CPU 会明显吃满（“CPU 爆缸”风险）。这是硬件上限；软件层面已尽量做到极致——特性齐全、软浮点、无非法指令崩溃。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;九、开源仓库与复现&lt;a href=&quot;#九开源仓库与复现&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;9.1 仓库结构&lt;a href=&quot;#91-仓库结构&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;仓库 &lt;a href=&quot;https://github.com/Zlion-Y/e2631-mainline-zx279128s&quot; target=&quot;_blank&quot;&gt;Zlion-Y/e2631-mainline-zx279128s&lt;/a&gt; 本身就是&lt;strong&gt;完整的内核源码树&lt;/strong&gt;（Linux 6.18.38 + E2631 平台适配全部落树），不再需要单独拉基础树再套补丁。默认分支 &lt;code&gt;main&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;e2631-mainline-zx279128s/                       # 完整内核源码树（GitHub）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── arch/arm/boot/dts/zte/zx279128s-e2631.dts       # E2631 板级设备树&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── arch/arm/configs/zx279128s_e2631_defconfig      # 精简 defconfig（initramfs 已内嵌）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── initramfs-e2631.cpio.gz                         # 嵌入式 initramfs（busybox + uClibc + init）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── e2631-tools/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── tftpd2.py          # 简易 TFTP 服务器（UDP 69，服务父目录）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── pack_uimage.py     # uImage 打包（load/entry 0x40008000）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── serial_ctl.py      # 串口驱动（驱动 U-Boot 用）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── bootflow2.py       # 脚本化 tftp + bootm 串口序列&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── mkconfig.sh        # MSYS2 构建步骤&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── cleanbuild3.sh     # MSYS2 清理重建&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── mihomobuild.sh     # mihomo 相关构建&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   ├── initramfs-src/     # init.c + pack2.py&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;│   └── README.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── upstream-series/                             # cnjn 的 ZX279133 16 补丁集（6.18.38 基线，参考）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── research.md                                 # 内核版本调研笔记&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── README.md / README_EN.md / README           # 中英文说明 + 内核自带 README&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── build.sh                                    # Linux / WSL 一键编译&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;├── build.bat                                   # Windows / MSYS2 一键编译&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;20&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;└── .github/workflows/build.yml                 # CI：main + v* tag + 手动触发&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;编译产物由 CI 直接发布到 GitHub Release：&lt;strong&gt;v0.1.1&lt;/strong&gt; 已包含 &lt;code&gt;uImage-e2631.img&lt;/code&gt;（约 13.3MB，zImage + DTB 拼接，DTB 在末尾），可直接下载后 tftp 引导。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;9.2 复现步骤&lt;a href=&quot;#92-复现步骤&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Linux / WSL（树内直接构建，无需套补丁）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;clone&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;https://github.com/Zlion-Y/e2631-mainline-zx279128s.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;e2631-mainline-zx279128s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;./build.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;Windows（MSYS2，首次运行自动装 MSYS2 与交叉工具链，再树内构建）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;git clone https://github.com/Zlion-Y/e2631-mainline-zx279128s.git&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; e2631-mainline-zx279128s&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;build.bat&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;GitHub Actions：fork 后 push（或手动 &lt;code&gt;workflow_dispatch&lt;/code&gt;）即可，产物在 Actions 页面 / Release 下载。&lt;/p&gt;&lt;p&gt;编译产物 &lt;code&gt;uImage-e2631.img&lt;/code&gt; 按第四章的姿势引导：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tftp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0x43000000&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;uImage-e2631.img&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;bootm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0x43000000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;提示&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;树内构建要点：&lt;code&gt;make zx279128s_e2631_defconfig&lt;/code&gt; 通过 &lt;code&gt;CONFIG_INITRAMFS_SOURCE&lt;/code&gt; 把 &lt;code&gt;initramfs-e2631.cpio.gz&lt;/code&gt; 一并编入；设备树用单目标编译（&lt;code&gt;make zte/zx279128s-e2631.dtb&lt;/code&gt;），不走 &lt;code&gt;make dtbs&lt;/code&gt; 批量入口。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;9.3 CI 与 Release&lt;a href=&quot;#93-ci-与-release&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;build.yml&lt;/code&gt; 触发条件：&lt;code&gt;main&lt;/code&gt; 分支 push、&lt;code&gt;v*&lt;/code&gt; tag push、手动 &lt;code&gt;workflow_dispatch&lt;/code&gt;；并显式声明 &lt;code&gt;permissions: contents: write&lt;/code&gt; 以便创建/更新 Release。流程为：装依赖 → 装 Arm GNU Toolchain 10.3（&lt;code&gt;arm-none-linux-gnueabihf-&lt;/code&gt;）→ &lt;code&gt;zx279128s_e2631_defconfig&lt;/code&gt; → &lt;code&gt;zImage&lt;/code&gt; → 单目标 &lt;code&gt;zte/zx279128s-e2631.dtb&lt;/code&gt; → &lt;code&gt;e2631-tools/pack_uimage.py&lt;/code&gt; 打包 → 上传 artifact → 在 tag 上挂到 Release。&lt;/p&gt;&lt;p&gt;当前状态：&lt;strong&gt;v0.1.1 已发布&lt;/strong&gt;（2026-08-31），Release 附件 &lt;code&gt;uImage-e2631.img&lt;/code&gt; 为 Actions 验证产物（zImage + DTB），可直接下载引导。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;提示&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;后续发新版：&lt;code&gt;git tag v0.1.2&lt;/code&gt; 后 &lt;code&gt;git push origin v0.1.2&lt;/code&gt;，Actions 会自动构建并更新 Release，无需手动传附件。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;9.4 参考项目&lt;a href=&quot;#94-参考项目&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&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;a href=&quot;https://github.com/cnjn/linux-mainline-zte-zxslc-sr1010&quot; target=&quot;_blank&quot;&gt;cnjn/linux-mainline-zte-zxslc-sr1010&lt;/a&gt;&lt;/td&gt;&lt;td&gt;SR1010 主线移植，本项目的基础（6.18.38 + ZX279133 平台支持）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://gitlab.com/xuejian1354/toolchains/&quot; target=&quot;_blank&quot;&gt;xuejian1354/toolchains&lt;/a&gt;&lt;/td&gt;&lt;td&gt;官方 ZX27912X 交叉工具链&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;a href=&quot;https://github.com/1234205a/zte-sr1010-research&quot; target=&quot;_blank&quot;&gt;1234205a/zte-sr1010-research&lt;/a&gt;&lt;/td&gt;&lt;td&gt;原厂固件分析方法论&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;提示&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;仓库内 &lt;code&gt;research.md&lt;/code&gt; 记录了内核版本调研结论：6.18.38 是 &lt;strong&gt;6.18 LTS 稳定线&lt;/strong&gt;的第 38 个补丁版本（2026-07-04 发布，LTS 预计 EOL 2028-12），同线当前最新为 6.18.45；cnjn 分支基于 6.18.38 官方基线加入 ZX279133 平台支持。树内 &lt;code&gt;upstream-series/&lt;/code&gt; 保留了该 ZX279133 16 补丁集（6.18.38 基线）作为参考。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;十、待办与未来工作&lt;a href=&quot;#十待办与未来工作&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&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;有线网卡驱动&lt;/td&gt;&lt;td&gt;三件套：GEPHY（4 个千兆 PHY）、&lt;code&gt;zx279128s-mdio&lt;/code&gt; 控制器、TM/NPP/PP 包处理引擎；参考原厂 &lt;code&gt;tm.ko&lt;/code&gt;（1.2MB）/ &lt;code&gt;switch.ko&lt;/code&gt;（223KB）逆向，cnjn 的 ZX279133 MDIO 补丁（0008）可作控制器写法参考&lt;/td&gt;&lt;td&gt;⏳ 下一个目标&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;第二核 SMP&lt;/td&gt;&lt;td&gt;原厂 enable-method &lt;code&gt;zte,zx279128-smp&lt;/code&gt;，需逆向上核流程（推测类似 A9 的 NDPGFCR / freeze 寄存器）&lt;/td&gt;&lt;td&gt;⏳ 未移植&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;SPI-NAND + 透明解密&lt;/td&gt;&lt;td&gt;ZTE SPIFC 控制器 + Denali NAND；flash 分区带 AES-128-ECB 透明解密（密钥由 &lt;code&gt;zte_token&lt;/code&gt; 派生）；本移植不碰 flash，不含任何原厂密钥&lt;/td&gt;&lt;td&gt;⏳ 未移植&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;PCIe host（MT7916 WiFi）&lt;/td&gt;&lt;td&gt;&lt;code&gt;zte,ZX279127-pcie&lt;/code&gt; 未移植；&lt;code&gt;mt7916e&lt;/code&gt; 驱动已编入内核，PCIe 通了 WiFi 即用&lt;/td&gt;&lt;td&gt;⏳ 未移植&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;时钟树&lt;/td&gt;&lt;td&gt;topcrm / lsp0crpm / lsp1crpm 用 fixed-clock 占位；A9 PERIPHCLK 500MHz 实测可用，外设时钟精度未逐一校准&lt;/td&gt;&lt;td&gt;⚠️ 占位&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DW MMC&lt;/td&gt;&lt;td&gt;SD 控制器在原厂 DT 里就是 disabled&lt;/td&gt;&lt;td&gt;⚠️ DT 已写&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;USB host&lt;/td&gt;&lt;td&gt;dwc2 / dwc3 驱动已验证，但本机型无对外 USB 口、控制器时钟未接，DT 保持禁用&lt;/td&gt;&lt;td&gt;⚠️ 禁用&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;OpenWrt / ImmortalWrt 移植&lt;/td&gt;&lt;td&gt;需先补齐网卡与闪存驱动&lt;/td&gt;&lt;td&gt;⏳ 规划中&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;提示&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;已完成且已上板验证的项还包括：L2C-310 / GIC / 全局定时器（单核 1000 BogoMIPS）；DTS 中 NAND / SPIFC / PCIe / MDIO / GEPHY 节点已描述但未启用；原厂网络命令 ip / iptables / ip6tables / ebtables / tc / dnsmasq / curl 已打包进 initramfs。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;十一、总结&lt;a href=&quot;#十一总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;链路已全部打通&lt;/strong&gt;：固件解密 → SoC 逆向 → U-Boot 引导 → 主线 6.18.38 → busybox shell → mihomo 适配 → 开源发布；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;关键经验&lt;/strong&gt;：XIP 加载陷阱、&lt;code&gt;0x42000000&lt;/code&gt; 禁区、强制 &lt;code&gt;-marm&lt;/code&gt;、&lt;code&gt;-j4&lt;/code&gt; 上限、CRLF 行尾、嵌入式 initramfs、armv5 软浮点；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;硬件上限&lt;/strong&gt;：无 VFP / NEON / idiv，代理加解密是 CPU 软算，跑满速会有明显瓶颈，但已做到不非法指令、特性齐全；&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;可复现&lt;/strong&gt;：源码、设备树、配置、工具、双平台一键脚本、CI 全部在仓库中，拉下来就能编，改完还能继续编。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;文档版本：&lt;/strong&gt; 2026-08-31
&lt;strong&gt;适用系统：&lt;/strong&gt; Windows 10/11（MSYS2 构建） / WSL2
&lt;strong&gt;适用平台：&lt;/strong&gt; 中兴 ZTE ZXHN E2631（巡天 AX3000）&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;</content:encoded></item><item><title>TCL/雷鸟电视 ADB 安装拦截排查与永久放行</title><link>https://blog.zlion.top/posts/tcl-tv-adb-install-unlock/</link><guid isPermaLink="true">https://blog.zlion.top/posts/tcl-tv-adb-install-unlock/</guid><description>定位 TCL/雷鸟电视系统安装器拦截 ADB 安装的验证组件，通过改写 InstallConfig 配置实现免禁用、免脚本的永久放行</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;本文档记录一次针对 TCL 电视（mt5879 方案，Android 11）「ADB 无法安装应用，必须先禁用安装器」问题的完整排查过程与最终解法。
&lt;strong&gt;适用设备：&lt;/strong&gt; TCL 电视（mt5879_cn 方案，Android 11，其他 TCL/雷鸟机型可参考）
&lt;strong&gt;适用人群：&lt;/strong&gt; 会使用 ADB 的电视用户 / 运维玩家&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;1. 问题现象&lt;a href=&quot;#1-问题现象&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;TCL 电视通过 Wi-Fi ADB 连接后，安装应用直接报错：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;connect&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.5.6&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xxx.apk&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;报错内容：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb.exe: failed to install xxx.apk: Failure [INSTALL_FAILED_VERIFICATION_FAILURE]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;只有先禁用系统安装器 &lt;code&gt;com.android.packageinstaller&lt;/code&gt; 才能安装；但安装完成后&lt;strong&gt;必须重新启用&lt;/strong&gt;，否则电视无法开机。整个流程繁琐且有翻车风险。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;警告&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;code&gt;com.android.packageinstaller&lt;/code&gt; 是开机关键组件，任何时候都不要让电视在「安装器被禁用」的状态下重启。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;2. 排查过程&lt;a href=&quot;#2-排查过程&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;2.1 缩小范围：排除 TCL 安全守护&lt;a href=&quot;#21-缩小范围排除-tcl-安全守护&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;先怀疑的是 TCL 安全守护 &lt;code&gt;com.tcl.guard&lt;/code&gt;，但实测它的启停与拦截无关；只有禁用 &lt;code&gt;com.android.packageinstaller&lt;/code&gt; 才能放行安装，说明拦截逻辑在安装器应用自身。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2 复现拦截并抓取日志&lt;a href=&quot;#22-复现拦截并抓取日志&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;保持安装器启用状态，安装一个真实 APK 并抓取系统日志：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;logcat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-c&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-r&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xxx.apk&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;logcat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &amp;gt; &lt;/span&gt;&lt;span&gt;block.log&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;日志中出现关键线索：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Start proc com.android.packageinstaller for broadcast&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{com.android.packageinstaller/com.android.packageinstaller.verifier.VerifierReciver}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Foreground service started ...: service com.android.packageinstaller/.verifier.StrategyService&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Config:Grabber:InstallConfig: Currrent content from Db is ：[{&quot;enable&quot;:&quot;true&quot;,&quot;strategies&quot;:[...]}]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;D ConfigProvider: feature:content://com.tcl.providers.config/InstallConfig&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;拦截者浮出水面：&lt;strong&gt;TCL 在系统安装器里内置了一个验证组件&lt;/strong&gt;，其策略来自一个内容提供者。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.3 拉取安装器 APK 分析&lt;a href=&quot;#23-拉取安装器-apk-分析&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;shell&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;path&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;com.android.packageinstaller&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;MSYS_NO_PATHCONV&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;adb&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pull&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/system/priv-app/PackageInstaller/PackageInstaller.apk&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;unzip&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-o&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-q&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;PackageInstaller.apk&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;apk&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;提取 dex 字符串确认：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;com.android.packageinstaller.verifier.VerifierReciver&lt;/code&gt; 监听 &lt;code&gt;android.intent.action.PACKAGE_NEEDS_VERIFICATION&lt;/code&gt;，持有 &lt;code&gt;android.permission.PACKAGE_VERIFICATION_AGENT&lt;/code&gt; 权限（全系统仅它持有）；&lt;/li&gt;
&lt;li&gt;&lt;code&gt;StrategyService&lt;/code&gt; 每次安装时从 &lt;code&gt;content://com.tcl.providers.config/InstallConfig&lt;/code&gt; 读取策略 JSON。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;查询该配置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;shell&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;content&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--uri&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;content://com.tcl.providers.config/InstallConfig&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Row: 0 project_id=InstallConfig, config_content=[{&quot;enable&quot;:&quot;true&quot;,&quot;strategies&quot;:[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&quot;name&quot;:&quot;safeStrategy&quot;,&quot;enable&quot;:&quot;true&quot;,&quot;priority&quot;:&quot;0&quot;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&quot;name&quot;:&quot;blackListStrategy&quot;,&quot;enable&quot;:&quot;true&quot;,&quot;packages&quot;:[],&quot;priority&quot;:&quot;1&quot;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&quot;name&quot;:&quot;thridStrategy&quot;,&quot;enable&quot;:&quot;false&quot;,&quot;packages&quot;:[...],&quot;priority&quot;:&quot;2&quot;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&quot;name&quot;:&quot;launcherStrategy&quot;,&quot;enable&quot;:&quot;true&quot;,&quot;packages&quot;:[],&quot;priority&quot;:&quot;3&quot;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&quot;name&quot;:&quot;overDueStrategy&quot;,&quot;enable&quot;:&quot;true&quot;,&quot;packages&quot;:[],&quot;priority&quot;:&quot;4&quot;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&quot;name&quot;:&quot;pmStrategy&quot;,&quot;enable&quot;:&quot;true&quot;,&quot;priority&quot;:&quot;5&quot;}]}]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;重要&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;组件级禁用（&lt;code&gt;pm disable-user com.android.packageinstaller/.verifier.VerifierReciver&lt;/code&gt;）会被系统拒绝（&lt;code&gt;Shell cannot change component state&lt;/code&gt;），但 shell 对这个配置提供者&lt;strong&gt;有写权限&lt;/strong&gt;——这就是突破口。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;3. 拦截机制原理&lt;a href=&quot;#3-拦截机制原理&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;enable=true 且策略生效&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;enable=false 无策略可用&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;adb install&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;PackageManagerService 创建安装会话&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;发送 PACKAGE_NEEDS_VERIFICATION 广播&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;VerifierReciver 接收&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;StrategyService 启动&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;读取 InstallConfig&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;verifyPendingInstall 拒绝&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;INSTALL_FAILED_VERIFICATION_FAILURE&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;不返回拒绝裁决&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;安装继续，Success&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;enable=true 且策略生效&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;enable=false 无策略可用&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;adb install&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;PackageManagerService 创建安装会话&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;发送 PACKAGE_NEEDS_VERIFICATION 广播&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;VerifierReciver 接收&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;StrategyService 启动&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;读取 InstallConfig&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;verifyPendingInstall 拒绝&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;INSTALL_FAILED_VERIFICATION_FAILURE&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;不返回拒绝裁决&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;安装继续，Success&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;要点：&lt;/p&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;code&gt;com.android.packageinstaller&lt;/code&gt;&lt;/td&gt;&lt;td&gt;TCL 改造的系统安装器，同时是开机关键组件&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;.verifier.VerifierReciver&lt;/code&gt;&lt;/td&gt;&lt;td&gt;接收系统安装验证广播&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;.verifier.StrategyService&lt;/code&gt;&lt;/td&gt;&lt;td&gt;按策略决定放行/拒绝&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;com.tcl.providers.config/InstallConfig&lt;/code&gt;&lt;/td&gt;&lt;td&gt;策略配置存储，shell 可读写&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;4. 永久放行方案&lt;a href=&quot;#4-永久放行方案&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;把 &lt;code&gt;InstallConfig&lt;/code&gt; 的总开关改写为 &lt;code&gt;false&lt;/code&gt;，验证器读不到可用策略即放行。&lt;strong&gt;安装器全程保持启用，开机无影响，重启后依然生效。&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;电脑 / 手机两个渠道任选其一&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;下面给出电脑（PowerShell）和手机（甲壳虫 ADB）两种写法，&lt;strong&gt;效果完全相同，选一个执行即可&lt;/strong&gt;，不要都执行。
手机端有一个前置条件：先在甲壳虫里连接电视并&lt;strong&gt;确认设备在线&lt;/strong&gt;。连接断开后输入的任何命令都会报 &lt;code&gt;no devices/emulators found&lt;/code&gt;，且报错会被界面吞掉——这是「命令没生效」最常见的原因。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;电脑（PowerShell）&lt;/strong&gt;——第一条改配置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;adb shell content update &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt;uri content:&lt;/span&gt;&lt;span&gt;//&lt;/span&gt;&lt;span&gt;com.tcl.providers.config&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;InstallConfig &lt;/span&gt;&lt;span&gt;--&lt;/span&gt;&lt;span&gt;bind config_content:s:false&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;电脑（PowerShell）&lt;/strong&gt;——第二条重启验证器：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;adb shell am force&lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;stop com.android.packageinstaller&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;手机（甲壳虫 ADB）&lt;/strong&gt;——第一条改配置：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;content&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--uri&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;content://com.tcl.providers.config/InstallConfig&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--bind&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config_content:s:&lt;/span&gt;&lt;span&gt;false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;手机（甲壳虫 ADB）&lt;/strong&gt;——第二条重启验证器：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;am&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;force-stop&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;com.android.packageinstaller&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;建议&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;两个渠道的命令都设计成零引号：&lt;code&gt;false&lt;/code&gt; 值不含引号和冒号，解析器读到它同样走「解析异常 → 无策略 → 放行」路径，效果与完整 JSON 等价。&lt;strong&gt;电脑端也用同款零引号写法&lt;/strong&gt;——Windows PowerShell 5.1 与 7 给外部程序传参的行为不同，带多层引号的长命令在 5.1 上会丢引号导致写入坏数据，零引号写法在两个版本行为完全一致。&lt;strong&gt;每条命令执行前都确认设备在线。&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;验证写入结果：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;shell&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;content&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;query&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--uri&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;content://com.tcl.providers.config/InstallConfig&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--projection&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config_content&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;输出应为（电脑 / 手机端相同）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Row: 0 config_content=false&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;之后安装直接：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xxx.apk&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;提示&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;code&gt;content&lt;/code&gt; 命令的 &lt;code&gt;--bind&lt;/code&gt; 参数按冒号分段解析，任何含 JSON 的命令里冒号都必须转义——这也是第 5 节恢复命令比解锁复杂的原因。解锁因为用了零引号的 &lt;code&gt;false&lt;/code&gt; 值，两个渠道都天然免疫此问题。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;5. 恢复原始拦截&lt;a href=&quot;#5-恢复原始拦截&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;想恢复 TCL 原始策略时，把配置写回&lt;strong&gt;完整的原厂策略数组&lt;/strong&gt;即可。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;注意&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;恢复&lt;strong&gt;必须&lt;/strong&gt;写回下面完整的策略 JSON。只写 &lt;code&gt;{&quot;enable&quot;:&quot;true&quot;}&lt;/code&gt; 这种短形式，解析器照样按异常处理，拦截并不会恢复。恢复命令含引号和转义，若在手机端执行失败，改用电脑端即可（不影响已解锁状态）。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;电脑（PowerShell）&lt;/strong&gt;——本地生成恢复脚本 → 推送到电视 → 执行（三行按顺序，PowerShell 5.1 和 7 均实测可用）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Set-Content&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;NoNewline &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;Encoding Ascii &lt;/span&gt;&lt;/span&gt;&lt;span&gt;$env:TEMP&lt;/span&gt;&lt;span&gt;\restore.sh &lt;/span&gt;&lt;span&gt;&apos;content update --uri content://com.tcl.providers.config/InstallConfig --bind &lt;/span&gt;&lt;span&gt;&apos;&apos;&lt;/span&gt;&lt;span&gt;config_content:s:[{&quot;enable&quot;\:&quot;true&quot;,&quot;strategies&quot;\:[{&quot;name&quot;\:&quot;safeStrategy&quot;,&quot;enable&quot;\:&quot;true&quot;,&quot;priority&quot;\:&quot;0&quot;},{&quot;name&quot;\:&quot;blackListStrategy&quot;,&quot;enable&quot;\:&quot;true&quot;,&quot;packages&quot;\:[],&quot;priority&quot;\:&quot;1&quot;},{&quot;name&quot;\:&quot;thridStrategy&quot;,&quot;enable&quot;\:&quot;false&quot;,&quot;packages&quot;\:[&quot;com.dangbeimarket&quot;,&quot;com.shafa.market&quot;,&quot;com.ant.store.appstore&quot;],&quot;priority&quot;\:&quot;2&quot;},{&quot;name&quot;\:&quot;launcherStrategy&quot;,&quot;enable&quot;\:&quot;true&quot;,&quot;packages&quot;\:[],&quot;priority&quot;\:&quot;3&quot;},{&quot;name&quot;\:&quot;overDueStrategy&quot;,&quot;enable&quot;\:&quot;true&quot;,&quot;packages&quot;\:[],&quot;priority&quot;\:&quot;4&quot;},{&quot;name&quot;\:&quot;pmStrategy&quot;,&quot;enable&quot;\:&quot;true&quot;,&quot;priority&quot;\:&quot;5&quot;}]}]&lt;/span&gt;&lt;span&gt;&apos;&apos;&lt;/span&gt;&lt;span&gt; --where &quot;project_id=&lt;/span&gt;&lt;span&gt;&apos;&apos;&lt;/span&gt;&lt;span&gt;InstallConfig&lt;/span&gt;&lt;span&gt;&apos;&apos;&lt;/span&gt;&lt;span&gt;&quot;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb push &lt;/span&gt;&lt;span&gt;$env:TEMP&lt;/span&gt;&lt;span&gt;&lt;span&gt;\restore.sh &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;local&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;tmp&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;restore.sh&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;adb shell sh &lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;/span&gt;&lt;span&gt;data&lt;/span&gt;&lt;span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;local&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;tmp&lt;/span&gt;&lt;span&gt;/&lt;/span&gt;&lt;span&gt;restore.sh&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;手机（甲壳虫 ADB）：&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;content&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--uri&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;content://com.tcl.providers.config/InstallConfig&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--bind&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;config_content:s:[{&quot;enable&quot;\:&quot;true&quot;,&quot;strategies&quot;\:[{&quot;name&quot;\:&quot;safeStrategy&quot;,&quot;enable&quot;\:&quot;true&quot;,&quot;priority&quot;\:&quot;0&quot;},{&quot;name&quot;\:&quot;blackListStrategy&quot;,&quot;enable&quot;\:&quot;true&quot;,&quot;packages&quot;\:[],&quot;priority&quot;\:&quot;1&quot;},{&quot;name&quot;\:&quot;thridStrategy&quot;,&quot;enable&quot;\:&quot;false&quot;,&quot;packages&quot;\:[&quot;com.dangbeimarket&quot;,&quot;com.shafa.market&quot;,&quot;com.ant.store.appstore&quot;],&quot;priority&quot;\:&quot;2&quot;},{&quot;name&quot;\:&quot;launcherStrategy&quot;,&quot;enable&quot;\:&quot;true&quot;,&quot;packages&quot;\:[],&quot;priority&quot;\:&quot;3&quot;},{&quot;name&quot;\:&quot;overDueStrategy&quot;,&quot;enable&quot;\:&quot;true&quot;,&quot;packages&quot;\:[],&quot;priority&quot;\:&quot;4&quot;},{&quot;name&quot;\:&quot;pmStrategy&quot;,&quot;enable&quot;\:&quot;true&quot;,&quot;priority&quot;\:&quot;5&quot;}]}]&apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--where&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;project_id=&apos;InstallConfig&apos;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;恢复后同样重启验证器：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;am&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;force-stop&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;com.android.packageinstaller&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;验证：查询命令同第 4 节，输出应为 &lt;code&gt;[{&quot;enable&quot;:&quot;true&quot;,&quot;strategies&quot;:[...]}]&lt;/code&gt;。&lt;/p&gt;&lt;p&gt;原始配置全文（备份用）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[{&lt;/span&gt;&lt;span&gt;&quot;enable&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;true&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;strategies&quot;&lt;/span&gt;&lt;span&gt;:[{&lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;safeStrategy&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;enable&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;true&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;priority&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;0&quot;&lt;/span&gt;&lt;span&gt;},{&lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;blackListStrategy&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;enable&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;true&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;packages&quot;&lt;/span&gt;&lt;span&gt;:[],&lt;/span&gt;&lt;span&gt;&quot;priority&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;1&quot;&lt;/span&gt;&lt;span&gt;},{&lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;thridStrategy&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;enable&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;false&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;packages&quot;&lt;/span&gt;&lt;span&gt;:[&lt;/span&gt;&lt;span&gt;&quot;com.dangbeimarket&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;com.shafa.market&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;com.ant.store.appstore&quot;&lt;/span&gt;&lt;span&gt;],&lt;/span&gt;&lt;span&gt;&quot;priority&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;2&quot;&lt;/span&gt;&lt;span&gt;},{&lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;launcherStrategy&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;enable&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;true&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;packages&quot;&lt;/span&gt;&lt;span&gt;:[],&lt;/span&gt;&lt;span&gt;&quot;priority&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;3&quot;&lt;/span&gt;&lt;span&gt;},{&lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;overDueStrategy&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;enable&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;true&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;packages&quot;&lt;/span&gt;&lt;span&gt;:[],&lt;/span&gt;&lt;span&gt;&quot;priority&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;4&quot;&lt;/span&gt;&lt;span&gt;},{&lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;pmStrategy&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;enable&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;true&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&quot;priority&quot;&lt;/span&gt;&lt;span&gt;:&lt;/span&gt;&lt;span&gt;&quot;5&quot;&lt;/span&gt;&lt;span&gt;}]}]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;6. 兜底方案：禁用-安装-恢复&lt;a href=&quot;#6-兜底方案禁用-安装-恢复&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;若上述配置方案因固件更新失效，可回退到传统方案：禁用安装器 → 安装 → 恢复。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;shell&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;disable-user&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;com.android.packageinstaller&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;install&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-r&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;xxx.apk&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;shell&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;pm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;enable&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;com.android.packageinstaller&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;注意&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;禁用后务必确认恢复：&lt;code&gt;adb shell &quot;dumpsys package com.android.packageinstaller&quot;&lt;/code&gt; 输出 &lt;code&gt;enabled=1&lt;/code&gt; 才是启用状态（&lt;code&gt;enabled=3&lt;/code&gt; 为禁用）。电视在安装器禁用状态下重启可能无法开机。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;核心兜底逻辑（PowerShell 脚本要点）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;try&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;adb shell pm &lt;/span&gt;&lt;span&gt;disable-user&lt;/span&gt;&lt;span&gt; com.android.packageinstaller&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;adb install &lt;/span&gt;&lt;span&gt;-&lt;/span&gt;&lt;span&gt;r &lt;/span&gt;&lt;span&gt;$apk&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;finally&lt;/span&gt;&lt;span&gt; {&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;adb shell pm enable com.android.packageinstaller&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;try/finally&lt;/code&gt; 保证即使安装失败、甚至 ADB 中途断线，恢复命令也会执行。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;7. 故障排查&lt;a href=&quot;#7-故障排查&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;strong&gt;Q：写入命令报 &lt;code&gt;Binding not well formed&lt;/code&gt;？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;JSON 里的冒号转义错了位：手机端恢复命令的冒号必须写成 &lt;code&gt;\:&lt;/code&gt;（单反斜杠），写成 &lt;code&gt;\\:&lt;/code&gt;（双反斜杠）反而会报这个错。电脑端恢复用「本地脚本 + push」方式，转义已内置，无需手改。解锁则永远可以用零引号写法，天然免疫此问题。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：手机端命令执行了但毫无反应？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;甲壳虫与电视的连接已断开。先在 app 里重连 &lt;code&gt;192.168.5.6:5555&lt;/code&gt; 并确认设备在线，再执行命令；每条命令执行前都确认在线。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：写入成功但仍报 &lt;code&gt;INSTALL_FAILED_VERIFICATION_FAILURE&lt;/code&gt;？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;验证器进程缓存了旧配置，强制重启它：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;shell&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;am&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;force-stop&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;com.android.packageinstaller&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Q：过了一段时间又被拦截了？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;TCL 云端配置同步可能覆盖了本地配置，重新执行第 4 节的写入命令即可。可先用第 4 节的查询命令确认当前配置内容。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Q：&lt;code&gt;adb devices&lt;/code&gt; 显示 &lt;code&gt;unauthorized&lt;/code&gt;？&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;在电视屏幕上找到「允许 USB 调试」弹窗，勾选「一律允许」并确认；若电视无弹窗，重插网络 ADB 连接触发。&lt;/p&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;文档版本：&lt;/strong&gt; 2026-09-05
&lt;strong&gt;适用设备：&lt;/strong&gt; TCL 电视 mt5879_cn 方案（Android 11），其他 TCL/雷鸟机型可参考
&lt;strong&gt;适用平台：&lt;/strong&gt; Wi-Fi ADB / USB ADB&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;</content:encoded></item><item><title>Z500/Z503/Z507升级小方糖公版系统</title><link>https://blog.zlion.top/posts/z503-to-public/</link><guid isPermaLink="true">https://blog.zlion.top/posts/z503-to-public/</guid><description>记录 Z503 通过 Telnet 扩容分区，升级为公版的过程.</description><pubDate>Fri, 28 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;section&gt;&lt;h2&gt;说明&lt;a href=&quot;#说明&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;该教程由&lt;a href=&quot;https://www.right.com.cn/forum/?639610&quot; target=&quot;_blank&quot;&gt;@cnjn&lt;/a&gt;首发于恩山论坛：&lt;a href=&quot;https://www.right.com.cn/forum/thread-8480346-1-1.html&quot; target=&quot;_blank&quot;&gt;中兴小方糖 Z503 刷 Z506 固件&lt;/a&gt;，这里进行优化，适用于小白操作。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;准备工作&lt;a href=&quot;#准备工作&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;https://wwanu.lanzoue.com/ijPLK3vbfl1i&quot; target=&quot;_blank&quot;&gt;Z506官方固件&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wwbnc.lanzoub.com/iuDNi451dula&quot; target=&quot;_blank&quot;&gt;一键开启Telnet脚本&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;https://wwbnc.lanzoub.com/iP5mZ451e9hg&quot; target=&quot;_blank&quot;&gt;一键修改Tag脚本&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;MobaXterm终端工具&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;操作步骤&lt;a href=&quot;#操作步骤&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 开启Telnet&lt;a href=&quot;#1-开启telnet&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;从路由器网页管理后台导出配置文件&lt;code&gt;config.bin&lt;/code&gt;，与&lt;code&gt;一键开启Telnet脚本&lt;/code&gt;放在一起，双击脚本运行得到&lt;code&gt;config-telnet-enable.bin&lt;/code&gt;，将其再从管理后台还原回去，路由器会自动重启，Telnet就打开了，默认的账密为admin。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 扩容分区&lt;a href=&quot;#2-扩容分区&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;使用MobaXterm新建Telnet会话连接路由器，执行下面的命令，扩容 /var 目录。&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mount&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-o&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;remount,size=32M&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 修改设备型号&lt;a href=&quot;#3-修改设备型号&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;将设备型号Z500/Z503/Z507通通改为中兴的公版型号Z506。&lt;/p&gt;&lt;p&gt;设置MobaXterm的TFTP服务
&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;TFTP 目录配置参考&quot; loading=&quot;lazy&quot; width=&quot;1363&quot; height=&quot;1016&quot; src=&quot;/_astro/TFTP.Dore2Zdg_8bPMI.webp&quot; /&gt;&lt;figcaption&gt;TFTP 目录配置参考&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;命令中的 &lt;code&gt;192.168.5.7&lt;/code&gt;请替换为电脑当前的局域网 IP。&lt;/p&gt;&lt;section&gt;&lt;h4&gt;3.1 提取Tag分区&lt;a href=&quot;#31-提取tag分区&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/dev/mtdblock2&lt;/span&gt;&lt;span&gt; &amp;gt; &lt;/span&gt;&lt;span&gt;/tmp/tag.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tftp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-l&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/tag.bin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-r&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tag.bin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.5.7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;3.2 修改Tag分区&lt;a href=&quot;#32-修改tag分区&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;把提取出来的tag.bin与&lt;code&gt;一键修改Tag脚本&lt;/code&gt;放在一起双击脚本，得到&lt;code&gt;tag-Z506.bin&lt;/code&gt;文件，放到TFTP目录中。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;3.3 写入Tag分区&lt;a href=&quot;#33-写入tag分区&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tftp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-g&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-l&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/tag.bin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-r&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tag-E2631.bin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.5.7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/tag.bin&lt;/span&gt;&lt;span&gt; &amp;gt; &lt;/span&gt;&lt;span&gt;/dev/mtdblock2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 上传公版固件&lt;a href=&quot;#4-上传公版固件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;进入路由器管理后台，找到系统更新固件上传&lt;code&gt;zxhnze50x_hv100_fv1002b28000_firmware-20230615093954.bin&lt;/code&gt; ,确认升级即可。重启完毕后就成功刷为公版系统了。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. 重置&lt;a href=&quot;#5-重置&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;升级完成后可以恢复出厂设置一次。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>设计遥控器：一款 Android TV 手机遥控 App 的设计实录</title><link>https://blog.zlion.top/posts/design-a-tv-remote-app/</link><guid isPermaLink="true">https://blog.zlion.top/posts/design-a-tv-remote-app/</guid><description>从设计目标、iOS 16 设计语言到触控板与浮动光标的交互方案，完整复盘一款手机遥控 Android TV App 的设计过程。</description><pubDate>Mon, 24 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;本文档面向想要设计「手机遥控电视」类 App 的产品与开发人员，涵盖设计目标、视觉语言、信息架构、核心交互与踩坑经验。
&lt;strong&gt;适用系统：&lt;/strong&gt; Android 8.0+（TV 端）/ Android 8.0+（手机端）
&lt;strong&gt;适用平台：&lt;/strong&gt; 智能电视 / 电视盒子 + 安卓手机
&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;手机遥控电视概念图&quot; loading=&quot;lazy&quot; width=&quot;1536&quot; height=&quot;1024&quot; src=&quot;/_astro/hero.BpmyQNt-_1ck8NV.webp&quot; /&gt;&lt;figcaption&gt;手机遥控电视概念图&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/blockquote&gt;
&lt;section&gt;&lt;h2&gt;1. 为什么要重新设计遥控器&lt;a href=&quot;#1-为什么要重新设计遥控器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;智能电视的遥控器越做越短：按键从三十多个砍到十几个，最后只剩一个十字键加几个功能键。但电视上的内容越来越复杂——应用商店、设置菜单、登录页面、验证码输入框，都在逼着用户在「十字键一格一格挪」里浪费时间。&lt;/p&gt;&lt;p&gt;实体遥控器的物理极限暴露无遗：&lt;/p&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;搜索片名&lt;/td&gt;&lt;td&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;/td&gt;&lt;td&gt;手机上点一下推送&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;输入密码&lt;/td&gt;&lt;td&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;/td&gt;&lt;td&gt;触控板 + 光标&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;于是我们决定做一款手机遥控 Android TV 的 App，对标市面上的八爪鱼遥控：&lt;strong&gt;TV 端 + 手机端双端架构&lt;/strong&gt;，手机负责输入与展示，TV 端负责接收指令并注入系统事件。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;2. 设计目标与约束&lt;a href=&quot;#2-设计目标与约束&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;设计开始前，先把约束摆清楚。约束不是敌人，它决定了方案的下限。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;2.1 产品功能范围&lt;a href=&quot;#21-产品功能范围&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;六大核心功能一个都不能少：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;基础遥控（方向、确认、返回、主页、菜单、音量、电源）&lt;/li&gt;
&lt;li&gt;App 安装推送&lt;/li&gt;
&lt;li&gt;远程输入法（IME）&lt;/li&gt;
&lt;li&gt;电视清理 / 加速&lt;/li&gt;
&lt;li&gt;远程应用管理（启动 / 卸载）&lt;/li&gt;
&lt;li&gt;基于传感器的 TV 端浮动光标&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2 技术约束&lt;a href=&quot;#22-技术约束&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;重要&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;TV 端无法开启 Accessibility 服务（部分厂商环境限制），ADB 路线也被明确排除。输入注入必须依赖 AccessibilityService 或厂商私有插件，这直接决定了浮动光标必须做成「虚拟光标」而非系统鼠标。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;手机与电视在同一局域网，走 HTTP（TCP）+ UDP 自研协议&lt;/li&gt;
&lt;li&gt;TV 端覆盖层窗口必须由 AccessibilityService 上下文创建&lt;/li&gt;
&lt;li&gt;传感器数据驱动光标，位移采用 0..1000 归一化坐标，TV 端按分辨率缩放&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.3 设计目标&lt;a href=&quot;#23-设计目标&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;一句话：&lt;strong&gt;让用户拿起手机的三秒内，就能完成一次电视操作。&lt;/strong&gt;&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;3. 设计语言：为什么选 iOS 16 风格&lt;a href=&quot;#3-设计语言为什么选-ios-16-风格&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;遥控器 App 是一个「工具」，工具的最高境界是被忽略——用户看的是电视，不是手机。因此视觉上追求极简、安静、零学习成本。&lt;/p&gt;&lt;p&gt;最终确定的设计规范：&lt;/p&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;&lt;code&gt;#F2F2F7&lt;/code&gt;（iOS 分组式灰底）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;卡片圆角&lt;/td&gt;&lt;td&gt;14dp，白色卡片浮在灰底上&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;图标&lt;/td&gt;&lt;td&gt;线性图标（stroke 风格），不用填充图标&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;导航&lt;/td&gt;&lt;td&gt;底部 Tab Bar，四个入口&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;特效&lt;/td&gt;&lt;td&gt;毛玻璃（半透明 + 模糊），仅用于顶栏与 Tab Bar&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;阴影&lt;/td&gt;&lt;td&gt;无阴影，靠灰底与白卡的对比分层&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;警告&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;明确禁用一切 Material Design 元素：FAB 悬浮按钮、ripple 水波纹、hamburger 抽屉菜单、投影卡片。这些元素一旦混入，整个界面会立刻「变味」，视觉一致性是这类工具 App 的生命线。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;设计语言统一的好处立竿见影：遥控页、应用页、工具页、我的页四个页面，用户在任何一页都能凭肌肉记忆找到返回方式与操作入口。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;遥控页 UI 设计稿&quot; loading=&quot;lazy&quot; width=&quot;1024&quot; height=&quot;1536&quot; src=&quot;/_astro/ui-mockup.DSU3kmhK_rvD5D.webp&quot; /&gt;&lt;figcaption&gt;遥控页 UI 设计稿&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;4. 信息架构：四个底部 Tab&lt;a href=&quot;#4-信息架构四个底部-tab&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;信息架构遵循「高频前置、低频收敛」原则：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;遥控 App&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;遥控 Tab&lt;br /&gt;&lt;br /&gt;方向键 / 触控板 / 音量&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;应用 Tab&lt;br /&gt;&lt;br /&gt;安装推送 / 启动卸载&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;工具 Tab&lt;br /&gt;&lt;br /&gt;清理加速 / 输入法&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;我的 Tab&lt;br /&gt;&lt;br /&gt;设备管理 / 设置&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;遥控 App&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;遥控 Tab&lt;br /&gt;&lt;br /&gt;方向键 / 触控板 / 音量&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;应用 Tab&lt;br /&gt;&lt;br /&gt;安装推送 / 启动卸载&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;工具 Tab&lt;br /&gt;&lt;br /&gt;清理加速 / 输入法&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;我的 Tab&lt;br /&gt;&lt;br /&gt;设备管理 / 设置&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;遥控 Tab&lt;/strong&gt;：默认首屏，打开 App 即用，承载 80% 的高频操作&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;应用 Tab&lt;/strong&gt;：TV 端应用列表镜像，支持远程启动、卸载、推送安装&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;工具 Tab&lt;/strong&gt;：清理加速、远程输入法等中低频功能&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;我的 Tab&lt;/strong&gt;：设备连接状态、版本信息、设置项&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;底部 Tab Bar 采用毛玻璃效果，内容滚动时图标下若隐若现，既保持层次又不喧宾夺主。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;5. 遥控页：一块屏幕装下整个遥控器&lt;a href=&quot;#5-遥控页一块屏幕装下整个遥控器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;遥控页是整个 App 的核心，布局从上到下分为四层：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;设备状态条&lt;/strong&gt;：当前连接的电视名称与信号状态，一眼确认「我连的是哪台电视」&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;触控板区&lt;/strong&gt;：大面积手势区域，滑动即移动 TV 端光标，点按即确认&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;十字键区&lt;/strong&gt;：圆形 D-pad，中心 OK 键，四向箭头线性图标&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;功能键排&lt;/strong&gt;：返回、主页、菜单、音量加减、电源，一行排列&lt;/li&gt;
&lt;/ol&gt;&lt;section&gt;&lt;h3&gt;5.1 按键布局的取舍&lt;a href=&quot;#51-按键布局的取舍&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;实体遥控器按 键隔离 布局，手机屏幕按 使用频率 布局：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;方向与确认是最高频操作，占据视觉中心&lt;/li&gt;
&lt;li&gt;音量键做成横向长条，天然对应「左右/上下滑动调音量」的心智模型&lt;/li&gt;
&lt;li&gt;电源键放在角落，防止误触——误触电源把电视关了，是这类 App 差评的重灾区&lt;/li&gt;
&lt;/ul&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;建议&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;所有按键的点击热区不小于 48dp，宁可视觉留白多一点，也不要让用户在大屏手机上出现「按不中」的情况。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5.2 按键到协议的映射&lt;a href=&quot;#52-按键到协议的映射&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;每个按键最终都会转成一条 HTTP 指令发往 TV 端：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;type&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;key&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;action&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;down_up&quot;&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;keycode&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;82&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;常用键值映射：&lt;/p&gt;

&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;手机按键&lt;/th&gt;&lt;th&gt;keycode&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;4&lt;/td&gt;&lt;td&gt;KEYCODE_BACK&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;主页&lt;/td&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;KEYCODE_HOME&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;菜单&lt;/td&gt;&lt;td&gt;82&lt;/td&gt;&lt;td&gt;KEYCODE_MENU&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;音量加&lt;/td&gt;&lt;td&gt;24&lt;/td&gt;&lt;td&gt;KEYCODE_VOLUME_UP&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;音量减&lt;/td&gt;&lt;td&gt;25&lt;/td&gt;&lt;td&gt;KEYCODE_VOLUME_DOWN&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;电源&lt;/td&gt;&lt;td&gt;26&lt;/td&gt;&lt;td&gt;KEYCODE_POWER&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;6. 触控板：从绝对坐标到相对位移&lt;a href=&quot;#6-触控板从绝对坐标到相对位移&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;触控板是设计迭代中最典型的一次「推倒重来」。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;6.1 第一版：绝对坐标（失败）&lt;a href=&quot;#61-第一版绝对坐标失败&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;最初的设计是把手指位置直接映射到 TV 屏幕坐标：手指按在触控板左上角，TV 端光标就出现在屏幕左上角。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;手指按下 x,y&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;归一化 0..1000&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;HTTP POST /api/cursor&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;TV 端光标跳到绝对位置&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;手指按下 x,y&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;归一化 0..1000&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;HTTP POST /api/cursor&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;TV 端光标跳到绝对位置&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;真机测试发现致命问题：&lt;strong&gt;触控板面积只有巴掌大，映射到 55 寸电视上，精度完全不够&lt;/strong&gt;——想点一个设置按钮，手指 1mm 的抖动在电视上就是几十像素的偏移，根本点不中。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6.2 第二版：相对位移 + 虚拟鼠标（成功）&lt;a href=&quot;#62-第二版相对位移--虚拟鼠标成功&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;改为笔记本电脑触控板的心智模型：&lt;strong&gt;TV 端自己维护一个光标位置，手机只上报位移量&lt;/strong&gt;。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;手指滑动 delta&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;POST /api/mouse dx,dy&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;TV 端光标位置 + delta&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;滑一次 光标动一点 位置保持&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;手指滑动 delta&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;POST /api/mouse dx,dy&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;TV 端光标位置 + delta&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;滑一次 光标动一点 位置保持&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&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;精度&lt;/td&gt;&lt;td&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;/td&gt;&lt;td&gt;笔记本触控板&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;抬手后光标&lt;/td&gt;&lt;td&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;/td&gt;&lt;td&gt;中（TV 端维护光标）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;协议设计：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;{&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;dx&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;120&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;dy&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;-45&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;  &lt;/span&gt;&lt;span&gt;&quot;show&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;true&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;dx&lt;/code&gt; / &lt;code&gt;dy&lt;/code&gt;：0..1000 归一化相对位移，TV 端按屏幕分辨率缩放为像素&lt;/li&gt;
&lt;li&gt;&lt;code&gt;show&lt;/code&gt;：&lt;code&gt;true&lt;/code&gt; 显示光标，&lt;code&gt;false&lt;/code&gt; 隐藏，缺省保持当前状态&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;抬手后光标保持原位这一点尤为关键——用户可以分多次滑动，把光标「挪」到目标上再点按确认，这正是触控板体验的精髓。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;7. 浮动光标：倾斜手机即可移动光标&lt;a href=&quot;#7-浮动光标倾斜手机即可移动光标&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;触控板解决了「精准」，但还有更极致的输入方式：&lt;strong&gt;手机拿起来，往哪边倾，光标往哪边走&lt;/strong&gt;。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;7.1 传感器选型&lt;a href=&quot;#71-传感器选型&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;手机竖直持握时，加速度计三个轴的物理含义：&lt;/p&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;X 轴 (ax)&lt;/td&gt;&lt;td&gt;左右倾斜量&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Y 轴 (ay)&lt;/td&gt;&lt;td&gt;重力（约 9.8 m/s²）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Z 轴 (az)&lt;/td&gt;&lt;td&gt;前后倾斜量&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;光标速度映射：&lt;/p&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;dx=(ax−ax0)⋅k,dy=(az−az0)⋅kdx = (a_x - a_{x0}) \cdot k, \quad dy = (a_z - a_{z0}) \cdot k&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;x&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;⋅&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;span&gt;,&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;d&lt;/span&gt;&lt;span&gt;y&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;(&lt;/span&gt;&lt;span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;z&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;−&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;⋅&lt;/span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;p&gt;其中 &lt;span&gt;&lt;span&gt;ax0a_{x0}&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;x&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;、&lt;span&gt;&lt;span&gt;az0a_{z0}&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;a&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;z&lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span&gt;​&lt;/span&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 是校准基准（开始控制时记录），&lt;span&gt;&lt;span&gt;kk&lt;/span&gt;&lt;span&gt;&lt;span&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;k&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt; 是灵敏度系数。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;提示&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;不用陀螺仪（TYPE_ROTATION_VECTOR）而用加速度计（TYPE_ACCELEROMETER），是因为倾斜角度比角速度更直观：手机保持某个倾斜角，光标就持续匀速移动，松回水平则停止，符合「指哪打哪」的直觉。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;7.2 防抖设计&lt;a href=&quot;#72-防抖设计&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;手持必然有抖动，两个参数直接决定手感：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;死区&lt;/strong&gt;：倾斜量小于 0.6 m/s² 时视为静止，过滤手部微抖&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;灵敏度系数&lt;/strong&gt;：倾斜 1 m/s² 对应光标移动速度，当前取值 4 倍基准灵敏度&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;完整控制流程：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;是&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;否&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;进入浮动光标页&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;记录校准基准 ax0, az0&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;显示 TV 端光标&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;倾斜量超过死区?&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;按倾斜方向持续发送位移&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;停止移动 光标保持&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;点按屏幕 = 点击确认&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;双击或按钮 = 长按&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;是&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;否&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;进入浮动光标页&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;记录校准基准 ax0, az0&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;显示 TV 端光标&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;倾斜量超过死区?&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;按倾斜方向持续发送位移&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;停止移动 光标保持&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;点按屏幕 = 点击确认&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;双击或按钮 = 长按&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;7.3 TV 端光标渲染&lt;a href=&quot;#73-tv-端光标渲染&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;TV 端用 &lt;code&gt;TYPE_ACCESSIBILITY_OVERLAY&lt;/code&gt; 窗口绘制光标：白色圆形主体 + 深色描边 + 中心蓝点 + 柔和光晕，直径 40px，在深浅背景上都能看清。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;注意&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;code&gt;TYPE_ACCESSIBILITY_OVERLAY&lt;/code&gt; 窗口必须用 AccessibilityService 的上下文创建，用 Application Context 创建的窗口不会显示，且不会抛异常——这是最难排查的一类「静默失败」。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;8. 设计规范落地清单&lt;a href=&quot;#8-设计规范落地清单&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;为保证四个页面视觉一致，落地时逐条对照检查：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt; 全局背景 &lt;code&gt;#F2F2F7&lt;/code&gt;，卡片白色、圆角 14dp&lt;/li&gt;
&lt;li&gt; 图标全部线性风格，笔画粗细统一&lt;/li&gt;
&lt;li&gt; 底部 Tab Bar 毛玻璃，四个入口图标 + 文字&lt;/li&gt;
&lt;li&gt; 无 FAB、无 ripple、无 hamburger、无投影&lt;/li&gt;
&lt;li&gt; 按键热区 ≥ 48dp&lt;/li&gt;
&lt;li&gt; 电源等危险操作与常规操作区隔开&lt;/li&gt;
&lt;li&gt; 页面标题与状态栏留出安全距离，不与系统状态栏重叠&lt;/li&gt;
&lt;li&gt; 顶栏显示连接状态，任何页面都能确认连接是否正常&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;9. 踩坑与经验&lt;a href=&quot;#9-踩坑与经验&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;警告&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;以下是真机调试中付出过代价的经验，做同类 App 时可以直接绕开。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;光标窗口「静默失败」&lt;/strong&gt;：Application Context 创建 overlay 窗口不报错但不显示，必须用 Service Context；&lt;code&gt;WindowManager.addView&lt;/code&gt; 还必须在主线程执行，HTTP 工作线程直接调用会偶发崩溃。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;重装 APK 后无障碍服务被重置&lt;/strong&gt;：TV 端重装后服务进入 Crashed 状态，需要完整重置序列——移除服务 → 禁用 accessibility → force-stop → 重新添加 → 启用。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;菜单键无焦点可回退&lt;/strong&gt;：部分界面没有焦点节点，菜单指令应回退为在屏幕中心派发长按手势，否则用户会觉得「菜单键坏了」。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;状态栏与标题重叠&lt;/strong&gt;：未处理 insets 时页面顶部内容会钻到系统状态栏底下，需统一处理状态栏安全距离。&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;触控板精度&lt;/strong&gt;：任何把「手指位置」直接映射到「大屏坐标」的方案都会死于精度不足，相对位移是唯一出路。&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;10. 总结&lt;a href=&quot;#10-总结&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;设计一款遥控器 App，表面上是画界面，本质上是回答三个问题：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;用户在什么姿势下用它&lt;/strong&gt;——决定了按键布局与热区大小&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;电视端能做到什么&lt;/strong&gt;——决定了交互方案的技术边界（虚拟光标 vs 系统鼠标）&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;什么样的光标移动符合直觉&lt;/strong&gt;——决定了相对位移、死区、倾斜控制这些细节&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;iOS 16 风格解决的是「看起来对」，相对位移触控板和倾斜光标解决的是「用起来对」。工具类 App 的设计没有炫技空间，把每一次点击、每一次滑动做到符合直觉，就是最好的设计。&lt;/p&gt;&lt;/section&gt;</content:encoded></item><item><title>TCL/雷鸟电视固件冻结 Google 相关进程的分析记录</title><link>https://blog.zlion.top/posts/tcl-freeze-google/</link><guid isPermaLink="true">https://blog.zlion.top/posts/tcl-freeze-google/</guid><description>记录 TCL Android TV 对 Google 相关进程的冻结行为、freeze 配置的写入突破，以及 Google 三件套闪退根因的完整定位：权限问题，而非冻结。</description><pubDate>Sat, 22 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;本文档记录 TCL 电视冻结 Google 相关进程的发现、确认结果、失败尝试，以及 2026-08-29 的续篇：freeze 配置写入打通与三件套闪退根因定位。&lt;br /&gt;
&lt;strong&gt;适用设备：&lt;/strong&gt; TCL &lt;code&gt;tcl_mt5879_cn&lt;/code&gt;
&lt;strong&gt;适用系统：&lt;/strong&gt; Android 11 / API 30，固件 V729
&lt;strong&gt;连接方式：&lt;/strong&gt; ADB over Wi-Fi&lt;/p&gt;&lt;/blockquote&gt;
&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;结论（2026-08-29 更新）&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Google 三件套 APK 可以被系统识别并安装，但无法正常运行。&lt;strong&gt;闪退根因已定位：ADB 安装的 APK 位于 &lt;code&gt;/data&lt;/code&gt;，拿不到 &lt;code&gt;signature|privileged&lt;/code&gt; 级权限，进程在初始化阶段必然崩溃，与冻结机制无关&lt;/strong&gt;（A/B 实测确认）。此前卡住的 &lt;code&gt;freeze&lt;/code&gt; 配置写入也已打通，但它解决不了三件套的闪退。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;1. 发现&lt;a href=&quot;#1-发现&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;通过 ADB 检查 TCL 电视运行状态、系统组件和固件内容时，发现 TCL 系统存在针对 Google 进程的冻结逻辑。&lt;/p&gt;&lt;p&gt;相关逻辑位于：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;system_ext/apex/com.tcl.tcore.apex&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;其中可以看到 &lt;code&gt;FreezeManager&lt;/code&gt;、&lt;code&gt;TGuard&lt;/code&gt;、冻结白名单以及 Google Play 相关字符串。TCL 系统还提供了配置入口：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;content://com.tcl.providers.config/freeze&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;2. 确认结果&lt;a href=&quot;#2-确认结果&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;&lt;code&gt;freeze&lt;/code&gt; 配置是一个键值集合，完整结构如下：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;[&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;enable&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;value&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;true&quot;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;debug&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;value&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;false&quot;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;tcl_fastHibernate&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;value&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;true&quot;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;tcl_fastHibernateTimeout&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;value&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;1500&quot;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;tcl_fastHibernateDebug&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;value&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;false&quot;&lt;/span&gt;&lt;span&gt;},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;freezeProcessList&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;value&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;...&quot;&lt;/span&gt;&lt;span&gt;]},&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;{&lt;/span&gt;&lt;span&gt;&quot;name&quot;&lt;/span&gt;&lt;span&gt;: &lt;/span&gt;&lt;span&gt;&quot;fastFreezeProcessList&quot;&lt;/span&gt;&lt;span&gt;, &lt;/span&gt;&lt;span&gt;&quot;value&quot;&lt;/span&gt;&lt;span&gt;: [&lt;/span&gt;&lt;span&gt;&quot;...&quot;&lt;/span&gt;&lt;span&gt;]}&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;freezeProcessList&lt;/code&gt; 中确认包含以下 Google 相关进程：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;com.google.android.gms&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;com.android.vending:download_service&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;com.android.vending:instant_app_installer&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;这些进程分别涉及 Google Play services、Play Store 下载服务和即时应用安装服务。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;修正（2026-08-29）&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;最初把 &lt;code&gt;freezeProcessList&lt;/code&gt; 理解为「待冻结名单」。但名单里同时存在 &lt;code&gt;com.tcl.settings&lt;/code&gt;、&lt;code&gt;com.android.bluetooth&lt;/code&gt;、&lt;code&gt;com.google.android.tvlauncher&lt;/code&gt; 等 TCL 自家核心应用——冻结它们电视自己就无法工作。它更可能是&lt;strong&gt;免冻结白名单&lt;/strong&gt;，即名单内进程受保护。该语义尚待反编译确认，但对本文结论无影响（见第 4 节，闪退与冻结无关）。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;同时确认：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;冻结实现位于 &lt;code&gt;tcore&lt;/code&gt; apex 内的 &lt;code&gt;tcl-service.jar&lt;/code&gt;，核心类为 &lt;code&gt;com.android.server.am.appfreeze.FreezeManager&lt;/code&gt;、&lt;code&gt;TclFreezeConfigUpdater&lt;/code&gt;，系统服务名为 &lt;code&gt;tguard&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;com.tcl.guard&lt;/code&gt; 是 TCL 的守护组件，会参与进程管理。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;com.tcl.providers.config&lt;/code&gt; 是 TCL 配置提供者，不应当作为普通应用随意停用。&lt;/li&gt;
&lt;li&gt;Google 三件套包可以被 &lt;code&gt;pm path&lt;/code&gt; 识别，说明 APK 安装本身成功。&lt;/li&gt;
&lt;li&gt;安装成功不代表获得系统签名、特权权限或 Google 认证状态——&lt;strong&gt;这句话正是后来定位到的闪退根因&lt;/strong&gt;。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;3. 已进行的尝试&lt;a href=&quot;#3-已进行的尝试&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;3.1 临时停用 &lt;code&gt;com.tcl.guard&lt;/code&gt;&lt;a href=&quot;#31-临时停用-comtclguard&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb -s 192.168.5.2:5555 shell pm disable-user --user &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; com.tcl.guard&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;结果：&lt;code&gt;com.tcl.guard&lt;/code&gt; 可以进入 &lt;code&gt;disabled-user&lt;/code&gt; 状态，但 Google 三件套仍不能正常运行。之后已恢复：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;adb -s 192.168.5.2:5555 shell pm enable --user &lt;/span&gt;&lt;span&gt;0&lt;/span&gt;&lt;span&gt; com.tcl.guard&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.2 安装 Google 三件套&lt;a href=&quot;#32-安装-google-三件套&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;针对设备的 Android 11、32 位 &lt;code&gt;armeabi-v7a&lt;/code&gt; 和 Android TV 环境，尝试安装：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;com.google.android.gsf&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;com.google.android.gms 26.24.34&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;com.android.vending 52.0.20&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;结果：三个 APK 均可被系统识别，但 Play Store 无法正常进入，Google 相关进程也不能稳定运行。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.3 修改 &lt;code&gt;freeze&lt;/code&gt; 配置（2026-08-29 已打通）&lt;a href=&quot;#33-修改-freeze-配置2026-08-29-已打通&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;最初普通 ADB shell 下的 JSON 写入没有成功，原始配置保持不变。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;突破&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;失败原因是 &lt;code&gt;content&lt;/code&gt; 命令的 &lt;code&gt;--bind&lt;/code&gt; 参数&lt;strong&gt;按冒号分段解析&lt;/strong&gt;，JSON 里的每个 &lt;code&gt;:&lt;/code&gt; 都必须转义成 &lt;code&gt;\:&lt;/code&gt;（Git Bash 中写作 &lt;code&gt;\\:&lt;/code&gt;）。转义后写入成功：&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;J&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/data/local/tmp/freeze.json&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;E&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$J&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; | &lt;/span&gt;&lt;span&gt;sed&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;s/:/\\\\:/g&apos;&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;content&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;update&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--uri&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;content://com.tcl.providers.config/freeze&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--bind&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;config_content:s:&lt;/span&gt;&lt;span&gt;$E&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--where&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;project_id=&apos;freeze&apos;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;用同样的方法可以查询和回写配置（原始配置已备份）。同一技巧也解决了另一台 TCL 电视的 ADB 安装拦截问题，见《&lt;a href=&quot;/posts/tcl-tv-adb-install-unlock/&quot;&gt;TCL/雷鸟电视 ADB 安装拦截排查与永久放行&lt;/a&gt;》。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.4 查询或调用 TCL 特殊接口&lt;a href=&quot;#34-查询或调用-tcl-特殊接口&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;尝试使用 &lt;code&gt;cmd feature&lt;/code&gt; 等接口进一步查询或修改 TCL 配置。&lt;/p&gt;&lt;p&gt;结果：相关功能需要更高权限或 debug 模式，普通 ADB shell 无法完成写入。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.5 修改系统组件或刷写固件&lt;a href=&quot;#35-修改系统组件或刷写固件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;未执行以下高风险操作：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;修改 &lt;code&gt;com.tcl.tcore.apex&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;修改 &lt;code&gt;FreezeManager&lt;/code&gt; 或 &lt;code&gt;freezeProcessList&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;修改 &lt;code&gt;boot&lt;/code&gt;、&lt;code&gt;system&lt;/code&gt;、&lt;code&gt;vendor&lt;/code&gt;、&lt;code&gt;product&lt;/code&gt;、&lt;code&gt;system_ext&lt;/code&gt; 分区。&lt;/li&gt;
&lt;li&gt;刷入其他版本 TCL 固件。&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;原因：这些操作涉及系统签名、分区校验和变砖风险，且没有证据表明仅修改其中一处就能恢复 Google 三件套运行。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;4. 闪退复现与根因定位（2026-08-29 续篇）&lt;a href=&quot;#4-闪退复现与根因定位2026-08-29-续篇&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;4.1 实验环境&lt;a href=&quot;#41-实验环境&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在另一台同固件的 TCL 电视（&lt;code&gt;tcl_mt5879_cn&lt;/code&gt;，&lt;code&gt;192.168.5.6:5555&lt;/code&gt;）上完成：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;使用 MindTheGapps &lt;code&gt;11.0.0-arm-ATV&lt;/code&gt;（匹配 Android 11 + armeabi-v7a + Android TV）。&lt;/li&gt;
&lt;li&gt;通过 ADB 安装 &lt;code&gt;GoogleServicesFramework.apk&lt;/code&gt; 与 &lt;code&gt;PrebuiltGmsCorePano.apk&lt;/code&gt;（即 &lt;code&gt;com.google.android.gms&lt;/code&gt;），均安装成功。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.2 触发方式&lt;a href=&quot;#42-触发方式&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;国内固件&lt;strong&gt;开机后没有任何东西会拉起 GMS&lt;/strong&gt;：没有 Play Store 和 setup wizard 作为触发源，且 ADB 安装的包处于 stopped 状态，收不到开机广播。需要主动拉起 GMS 的可用 Activity（如 &lt;code&gt;com.google.android.gms/.ads.settings.AdsSettingsActivity&lt;/code&gt;）。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.3 现象：崩溃-重启死循环&lt;a href=&quot;#43-现象崩溃-重启死循环&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;进程以&lt;strong&gt;前台（TOP）状态&lt;/strong&gt;被反复拉起、随即死亡，约 300ms 一次：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;崩溃循环&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;760&quot; src=&quot;/_astro/gms-crash-loop.C9bVZigJ_ZmnKPX.webp&quot; /&gt;&lt;figcaption&gt;崩溃循环&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;注意这不是冻结——冻结只会暂停进程，不会杀进程；这里的进程死因是自身初始化抛异常。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.4 根因：signature|privileged 权限缺失&lt;a href=&quot;#44-根因signatureprivileged-权限缺失&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;从 &lt;code&gt;dumpsys dropbox --print data_app_crash&lt;/code&gt; 拿到完整堆栈，两个包各死于一个系统权限：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;闪退根因&quot; loading=&quot;lazy&quot; width=&quot;1600&quot; height=&quot;980&quot; src=&quot;/_astro/gms-crash-stack.BQXznAc0_2v99iF.webp&quot; /&gt;&lt;figcaption&gt;闪退根因&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;GSF 的崩溃堆栈（&lt;code&gt;GoogleSettingsProvider&lt;/code&gt; 初始化）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;java.lang.RuntimeException: Unable to get provider&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;com.google.android.gsf.settings.GoogleSettingsProvider:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;java.lang.SecurityException: You need MANAGE_USERS permission to: get the profile parent&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;at com.google.android.gsf.settings.GoogleSettingsProvider.onCreate(GoogleSettingsProvider.java:158)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;        &lt;/span&gt;&lt;/span&gt;&lt;span&gt;at UserManager.getProfileParent(UserManager.java:3564)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;GMS 的崩溃堆栈（Application 初始化）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;java.lang.RuntimeException: Unable to create application co.g.App:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;java.lang.SecurityException:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;addOnPermissionsChangeListener: Neither user 10094 nor current process&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;has android.permission.OBSERVE_GRANT_REVOKE_PERMISSIONS&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;MANAGE_USERS&lt;/code&gt; 与 &lt;code&gt;OBSERVE_GRANT_REVOKE_PERMISSIONS&lt;/code&gt; 都是 &lt;code&gt;signature|privileged&lt;/code&gt; 级权限，只能授予 &lt;code&gt;/system/priv-app&lt;/code&gt; 内、且在 privileged-permissions 白名单中的应用。ADB 安装的 APK 位于 &lt;code&gt;/data&lt;/code&gt;，&lt;strong&gt;永远拿不到这两个权限&lt;/strong&gt;，于是 provider / Application 初始化必然抛 &lt;code&gt;SecurityException&lt;/code&gt;，系统反复拉起 → 无限闪退。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;/system/priv-app 应用&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;ADB 安装的 /data 应用&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;拉起 GMS/GSF 界面&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;进程启动&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;初始化 ContentProvider / Application&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;持有 signature 级权限?&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;正常初始化&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;SecurityException&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;进程死亡&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;系统重新拉起&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;/system/priv-app 应用&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;ADB 安装的 /data 应用&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;拉起 GMS/GSF 界面&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;进程启动&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;初始化 ContentProvider / Application&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;持有 signature 级权限?&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;正常初始化&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;SecurityException&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;进程死亡&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;系统重新拉起&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.5 A/B 验证：与冻结无关&lt;a href=&quot;#45-ab-验证与冻结无关&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;控制变量实验——同一台电视、同一组 APK、只切换 &lt;code&gt;freeze&lt;/code&gt; 配置：&lt;/p&gt;

&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;freeze enable&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;code&gt;true&lt;/code&gt;（原始值）&lt;/td&gt;&lt;td&gt;拉起即闪退，300ms 崩溃循环&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;false&lt;/code&gt;（冻结关闭）&lt;/td&gt;&lt;td&gt;&lt;strong&gt;完全相同的闪退&lt;/strong&gt;，堆栈一致&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;结论：三件套的闪退与冻结机制无关，是确定性的权限缺失，ADB 层面无解。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;5. 对冻结机制的再认识&lt;a href=&quot;#5-对冻结机制的再认识&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;freeze&lt;/code&gt; 配置可被 shell 读写（冒号转义突破后），配置修改在重启后依然生效。&lt;/li&gt;
&lt;li&gt;开机时 &lt;code&gt;FreezeManager&lt;/code&gt; 确实按配置工作（日志可见 &lt;code&gt;doUnFreeze&lt;/code&gt;、&lt;code&gt;FreezeNameList: policy : freezeProcessList ... inSpecifyList : true/false&lt;/code&gt;）。&lt;/li&gt;
&lt;li&gt;但 &lt;code&gt;freezeProcessList&lt;/code&gt; 的语义存疑：名单内含大量 TCL 核心应用，更接近免冻结白名单；且三件套的死亡方式（前台状态主动死亡）与冻结（暂停不杀）行为特征不符。&lt;/li&gt;
&lt;li&gt;国内固件开机后不会自发拉起 GMS，「开机闪退」在这台电视上不会自发发生——只有主动打开依赖 Google 服务的界面才会触发。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;6. 最终结论&lt;a href=&quot;#6-最终结论&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;TCL 固件确实存在进程冻结机制（&lt;code&gt;FreezeManager&lt;/code&gt; / &lt;code&gt;tguard&lt;/code&gt;），配置可读写，但其语义更接近白名单，且&lt;strong&gt;与三件套闪退无关&lt;/strong&gt;（A/B 实测确认）。&lt;/li&gt;
&lt;li&gt;三件套闪退的根因是 &lt;code&gt;signature|privileged&lt;/code&gt; 级权限缺失（GSF 缺 &lt;code&gt;MANAGE_USERS&lt;/code&gt;，GMS 缺 &lt;code&gt;OBSERVE_GRANT_REVOKE_PERMISSIONS&lt;/code&gt;），ADB 安装的 &lt;code&gt;/data&lt;/code&gt; 应用拿不到这些权限。&lt;/li&gt;
&lt;li&gt;在不 root、不修改系统分区的前提下，三件套无法正常工作——修复必须将 GMS/GSF 放入 &lt;code&gt;/system/priv-app&lt;/code&gt; 并加入特权权限白名单。&lt;/li&gt;
&lt;li&gt;ADB 能做到的极限：安装成功（需先解除 TCL 的安装拦截，见《&lt;a href=&quot;/posts/tcl-tv-adb-install-unlock/&quot;&gt;TCL/雷鸟电视 ADB 安装拦截排查与永久放行&lt;/a&gt;》）、配置接口自由读写；无法赋予系统特权。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;com.tcl.guard&lt;/code&gt; 只是守护组件之一，停用它不能改变任何结果。&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;blockquote&gt;&lt;p&gt;&lt;strong&gt;文档版本：&lt;/strong&gt; 2026-08-29
&lt;strong&gt;记录状态：&lt;/strong&gt; freeze 配置写入已打通；闪退根因已定位（权限缺失），ADB 层面无解&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;</content:encoded></item><item><title>E2633转正官方版分析（Telnet篇）</title><link>https://blog.zlion.top/posts/e2631-research-telnet/</link><guid isPermaLink="true">https://blog.zlion.top/posts/e2631-research-telnet/</guid><description>E2633刷入官方公版后的config.bin解密、本机信息优化、本地Web上传固件和官方系统升级研究部分。</description><pubDate>Tue, 04 Aug 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;免责声明与使用约定&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;禁止以任何形式出售、打包收费、付费分发、引流获利，或将本教程及随附工具用于其他商业获利行为。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;对教程、文档或工具进行二次修改、转载和再分发时，必须保留原作者 &lt;code&gt;zlion&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;固件刷写、Telnet和 MTD 操作均可能造成数据丢失、设备变砖或其他不可预期后果。&lt;strong&gt;操作者应对自己的设备和全部操作结果负责并自行承担风险。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;如本文内容存在侵权、错误引用或其他权益问题，请联系作者核实；确认后将及时删除或修正相关内容。&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;1. Config.bin的加解密与Telnet开启&lt;a href=&quot;#1-configbin的加解密与telnet开启&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1.1 Config.bin的加解密&lt;a href=&quot;#11-configbin的加解密&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;&lt;code&gt;config.bin&lt;/code&gt; 不是明文 XML，而是 ZTE 的 Type-4 外层容器。E2631 中使用的是 AES-256-CBC。
中兴巡天及其套娃机的值有多组，这里仅展示一组：&lt;/p&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;code&gt;keySeed&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;E2631Key13515211&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;ivSeed&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;E2631Iv13515211&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;key&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;SHA256(keySeed)&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;iv&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;SHA256(ivSeed)&lt;/code&gt; 取前 16 字节&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;填充&lt;/td&gt;&lt;td&gt;关闭，尾部补零到 AES 块边界&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;解包流程如下：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;config.bin Type-4 外层容器&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;AES-256-CBC 解密&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;Type-0 内层容器&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;zlib 解压&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;最终 XML&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;config.bin Type-4 外层容器&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;AES-256-CBC 解密&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;Type-0 内层容器&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;zlib 解压&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;最终 XML&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;回写流程如下：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;修改后的 XML&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;zlib 压缩&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;封装 Type-0 内层容器&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;AES-256-CBC 加密&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;写回 config.bin&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;修改后的 XML&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;zlib 压缩&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;封装 Type-0 内层容器&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;AES-256-CBC 加密&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;p&gt;写回 config.bin&lt;/p&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;1.2 修改Config.bin开启Telnet&lt;a href=&quot;#12-修改configbin开启telnet&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;这里提供一个一键开启Telnet脚本&lt;a href=&quot;https://wwbnc.lanzoub.com/iC10a40v5r6j&quot; target=&quot;_blank&quot;&gt;config-telnet-enable.zip&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;PortControl&lt;/code&gt; 中 TELNET 行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;DM&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;ServName&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;TELNET&quot;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;DM&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;PortEnable&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;1&quot;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;TelnetCfg&lt;/code&gt; 中启用 LAN、关闭 WAN：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Tbl&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;TelnetCfg&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;RowCount&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;1&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;Row&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;No&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;0&quot;&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;DM&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;TS_Enable&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;1&quot;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;DM&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;Wan_Enable&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;0&quot;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;DM&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;Lan_Enable&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;1&quot;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;DM&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;TS_Port&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;23&quot;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;DM&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;TS_UName&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;admin&quot;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;&lt;/span&gt;&lt;span&gt;DM&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;name&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;TS_UPwd&quot;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;val&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;admin&quot;&lt;/span&gt;&lt;span&gt;/&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;Row&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&amp;lt;/&lt;/span&gt;&lt;span&gt;Tbl&lt;/span&gt;&lt;span&gt;&amp;gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;注意&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;本工具由 zlion 原创，首发于 zlion.top
禁止倒卖、打包收费或用于任何商业盈利行为，转载须保留完整出处及作者署名。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;使用说明&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;
&lt;li&gt;将 config-telnet-enable.bat、zte_config_telnet_enable.js 和 config.bin 放在同一个目录。&lt;/li&gt;
&lt;li&gt;双击 config-telnet-enable.bat。&lt;/li&gt;
&lt;li&gt;成功后，同目录会生成 config-telnet-enable.bin。&lt;/li&gt;
&lt;li&gt;Telnet 端口为 23，账号和密码均为 admin。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;运行环境：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;完整工具包已经附带 node.exe，无需安装 Node.js 或 Python。&lt;/li&gt;
&lt;li&gt;请勿单独移动 BAT；config-telnet-enable.bat、zte_config_telnet_enable.js 和 node.exe 必须放在一起。&lt;/li&gt;
&lt;li&gt;不支持的配置会显示“config文件暂不适配”，且不会保留输出文件&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;2. 本机信息优化&lt;a href=&quot;#2-本机信息优化&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;本节提醒&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;
&lt;li&gt;适用于保留自己设备的 Tag、Wi-Fi 等身份和无线数据分区&lt;/li&gt;
&lt;li&gt;适用于刷了三方固件无法绑定APP（未验证APP端是否只检测设备型号，仅猜测）&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;Tag 分区与 Wi-Fi 分区性质不同，处理方式也不同：&lt;/p&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;Tag（mtd2）&lt;/td&gt;&lt;td&gt;裸结构化记录 + CRC32&lt;/td&gt;&lt;td&gt;&lt;code&gt;setmac&lt;/code&gt; 逐参数改，或 &lt;code&gt;mtd_write_tag&lt;/code&gt; 整区写入（2.2）&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Wi-Fi（mtd3）&lt;/td&gt;&lt;td&gt;JFFS2 文件系统，内含 &lt;code&gt;caldata&lt;/code&gt;&lt;/td&gt;&lt;td&gt;用备份文件在挂载点写回（2.3）&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;section&gt;&lt;h3&gt;2.1 Tag 、Wifi 分区读取&lt;a href=&quot;#21-tag-wifi-分区读取&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在路由器 Telnet 终端执行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/proc/mtd&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;可以看到：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mtd2: 00100000 00020000 &quot;tag&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mtd3: 00100000 00020000 &quot;wifi&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;两者大小均为 &lt;code&gt;0x100000&lt;/code&gt;，即 &lt;code&gt;1048576&lt;/code&gt; 字节。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Tag 分区&lt;/strong&gt;是裸结构化数据，直接读设备节点：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/dev/mtd2&lt;/span&gt;&lt;span&gt; &amp;gt; &lt;/span&gt;&lt;span&gt;/tmp/tag-backup.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Wi-Fi 分区&lt;/strong&gt;（mtd3）是 JFFS2 文件系统，开机已经挂载在 &lt;code&gt;/wlan&lt;/code&gt;，里面只有 &lt;code&gt;caldata&lt;/code&gt; 一个文件（196,608 字节）。备份时&lt;strong&gt;直接读这个文件&lt;/strong&gt; —— 恢复时原样写回即可，不需要任何解包步骤：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/wlan/caldata&lt;/span&gt;&lt;span&gt; &amp;gt; &lt;/span&gt;&lt;span&gt;/tmp/caldata-backup.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;若 &lt;code&gt;/wlan&lt;/code&gt; 没有挂载&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;先执行 &lt;code&gt;mount -t jffs2 /dev/mtdblock3 /wlan&lt;/code&gt;，再按上面的命令备份。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;确认电脑的 TFTP 服务已启动，根目录允许写入。&lt;/p&gt;&lt;p&gt;上传 Tag 备份：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tftp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-l&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/tag-backup.bin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-r&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tag-backup.bin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.5.7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;上传 Wi-Fi 校准备份：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tftp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-l&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/caldata-backup.bin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-r&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;caldata-backup.bin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.5.7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;192.168.5.7&lt;/code&gt;请替换为电脑当前的局域网 IP。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2 修改 Tag：setmac 命令与 mtd_write_tag 工具&lt;a href=&quot;#22-修改-tagsetmac-命令与-mtd_write_tag-工具&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Tag 分区（mtd2）是裸结构化数据加 CRC32 校验，Tag 中同时存在主 MAC、第二 MAC、MAC 前缀、D-SN、S/N、型号和 Wi-Fi 信息。按场景有两种修改方式：&lt;/p&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;方法一：&lt;code&gt;setmac&lt;/code&gt; 命令（推荐）&lt;/td&gt;&lt;td&gt;固件自带命令逐参数修改，自动完成 NAND 擦除并重算 CRC32&lt;/td&gt;&lt;td&gt;改型号、MAC 等单个字段&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;方法二：&lt;code&gt;mtd_write_tag&lt;/code&gt; 工具&lt;/td&gt;&lt;td&gt;自编译 MTD 写入工具，把改好的 Tag 整区镜像一次擦写写入&lt;/td&gt;&lt;td&gt;整区替换，或 &lt;code&gt;setmac&lt;/code&gt; 不可用的设备&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;section&gt;&lt;h4&gt;方法一：setmac 命令（推荐）&lt;a href=&quot;#方法一setmac-命令推荐&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;设备固件自带 &lt;code&gt;/bin/setmac&lt;/code&gt;，它通过 &lt;code&gt;libtagparam.so&lt;/code&gt; + &lt;code&gt;libmtduserapi.so&lt;/code&gt; 直接读写 Tag 分区，&lt;strong&gt;内部会自动完成 NAND 擦除并重算 CRC32&lt;/strong&gt; —— 不需要离线改文件，也不需要自编译任何工具。&lt;/p&gt;&lt;p&gt;用法：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;setmac&lt;/span&gt;&lt;span&gt;                        &lt;/span&gt;&lt;span&gt;# 无参数时打印帮助&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;setmac&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;show2&lt;/span&gt;&lt;span&gt;                  &lt;/span&gt;&lt;span&gt;# 列出全部具名参数&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;setmac&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;action&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;type&amp;gt;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&amp;lt;para_id&amp;gt;&lt;/span&gt;&lt;span&gt; [&amp;lt;hex &lt;/span&gt;&lt;span&gt;string&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;para_val&amp;gt;]&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;action type&lt;/code&gt; 含义：&lt;/p&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;code&gt;1&lt;/code&gt;&lt;/td&gt;&lt;td&gt;set，写入参数&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;2&lt;/code&gt;&lt;/td&gt;&lt;td&gt;get，读取参数&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;3&lt;/code&gt;&lt;/td&gt;&lt;td&gt;del，删除参数&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;4&lt;/code&gt;&lt;/td&gt;&lt;td&gt;format，&lt;strong&gt;格式化整个 Tag 区（危险，勿用）&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;查看当前参数：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;setmac&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;show2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;输出示例：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;===============Current Status of TagParam===============&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Mac[ID: 256] is set to AA BB CC DD EE FF&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;OUI[ID: 768] is set to AABBCC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;DeviceSerialNumber[ID: 512] is set to XXXXXXXXXXXXXXXXX&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;WirelessNetName[ID: 1024] is set to Example-SSID&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;WlanPass[ID: 1296] is set to ExamplePass&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;==============&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;常用参数 ID：&lt;/p&gt;

&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;参数&lt;/th&gt;&lt;th&gt;ID&lt;/th&gt;&lt;th&gt;参数&lt;/th&gt;&lt;th&gt;ID&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;Mac&lt;/code&gt;&lt;/td&gt;&lt;td&gt;256&lt;/td&gt;&lt;td&gt;&lt;code&gt;WirelessNetName&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1024&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;第二 MAC&lt;/td&gt;&lt;td&gt;257&lt;/td&gt;&lt;td&gt;&lt;code&gt;WirelessNetName5G&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1028&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;DeviceSerialNumber&lt;/code&gt;&lt;/td&gt;&lt;td&gt;512&lt;/td&gt;&lt;td&gt;&lt;code&gt;WlanPass&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1296&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;OUI&lt;/code&gt;&lt;/td&gt;&lt;td&gt;768&lt;/td&gt;&lt;td&gt;&lt;code&gt;WlanPass5G&lt;/code&gt;&lt;/td&gt;&lt;td&gt;1328&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;运营商代码&lt;/td&gt;&lt;td&gt;1793&lt;/td&gt;&lt;td&gt;&lt;strong&gt;型号&lt;/strong&gt;&lt;/td&gt;&lt;td&gt;&lt;strong&gt;33024&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;型号不在 show2 列表里&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;&lt;code&gt;setmac show2&lt;/code&gt; 只列出它”具名”的那批参数，型号（ID &lt;code&gt;33024&lt;/code&gt;）不在其中，但可以用 ID 直接读写。
所有 &lt;code&gt;get&lt;/code&gt; 的返回值都是&lt;strong&gt;十六进制&lt;/strong&gt;，需要自己解成 ASCII。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;section&gt;&lt;h5&gt;改型号（E2633 转 E2631）&lt;a href=&quot;#改型号e2633-转-e2631&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h5&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 1. 读当前型号&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;setmac&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;33024&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#   2633 设备预期返回：5a58484e204532363333   ( &quot;ZXHN E2633&quot; )&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 2. 写入 E2631&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;setmac&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;33024&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;5A58484E204532363331&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 3. 回读验证&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;setmac&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;33024&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;#   预期返回：5a58484e204532363331&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;十六进制可以交给设备自己算，不用手推：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;printf&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;ZXHN E2631&apos;&lt;/span&gt;&lt;span&gt; | &lt;/span&gt;&lt;span&gt;hexdump&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-v&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-e&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&apos;1/1 &quot;%02x&quot;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 5a58484e204532363331&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;常见形式对照（把末尾 &lt;code&gt;33&lt;/code&gt; 改成 &lt;code&gt;31&lt;/code&gt;）：&lt;/p&gt;

&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;型号字符串&lt;/th&gt;&lt;th&gt;hex&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;ZXHN E2633&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;5A58484E204532363333&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;ZXHN E2631&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;5A58484E204532363331&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;ZTE E2633&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;5A5445204532363333&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;E2633&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;4532363333&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;长度要一致&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;型号字段长度为 10 字节（&lt;code&gt;ZXHN E2631&lt;/code&gt;）。&lt;code&gt;setmac&lt;/code&gt; 对长度有校验，改型号时请与读取值保持等长，
否则可能被拒绝，或破坏后续记录结构。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;只改型号时，其余字段（MAC、S/N、OUI、Wi-Fi）全部保持原值&lt;/strong&gt; —— 这正是”其他信息都还是自己贴纸上的”。若需单独修正 MAC：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;setmac&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;256&lt;/span&gt;&lt;span&gt;                       &lt;/span&gt;&lt;span&gt;# 读当前主 MAC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;setmac&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;256&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AABBCCDDEEFF&lt;/span&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;# 主 MAC（2.4G）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;setmac&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;257&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AABBCCDDEE00&lt;/span&gt;&lt;span&gt;          &lt;/span&gt;&lt;span&gt;# 第二 MAC（5G）&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;setmac&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;768&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;AABBCC&lt;/span&gt;&lt;span&gt;                &lt;/span&gt;&lt;span&gt;# OUI = MAC 前三字节&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;setmac&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;show2&lt;/span&gt;&lt;span&gt;                       &lt;/span&gt;&lt;span&gt;# 回读确认&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;改完重启。Tag 在启动阶段被读取（&lt;code&gt;initwifi&lt;/code&gt; 会调用 &lt;code&gt;setwlanmac&lt;/code&gt; 把 MAC 应用到无线接口），&lt;code&gt;cspd&lt;/code&gt; 与 Web 页面也会重新读取：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;reboot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;风险提示&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ul&gt;
&lt;li&gt;&lt;code&gt;setmac 4&lt;/code&gt; 会&lt;strong&gt;格式化整个 Tag 分区&lt;/strong&gt;，MAC、S/N、OUI、Wi-Fi 信息全部清空，&lt;strong&gt;不要执行&lt;/strong&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;setmac 3 &amp;lt;id&amp;gt;&lt;/code&gt; 删除单个参数，同样危险。&lt;/li&gt;
&lt;li&gt;改型号或 MAC 属于改变设备身份，会影响 TR-069 上报、APP 绑定与 Web 显示；操作前建议先用 &lt;code&gt;setmac show2&lt;/code&gt; 记录全部原值，并顺手备份：
&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mkdir&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/wlan/bak&lt;/span&gt;&lt;span&gt; &amp;amp;&amp;amp; &lt;/span&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/dev/mtd2&lt;/span&gt;&lt;span&gt; &amp;gt; &lt;/span&gt;&lt;span&gt;/wlan/bak/tag-backup.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;
&lt;/li&gt;
&lt;/ul&gt;&lt;/div&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h4&gt;方法二：mtd_write_tag 整区写入（备选）&lt;a href=&quot;#方法二mtd_write_tag-整区写入备选&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h4&gt;&lt;p&gt;&lt;code&gt;mtd_write_tag&lt;/code&gt; 是自己编译的 ARMv7 MTD 写入工具，&lt;a href=&quot;https://wwbnc.lanzoub.com/iW88t40izsne&quot; target=&quot;_blank&quot;&gt;点此下载 mtd_write_tag_armv7&lt;/a&gt;（&lt;code&gt;common-tools&lt;/code&gt; 包内也附带，见 6.1 节）。它按 MTD 的擦除块、写入页和坏块规则执行整区擦写，适合需要整区替换（例如离线改好整个 Tag 镜像），或 &lt;code&gt;setmac&lt;/code&gt; 不可用的设备。&lt;strong&gt;该工具只针对 Tag 的 MTD 写入流程，不能未经验证地用于 Wi-Fi、Bootloader 或其他分区。&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;若需要离线生成改好的 Tag 镜像，可使用脚本&lt;a href=&quot;https://wwbnc.lanzoub.com/iLgJ840kyibi&quot; target=&quot;_blank&quot;&gt;改型号为E2631&lt;/a&gt;：把 &lt;code&gt;tag-backup.bin&lt;/code&gt; 重命名为 &lt;code&gt;tag.bin&lt;/code&gt;，与脚本放在同一级目录，双击脚本即可得到 &lt;code&gt;tag-E2631.bin&lt;/code&gt;，其他信息仍是自己设备贴纸上的。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;Tag分区信息&quot; loading=&quot;lazy&quot; width=&quot;478&quot; height=&quot;554&quot; src=&quot;/_astro/tag.CdknOFPz_DHBD.webp&quot; /&gt;&lt;figcaption&gt;Tag分区信息&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;Tag 结构（离线自行修改镜像时，需要自己重算 CRC32）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;0x00  33 33 33 33&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;0x04  payload size，小端&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;0x08  CRC32，小端&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;0x0c  记录区&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;尾部  ff 填充&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;CRC32 计算范围从 &lt;code&gt;0x0c&lt;/code&gt; 开始，长度由 payload size 决定。&lt;/p&gt;&lt;p&gt;先把改好的 Tag 镜像和工具通过 TFTP 传入路由器（&lt;code&gt;192.168.5.7&lt;/code&gt; 是电脑的 TFTP 地址，请按实际网络修改）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ping&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-c&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;3&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.5.7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-f&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/tag.bin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/mtd_write_tag&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tftp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-g&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-l&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/tag.bin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-r&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;tag.bin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.5.7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tftp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-g&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-l&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/mtd_write_tag&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-r&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mtd_write_tag_armv7&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.5.7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;上面脚本生成的是 &lt;code&gt;tag-E2631.bin&lt;/code&gt;，传输时按实际文件名填写 &lt;code&gt;-r&lt;/code&gt; 参数即可。&lt;/p&gt;&lt;p&gt;先确认程序用法：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;chmod&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;+x&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/mtd_write_tag&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/tmp/mtd_write_tag&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;应能看到类似用法：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Usage: /tmp/mtd_write_tag --yes /dev/mtdN file.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Example: /tmp/mtd_write_tag --yes /dev/mtd2 /tmp/tag.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;确认输入文件为目标 Tag 分区大小后执行写入：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ls&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-l&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/tag.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/sys/class/mtd/mtd2/name&lt;/span&gt;&lt;span&gt; 2&amp;gt;&lt;/span&gt;&lt;span&gt;/dev/null&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/sys/class/mtd/mtd2/size&lt;/span&gt;&lt;span&gt; 2&amp;gt;&lt;/span&gt;&lt;span&gt;/dev/null&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/tmp/mtd_write_tag&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--yes&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/dev/mtd2&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/tag.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sync&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;出现 &lt;code&gt;MEMUNLOCK warning: Operation not supported&lt;/code&gt; 或 &lt;code&gt;fsync: Invalid argument&lt;/code&gt; 时，不要只根据警告判断成功或失败，必须继续做读回校验。&lt;/p&gt;&lt;p&gt;写入后在路由器端读回并校验 MD5：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;md5sum&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/tag.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-f&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/tag-readback.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/dev/mtd2&lt;/span&gt;&lt;span&gt; &amp;gt; &lt;/span&gt;&lt;span&gt;/tmp/tag-readback.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;md5sum&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/tag-readback.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;两次 MD5 一致，且程序没有报告擦除、写入或读回错误，才可认为 Tag 写入成功。若不一致，保留终端输出，不要重启设备，也不要继续写 Bootloader 或整片 NAND。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.3 恢复 Wi-Fi 分区：用 2.1 的备份文件写回&lt;a href=&quot;#23-恢复-wi-fi-分区用-21-的备份文件写回&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Wi-Fi 分区（mtd3）是 &lt;strong&gt;JFFS2 文件系统&lt;/strong&gt;，开机时挂载在 &lt;code&gt;/wlan&lt;/code&gt;，里面只有一个 &lt;code&gt;caldata&lt;/code&gt; 文件（196,608 字节）。它与 Tag 性质完全不同：&lt;/p&gt;

&lt;table&gt;&lt;thead&gt;&lt;tr&gt;&lt;th&gt;&lt;/th&gt;&lt;th&gt;Tag（mtd2）&lt;/th&gt;&lt;th&gt;Wi-Fi（mtd3）&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;内容&lt;/td&gt;&lt;td&gt;裸结构化记录 + CRC32&lt;/td&gt;&lt;td&gt;JFFS2 文件系统&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;是否挂载&lt;/td&gt;&lt;td&gt;否&lt;/td&gt;&lt;td&gt;&lt;strong&gt;是&lt;/strong&gt;，挂在 &lt;code&gt;/wlan&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;能用 &lt;code&gt;setmac&lt;/code&gt;&lt;/td&gt;&lt;td&gt;能&lt;/td&gt;&lt;td&gt;&lt;strong&gt;不能&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;能用 &lt;code&gt;cat&lt;/code&gt; 裸写&lt;/td&gt;&lt;td&gt;不可靠&lt;/td&gt;&lt;td&gt;&lt;strong&gt;不行&lt;/strong&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;为什么不能用 &lt;code&gt;cat&lt;/code&gt; 写：&lt;/strong&gt; &lt;code&gt;cat 文件 &amp;gt; /dev/mtd3&lt;/code&gt; 会被&lt;strong&gt;直接拒绝&lt;/strong&gt;，写请求根本不生效：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# cat /tmp/wifi.bin &amp;gt; /dev/mtd3&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/bin/sh: can&apos;t create /dev/mtd3: No child processes&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# echo $?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;在 E2631（192.168.5.2）上实测：完整 1 MiB 分区镜像、仅 4 字节内容、追加模式 &lt;code&gt;&amp;gt;&amp;gt;&lt;/code&gt;，三种写法返回同一错误；先 &lt;code&gt;umount /wlan&lt;/code&gt; 再写也照样失败；写入前后 &lt;code&gt;cat /dev/mtd3 | md5sum&lt;/code&gt; 完全相同，分区内容零变化。权限与 MTD 标志均正常（&lt;code&gt;/dev/mtd3&lt;/code&gt; 为 &lt;code&gt;crw-r--r--&lt;/code&gt;，&lt;code&gt;/sys/class/mtd/mtd3/flags&lt;/code&gt; = &lt;code&gt;0x400&lt;/code&gt;，即 &lt;code&gt;MTD_WRITEABLE&lt;/code&gt;）。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;所以”把自己那份原样写回、MD5 一致”是个假象&lt;/strong&gt;：写操作从未生效，读回的又是分区原有内容，两者当然一致 —— &lt;strong&gt;MD5 相同完全不能证明写入成功。&lt;/strong&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;NAND 的另一个坑&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;E2631 用的是 SPI NAND，编程时&lt;strong&gt;只能把位从 &lt;code&gt;1&lt;/code&gt; 变成 &lt;code&gt;0&lt;/code&gt;&lt;/strong&gt;，要把位从 &lt;code&gt;0&lt;/code&gt; 变回 &lt;code&gt;1&lt;/code&gt; 必须先整块擦除（128 KiB）。这是裸写普遍不可靠的根本原因；不过在这台设备上，&lt;code&gt;cat&lt;/code&gt; 连提交写入请求这一步都过不去。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;为什么不能用 &lt;code&gt;setmac&lt;/code&gt;：&lt;/strong&gt; 它依赖 &lt;code&gt;libtagparam.so&lt;/code&gt;，只认 Tag 分区。&lt;/p&gt;&lt;p&gt;&lt;strong&gt;正确做法：恢复挂载点里的 &lt;code&gt;caldata&lt;/code&gt;&lt;/strong&gt;，擦除、ECC、坏块跳过、磨损均衡全部交给 JFFS2。&lt;/p&gt;&lt;p&gt;先确认挂载状态：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;mount&lt;/span&gt;&lt;span&gt; | &lt;/span&gt;&lt;span&gt;grep&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;wlan&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ls&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-l&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/wlan/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;正常应看到：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/dev/mtdblock3 on /wlan type jffs2 (rw,relatime)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;----------    1 Z500_w9b root        196608 Jan  1  1970 caldata&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;把 2.1 备份的 &lt;code&gt;caldata-backup.bin&lt;/code&gt; 传回设备：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tftp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-g&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-l&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/caldata&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-r&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;caldata-backup.bin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.5.7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;写回挂载点：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/caldata&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/wlan/caldata&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sync&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;md5sum&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/tmp/caldata&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/wlan/caldata&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;两个 MD5 必须一致。随后让驱动重新加载校准数据：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rmmod&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;mt7916&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;insmod&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/lib/modules/mt7916.ko&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;mt7916&lt;/code&gt; 通常被 &lt;code&gt;tm&lt;/code&gt;、&lt;code&gt;plat_zxylzb_9128S&lt;/code&gt; 等模块引用，&lt;code&gt;rmmod&lt;/code&gt; 会直接失败，此时 &lt;code&gt;reboot&lt;/code&gt; 即可。&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;不要裸写 &lt;code&gt;/dev/mtd3&lt;/code&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Wi-Fi 分区是&lt;strong&gt;已经挂载的活动 JFFS2 文件系统&lt;/strong&gt;。对它裸写不只是”写不进去”：一旦部分块真的被写坏，JFFS2 的节点头与校验会错乱，可能导致&lt;strong&gt;下次挂载失败、整个分区读不出来&lt;/strong&gt; —— 比 Tag 写坏更难恢复。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;3. Web 本地上传分析研究&lt;a href=&quot;#3-web-本地上传分析研究&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;注意（2026/08/29更新）&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;中兴官方系统自带Web本地上传升级界面：&lt;a href=&quot;http://192.168.5.1/supgrade.html&quot; target=&quot;_blank&quot;&gt;http://192.168.5.1/supgrade.html&lt;/a&gt;
由&lt;a href=&quot;https://www.right.com.cn/forum/space-uid-639610.html&quot; target=&quot;_blank&quot;&gt;@cnjn&lt;/a&gt;研究发现，以下内容仅作研究分享。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;section&gt;&lt;h3&gt;3.1 接口和表单&lt;a href=&quot;#31-接口和表单&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;抓到的 Web 流程：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;GET  /?_type=vueData&amp;amp;_tag=vue_nowversion_lua&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;POST /?_type=vueData&amp;amp;_tag=prepare_firmware_upgrade&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;POST /?_type=vueData&amp;amp;_tag=do_firmware_upgrade&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;multipart 字段名：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;VersionUpload&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;核心表单头：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Content-Type: multipart/form-data; boundary=...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Content-Disposition: form-data; name=&quot;VersionUpload&quot;; filename=&quot;firmware.bin&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Content-Type: application/octet-stream&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.2 SessionTimeout 的定位&lt;a href=&quot;#32-sessiontimeout-的定位&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;页面返回过 &lt;code&gt;logintoken&lt;/code&gt;，响应头也返回过 &lt;code&gt;X_XSRF_TOKEN&lt;/code&gt;。曾出现：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;HTTP 200&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;IF_ERRORSTR = SessionTimeout&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;以及多种 token 组合均失败：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;prepare same token  =&amp;gt; SessionTimeout&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;prepare sessOnly    =&amp;gt; SessionTimeout&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;prepare sessionOnly =&amp;gt; SessionTimeout&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;后续在同一登录 Session 内获取页面 token、Cookie 和 XSRF token，并先调用 &lt;code&gt;vue_loadprevent_data&lt;/code&gt;，曾得到：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;prepare same:&amp;lt;page token&amp;gt; =&amp;gt; SUCC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;这只说明准备阶段通过，不说明上传和刷写一定成功。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.3 升级管理器调试&lt;a href=&quot;#33-升级管理器调试&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;Telnet 下可以打开升级管理器日志并查看状态：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sendcmd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cspd.cspd.upgrade_mgr&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;setDebug&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sendcmd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cspd.cspd.upgrade_mgr&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;show&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sendcmd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cspd.cspd.upgrade_mgr&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-p&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sendcmd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;cspd.cspd.upgrade_mgr&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-l&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;show&lt;/code&gt; 中的 &lt;code&gt;State&lt;/code&gt;、&lt;code&gt;Location&lt;/code&gt;、&lt;code&gt;TempDirName&lt;/code&gt;、&lt;code&gt;FlashingPid&lt;/code&gt; 和 &lt;code&gt;MediaPid&lt;/code&gt; 可帮助判断升级是否真正进入后端。研究中 Web 失败后常见：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;State       :0&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Location    :&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;TempDirName :&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;MediaPid    :&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;同时没有 &lt;code&gt;/var/tmp/fw.bin&lt;/code&gt;，这更像请求未进入后端刷写，而不是固件已经写入。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.4 请求体上限实验&lt;a href=&quot;#34-请求体上限实验&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&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;约 300 KiB&lt;/td&gt;&lt;td&gt;100% 后 HTTP 200，&lt;code&gt;SessionTimeout&lt;/code&gt;&lt;/td&gt;&lt;td&gt;能传完整请求，会话仍有问题，不进入后续校验升级流程&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;约 320 KiB&lt;/td&gt;&lt;td&gt;100% 后连接重置&lt;/td&gt;&lt;td&gt;接近/超过请求体限制&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;约 330 KiB&lt;/td&gt;&lt;td&gt;约 97% 后重置&lt;/td&gt;&lt;td&gt;multipart 边界也占空间&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;约 512 KiB&lt;/td&gt;&lt;td&gt;约 62% 后重置&lt;/td&gt;&lt;td&gt;设备端提前关闭连接&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;22,413,844 bytes 官方包&lt;/td&gt;&lt;td&gt;无法稳定上传&lt;/td&gt;&lt;td&gt;不适合该页面&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;300Kib测试&quot; loading=&quot;lazy&quot; width=&quot;2559&quot; height=&quot;1580&quot; src=&quot;/_astro/300.DP0opm6j_Cy0q6.webp&quot; /&gt;&lt;figcaption&gt;300Kib测试&lt;/figcaption&gt;&lt;/figure&gt;
&lt;figure&gt;&lt;img alt=&quot;320Kib测试&quot; loading=&quot;lazy&quot; width=&quot;2559&quot; height=&quot;1477&quot; src=&quot;/_astro/330.CYCiqjT3_Z18SAKS.webp&quot; /&gt;&lt;figcaption&gt;320Kib测试&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;/bin/httpd&lt;/code&gt; 中发现：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;content length is beyond limit.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Http request body read fail.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Upload file fail for not enough space, g_nContentLength(%d) &amp;gt;= g_nAllowedSpace(%d)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fwrite fail when upload.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;VersionUpload&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/var/tmp/fw.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;do_firmware_upgrade&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;my_upload_file&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;这证明有 body length、临时空间和写文件分支；字符串本身不能证明唯一的上限数值。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.5 &lt;code&gt;/tmp&lt;/code&gt; 空间与 Web 限制&lt;a href=&quot;#35-tmp-空间与-web-限制&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;当时读取到：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/var/tmp 约 40960 KiB，可用约 40736 KiB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/tmp     约 20480 KiB，可用约 19456 KiB&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;官方包约 21.38 MiB，在 &lt;code&gt;/var/tmp&lt;/code&gt; 理论上放得下，但仍被 HTTP 处理路径重置。磁盘空间够，不等于请求体限制够，也不等于升级进程会接受该文件。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.6 Wireshark 过滤器&lt;a href=&quot;#36-wireshark-过滤器&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;只看 HTTP 上传：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ip.addr == 192.168.5.1 &amp;amp;&amp;amp; ip.addr == 192.168.5.7 &amp;amp;&amp;amp; tcp.port == 80&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;只看电脑到路由器：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ip.src == 192.168.5.7 &amp;amp;&amp;amp; ip.dst == 192.168.5.1 &amp;amp;&amp;amp; tcp.dstport == 80&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;只看重置/重传：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tcp.flags.reset == 1 || tcp.analysis.retransmission&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;早期过滤 &lt;code&gt;udp&lt;/code&gt; 只能看到 DNS、多播或调试包，不能证明 HTTP 升级。抓包中由 &lt;code&gt;192.168.5.1:80&lt;/code&gt; 返回 &lt;code&gt;RST, ACK&lt;/code&gt;，与设备端连接关闭相符。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3.7 Web 结论&lt;a href=&quot;#37-web-结论&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ul&gt;
&lt;li&gt;进度 100% 只表示浏览器发完请求，不表示设备已经校验或写入。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;SessionTimeout&lt;/code&gt; 和 &lt;code&gt;ERR_CONNECTION_RESET&lt;/code&gt; 必须分层排查。&lt;/li&gt;
&lt;li&gt;大于几百 KiB 的正式升级包应走 Telnet + TFTP + 本地 &lt;code&gt;fw_flashing&lt;/code&gt;，不应继续反复提交 Web 请求。&lt;/li&gt;
&lt;li&gt;隐藏页面是真实刷写路径，不是安全测试页面。&lt;/li&gt;
&lt;/ul&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;4. fw-flashing 与双槽启动&lt;a href=&quot;#4-fw-flashing-与双槽启动&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;4.1 参数和最小失败测试&lt;a href=&quot;#41-参数和最小失败测试&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/bin/fw_flashing&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/bin/fw_flashing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-h&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;输出包含：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fw_flashing:no parameter&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;d:r:p:f:m:v:&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;确认 &lt;code&gt;-f&lt;/code&gt;：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;test&lt;/span&gt;&lt;span&gt; &amp;gt; &lt;/span&gt;&lt;span&gt;/var/tmp/fw-test.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/bin/fw_flashing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-f&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/tmp/fw-test.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;$?&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;输出：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;fw_flashing name=/var/tmp/fw-test.bin,states.st_size =5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;read magic failed!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;GetVersionInfo error==========fw_flashing error==========&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;说明 &lt;code&gt;-f&lt;/code&gt; 确实接受路径，并要求带固件 Magic/版本头。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.2 官方包成功刷写&lt;a href=&quot;#42-官方包成功刷写&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;电脑端确认：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;dir&lt;/span&gt;&lt;span&gt; fw.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;certutil&lt;/span&gt;&lt;span&gt; -hashfile fw.bin MD5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;路由器获取并校验：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cd&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/tmp&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;rm&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-f&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/tmp/fw.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tftp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-g&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-l&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/tmp/fw.bin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-r&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;fw.bin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.5.7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ls&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-l&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/tmp/fw.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;md5sum&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/tmp/fw.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;本次包 MD5：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;de682a3dce2b128cf7edeb8ac5f958a1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;执行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;/bin/fw_flashing&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-f&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/var/tmp/fw.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;关键输出：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;RunningVerStartAddr:700000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;RunningHeadHighAddr:2300000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;g_ver_towrite=2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;g_upgrade_startaddr=0x2300000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;g_upgrade_endaddr=0x3f00000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firmware_size=22413312&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;firmware_offset=0x214&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;sect_size=0x20000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;WriteVersion head success!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;==========fw_flashing success==================&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;说明程序选择备用高槽、擦除并写入了包体，同时更新了版本头。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.3 确认当前槽&lt;a href=&quot;#43-确认当前槽&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/proc/cmdline&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/proc/zte/verinfo/versionstates&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/proc/zte/verinfo/softVersion&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;cat&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;/proc/zte/verinfo/othersoftVersion&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;槽位关键字段：&lt;/p&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;code&gt;currentverphyaddr&lt;/code&gt;&lt;/td&gt;&lt;td&gt;当前运行物理起始地址&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;backverphyaddr&lt;/code&gt;&lt;/td&gt;&lt;td&gt;备用槽物理起始地址&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;curverIsBad&lt;/code&gt;&lt;/td&gt;&lt;td&gt;当前槽是否标坏&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;backverIsBad&lt;/code&gt;&lt;/td&gt;&lt;td&gt;备用槽是否标坏&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;curverSerialNumber&lt;/code&gt;&lt;/td&gt;&lt;td&gt;当前记录序号&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;code&gt;othersoftVersion&lt;/code&gt;&lt;/td&gt;&lt;td&gt;备用槽版本记录&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;本次低槽运行时确认：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;currentverphyaddr: 0x00700000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;backverphyaddr:    0x02300000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;另一次从高槽启动时，&lt;code&gt;/proc/cmdline&lt;/code&gt; 尾部出现 &lt;code&gt;0x2300000&lt;/code&gt;。两者一致时，才是较强的槽位证据；不能只看 &lt;code&gt;root=/dev/mtdblock8&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4.4 已确认的检查方向&lt;a href=&quot;#44-已确认的检查方向&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;从 &lt;code&gt;/bin/fw_flashing&lt;/code&gt; 字符串、符号和运行输出来看，存在：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;read magic failed!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;GetVersionInfo&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;check_ver_board&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;invalid vid version!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;CheckBootFile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;CheckFile&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Checkheader&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;CspUserMtdRead / Write / Erase&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;flash addr overflow&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;uImage&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;CRC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;CspSwitchVersion&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;合理的校验链：&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;文件大小和可读性。&lt;/li&gt;
&lt;li&gt;Magic、版本和升级头。&lt;/li&gt;
&lt;li&gt;板型、VID、版本关系。&lt;/li&gt;
&lt;li&gt;长度和目标槽范围。&lt;/li&gt;
&lt;li&gt;uImage 头部/数据 CRC，具体分支由版本决定。&lt;/li&gt;
&lt;li&gt;擦除、写入和写后读回。&lt;/li&gt;
&lt;li&gt;写版本头、切换或等待下一次启动选择。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;未找到明确 RSA 公钥验证调用。RSA 可能在 &lt;code&gt;cspd&lt;/code&gt;、Web、BootROM 或其他库中，不能仅凭 &lt;code&gt;fw_flashing&lt;/code&gt; 字符串判断。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;5. 试错部分&lt;a href=&quot;#5-试错部分&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;5.1 Tag 直接写失败&lt;a href=&quot;#51-tag-直接写失败&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;尝试 &lt;code&gt;cat&lt;/code&gt;、&lt;code&gt;mknod&lt;/code&gt;、&lt;code&gt;chmod&lt;/code&gt; 后仍 MD5 不一致。设备没有 &lt;code&gt;mtd_debug&lt;/code&gt;、&lt;code&gt;flash_erase&lt;/code&gt;、&lt;code&gt;nandwrite&lt;/code&gt;，只有 &lt;code&gt;fw_flashing&lt;/code&gt;、&lt;code&gt;upgradetest&lt;/code&gt; 等程序；这些程序没有暴露 Tag 写入接口。&lt;/p&gt;&lt;p&gt;最终是自己编译 MTD ioctl 工具（&lt;code&gt;mtd_write_tag&lt;/code&gt;）完成写入的。&lt;/p&gt;&lt;p&gt;后来才发现，官方固件本身就自带 &lt;code&gt;/bin/setmac&lt;/code&gt;（见 2.2 节），它通过 &lt;code&gt;libtagparam.so&lt;/code&gt; + &lt;code&gt;libmtduserapi.so&lt;/code&gt; 自动完成擦除并重算 CRC32 —— &lt;strong&gt;改 Tag 用一条命令就够了，不需要自编译任何工具&lt;/strong&gt;。&lt;code&gt;mtd_write_tag&lt;/code&gt; 仍然可用，适合需要整区替换或 &lt;code&gt;setmac&lt;/code&gt; 不可用的场景。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5.2 Web 反复失败&lt;a href=&quot;#52-web-反复失败&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;升级准备失败：SessionTimeout&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;上传连接失败&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;net::ERR_CONNECTION_RESET&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;进度 31%、62%、97%、100% 后都见过失败。用小文件先拆分问题，确认大文件主要被 HTTP 路径限制后，停止继续提交 22 MiB 包，转为本地 &lt;code&gt;fw_flashing&lt;/code&gt;。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5.3 未验证自动回退&lt;a href=&quot;#53-未验证自动回退&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;已确认 &lt;code&gt;currentverphyaddr&lt;/code&gt;、&lt;code&gt;backverphyaddr&lt;/code&gt;、两个 &lt;code&gt;IsBad&lt;/code&gt; 字段，但没有故意刷坏包测试回退。不要为了得到一个“确定答案”而破坏当前可启动槽。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;6. 通用脚本（自行研究使用）&lt;a href=&quot;#6-通用脚本自行研究使用&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;6.1 目录&lt;a href=&quot;#61-目录&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;common-tools/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;README.md&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;zte_type4_config_tool.js&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;enable_telnet_admin.bat&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;zte_firmware_analyzer.js&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;fw_slot_status.sh&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt;  &lt;/span&gt;&lt;/span&gt;&lt;span&gt;mtd_write_tag_armv7&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;&lt;a href=&quot;https://wwbnc.lanzoub.com/i5JFl40o809g&quot; target=&quot;_blank&quot;&gt;点此下载&lt;/a&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6.2 Type-4 配置工具&lt;a href=&quot;#62-type-4-配置工具&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;node&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;common-tools/zte_type4_config_tool.js&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;inspect&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;node&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;common-tools/zte_type4_config_tool.js&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;decrypt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config.bin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config.xml&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--profile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;e2631&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;node&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;common-tools/zte_type4_config_tool.js&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;encrypt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config.xml&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config-new.bin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--profile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;e2631&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;node&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;common-tools/zte_type4_config_tool.js&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;enable-telnet&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config.bin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config-telnet.bin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--profile&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;e2631&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--user&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;admin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--password&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;admin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;其他机型必须显式提供已验证种子：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;node&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;common-tools/zte_type4_config_tool.js&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;decrypt&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config.bin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;config.xml&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--key-seed&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MODELKeyXXXXXXXX&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--iv-seed&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;MODELIvXXXXXXXX&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6.3 固件分析工具&lt;a href=&quot;#63-固件分析工具&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;node&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;common-tools/zte_firmware_analyzer.js&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;firmware.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;node&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;common-tools/zte_firmware_analyzer.js&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;firmware.bin&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--signature-offset&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0x37fdcc&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;--signature-size&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;564&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;输出哈希、可打印头部、型号标记、uImage CRC 和指定签名区零字节数。签名区非零不等于签名有效。&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>创维盒子ADB动态密码在线计算器</title><link>https://blog.zlion.top/posts/skyworth-adb-web/</link><guid isPermaLink="true">https://blog.zlion.top/posts/skyworth-adb-web/</guid><description>介绍创维盒子ADB动态密码的生成算法，和一个在线计算网页。</description><pubDate>Thu, 30 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;免责说明&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;本工具及算法仅供技术学习与合法设备调试使用。请勿用于非法破解或侵犯他人设备隐私，使用者需自行承担相关法律责任。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;
&lt;section&gt;&lt;h2&gt;说明&lt;a href=&quot;#说明&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;创维盒子开启ADB调试时，部分型号会要求输入&lt;strong&gt;动态密码&lt;/strong&gt;，该密码由MAC地址和屏幕显示的随机码共同计算得出。&lt;/li&gt;
&lt;li&gt;本文公开的算法来源于开源项目，并搭建了在线计算页面，方便快速得到结果。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;在线工具地址&lt;a href=&quot;#在线工具地址&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;🔗 &lt;strong&gt;在线计算页面&lt;/strong&gt;： &lt;a href=&quot;https://skyworth-adb.zlion.top/&quot; target=&quot;_blank&quot;&gt;https://skyworth-adb.zlion.top/&lt;/a&gt;&lt;/p&gt;&lt;p&gt;网页UI借助AI工具生成，算法核心来自开源项目 &lt;a href=&quot;https://github.com/wiver53/skyworth-ADB-&quot; target=&quot;_blank&quot;&gt;wiver53/skyworth-ADB&lt;/a&gt;。&lt;/p&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;动态密码算法详解&lt;a href=&quot;#动态密码算法详解&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;动态密码的生成共分三步，下文以具体示例说明。&lt;/p&gt;&lt;section&gt;&lt;h3&gt;第一步：拼接原始字符串&lt;a href=&quot;#第一步拼接原始字符串&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;格式：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;JSCMCC_SKYWORTH + [MAC 地址] + [随机码] + tianhuaxin@skyworth.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;假设设备信息如下：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;MAC 地址：&lt;code&gt;A1:B2:C3:D4:E5:F6&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;随机码：&lt;code&gt;123456&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;拼接后的原始字符串为：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;JSCMCC_SKYWORTHA1:B2:C3:D4:E5:F6123456tianhuaxin@skyworth.com&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第二步：计算 MD5 哈希&lt;a href=&quot;#第二步计算-md5-哈希&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;对上述完整字符串进行 MD5 运算，得到 32 位十六进制摘要。&lt;/p&gt;&lt;p&gt;例如上一步字符串的 MD5 结果：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;e10adc3949ba59abbe56e057f20f883e&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;p&gt;以上结果仅为示例，非真实计算结果。&lt;/p&gt;&lt;/blockquote&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;第三步：计算最终动态密码&lt;a href=&quot;#第三步计算最终动态密码&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;将 32 位 MD5 字符串从中间一分为二，分别求和后相乘。&lt;/p&gt;&lt;p&gt;前半段：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;e10adc3949ba59ab&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;后半段：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;be56e057f20f883e&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;将每段中的十六进制字符转换为十进制数字后求和：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;字符 &lt;code&gt;3&lt;/code&gt; → &lt;code&gt;3&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;字符 &lt;code&gt;a&lt;/code&gt; → &lt;code&gt;10&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;字符 &lt;code&gt;f&lt;/code&gt; → &lt;code&gt;15&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;得到两个总和后，将两者相乘，乘积即为最终的动态密码。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;本地计算&lt;a href=&quot;#本地计算&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;如果不想使用在线页面，也可以通过命令行计算。以下示例适用于 Linux/macOS：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 1. 拼接字符串，请替换为实际的 MAC 地址和随机码&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;STR&lt;/span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;&quot;JSCMCC_SKYWORTHA1:B2:C3:D4:E5:F6123456tianhuaxin@skyworth.com&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 2. 计算 MD5&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;MD5&lt;/span&gt;&lt;span&gt;&lt;span&gt;=&lt;/span&gt;&lt;span&gt;$(&lt;/span&gt;&lt;/span&gt;&lt;span&gt;echo&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-n&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt;$STR&lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;span&gt; | &lt;/span&gt;&lt;span&gt;md5sum&lt;/span&gt;&lt;span&gt; | &lt;/span&gt;&lt;span&gt;cut&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-d&lt;/span&gt;&lt;span&gt;&apos; &apos;&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-f1&lt;/span&gt;&lt;span&gt;)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;# 3. 分割并求和相乘&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;python3&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;-c&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;md5=&apos;&lt;/span&gt;&lt;span&gt;$MD5&lt;/span&gt;&lt;span&gt;&apos;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;half=len(md5)//2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;s1=sum(int(c,16) for c in md5[:half])&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;s2=sum(int(c,16) for c in md5[half:])&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;print(s1*s2)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&quot;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;常见问题&lt;a href=&quot;#常见问题&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;Q：为什么我的盒子输入密码后提示错误？&lt;a href=&quot;#q为什么我的盒子输入密码后提示错误&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;请检查 MAC 地址和随机码是否与屏幕显示完全一致，尤其注意：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;MAC 地址的大小写&lt;/li&gt;
&lt;li&gt;MAC 地址中的冒号格式&lt;/li&gt;
&lt;li&gt;随机码是否为最新显示的 6 位数字&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;Q：所有创维盒子都适用吗？&lt;a href=&quot;#q所有创维盒子都适用吗&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;该算法主要适用于国内运营商定制版，例如江苏移动创维盒子。其他型号可能存在差异，请以实际测试结果为准。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>E2633刷入中兴官方AX3000 版本（TTL篇）</title><link>https://blog.zlion.top/posts/e2633-research-ttl/</link><guid isPermaLink="true">https://blog.zlion.top/posts/e2633-research-ttl/</guid><description>记录 E2633通过 TTL 进入 U-Boot 后，使用 Nand Write 官方巡天 AX3000 版本固件的流程。</description><pubDate>Mon, 20 Jul 2026 00:00:00 GMT</pubDate><content:encoded>&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;免责声明与使用约定&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;ol&gt;
&lt;li&gt;固件刷写、分区读写、Telnet、TTL、U-Boot 和 MTD 操作均可能造成数据丢失、设备变砖、网络中断、保修失效或其他不可预期后果。&lt;strong&gt;请对自己的设备和全部操作结果负责并自行承担风险。&lt;/strong&gt;&lt;/li&gt;
&lt;li&gt;教程中涉及的固件、商标、产品名称及第三方程序，其权利归各自权利人所有。如本文内容存在侵权、错误引用或其他权益问题，请联系作者核实；确认后将及时删除或修正相关内容。&lt;/li&gt;
&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;
&lt;section&gt;&lt;h2&gt;说明&lt;a href=&quot;#说明&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;由于是全分区整片写入，刷完后默认 WiFi 名称会变为 &lt;code&gt;ZTE-Q2QHKu&lt;/code&gt;，重置一遍后密码为 &lt;code&gt;bhdh3954&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;所有内容仅适用于 256 MB RAM ➕ 128 MB ROM 版本。&lt;/li&gt;
&lt;li&gt;本教程会覆盖你的所有分区，无法找回，若想保留，请先参考&lt;a href=&quot;https://blog.zlion.top/posts/e2631-research-telnet/#2-%E6%9C%AC%E6%9C%BA%E4%BF%A1%E6%81%AF%E4%BC%98%E5%8C%96&quot;&gt;Telnet篇&lt;/a&gt;备份两个关键分区：tag、wifi（tag包含SN/MAC等信息是远程控制的关键，WiFi包含本机独一无二的无线校准数据，直接覆盖可能信号不稳定）。通过Telnet还原这两个分区后再重置一遍，所有信息就变成贴纸上的了，并且默认无密码。&lt;/li&gt;
&lt;li&gt;若在TFTP传输中失败，可能是传输速度太慢，超出了MobaXterm未注册版本的开启时长限制，此问题自行解决。&lt;/li&gt;
&lt;li&gt;鉴于部分设备有坏块的情况，会在写入128MB镜像时报错导致变砖，现在更新一下镜像，原128MB的镜像中末尾有大约13MB都是无效数据（FF），我裁切了10MB，现在镜像只有118MB了，最多容许你的设备有80个坏块（已经非常多了，正常机子几乎不可能有这么多坏块，可以在u-boot中输入nand bad 查看）&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;准备工作&lt;a href=&quot;#准备工作&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;5元的USB 转 TTL 模块 CH340G 一个，最好带杜邦线，方便连接。&lt;/li&gt;
&lt;li&gt;由编程器固件去掉 OOB 、并裁切10MB空间预留给坏块写入跳过的 &lt;a href=&quot;https://wwbnc.lanzoub.com/iBlN541u3rxe&quot; target=&quot;_blank&quot;&gt;118 MB 镜像&lt;/a&gt;。编程器固件来自 &lt;a href=&quot;https://www.right.com.cn/forum/thread-8472425-1-1.html&quot; target=&quot;_blank&quot;&gt;hzw521&lt;/a&gt;。&lt;/li&gt;
&lt;li&gt;MobaXterm 等串口连接工具。&lt;/li&gt;
&lt;li&gt;TFTP 服务工具（MobaXterm自带）。&lt;/li&gt;
&lt;li&gt;网线一根。&lt;/li&gt;
&lt;/ul&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;操作步骤&lt;a href=&quot;#操作步骤&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;1. 拆机&lt;a href=&quot;#1-拆机&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2. 连接 TTL 和网线&lt;a href=&quot;#2-连接-ttl-和网线&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;使用网线连接电脑和路由器，参考下图连接 TTL：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;TTL 接线参考&quot; loading=&quot;lazy&quot; width=&quot;1095&quot; height=&quot;571&quot; src=&quot;/_astro/TTL.DCdDpJwJ_dKU7D.webp&quot; /&gt;&lt;figcaption&gt;TTL 接线参考&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;3. 进入 U-Boot&lt;a href=&quot;#3-进入-u-boot&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;连接好后，使用 MobaXterm 软件进行串口连接，波特率设置为 &lt;code&gt;115200&lt;/code&gt;：&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;设置配置参考&quot; loading=&quot;lazy&quot; width=&quot;1433&quot; height=&quot;365&quot; src=&quot;/_astro/MXSetting.Ci8N9ptO_Z2m5lXJ.webp&quot; /&gt;&lt;figcaption&gt;设置配置参考&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;路由器上电后马上按 &lt;code&gt;1&lt;/code&gt; 中断系统启动，输入密码进入 U-Boot（密码来源见&lt;a href=&quot;https://voz.vn/t/unlock-mesh-zte-e1600-2603-2615-thanh-phien-ban-quoc-te.903294/&quot; target=&quot;_blank&quot;&gt;论坛&lt;/a&gt;）：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;5cE080@fyBD&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;4. 配置电脑网络和 TFTP&lt;a href=&quot;#4-配置电脑网络和-tftp&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;关闭防火墙，将电脑 IPv4 改为手动配置：&lt;/p&gt;&lt;ul&gt;
&lt;li&gt;IP 地址：&lt;code&gt;192.168.10.1&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;子网掩码：&lt;code&gt;255.255.255.0&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;p&gt;设置固件存放目录。此时先不要开启 TFTP 服务。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;TFTP 目录配置参考&quot; loading=&quot;lazy&quot; width=&quot;1363&quot; height=&quot;1016&quot; src=&quot;/_astro/TFTP.Dore2Zdg_8bPMI.webp&quot; /&gt;&lt;figcaption&gt;TFTP 目录配置参考&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;5. 在串口终端设置 IP&lt;a href=&quot;#5-在串口终端设置-ip&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在 u-boot 串口终端中输入：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;setenv&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;ipaddr&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.10.2&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;setenv&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;serverip&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.10.1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ping&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;192.168.10.1&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;看到类似下面的提示即表示通信正常：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;host 192.168.10.1 is alive&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;此时再启动前面配置好的 TFTP 服务。&lt;/p&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;6. 通过 TFTP 传输并刷写固件&lt;a href=&quot;#6-通过-tftp-传输并刷写固件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;在串口终端中通过 TFTP 将固件传到 RAM：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;tftp&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0x43000000&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;e2631_no_oob_trim_tail_ff_10MiB.bin&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;传输完成后，确认下载大小必须为：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Bytes transferred = 123731968 (7600000 hex)&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;确认无误后，擦除整片 NAND：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nand&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;erase&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0x0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0x8000000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;应当看到以下输出&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;NAND erase: device 0 whole chip&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Erasing at 0x7fe0000 -- 100% complete.&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;OK&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;然后一次性写入：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;nand&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;write&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0x43000000&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0x0&lt;/span&gt;&lt;span&gt; &lt;/span&gt;&lt;span&gt;0x7600000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;应当看到以下输出&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;NAND write: device 0 offset 0x0, size 0x7600000&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt;&lt;span&gt;123731968 bytes written: OK&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;7. 重启&lt;a href=&quot;#7-重启&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;刷写完成后执行：&lt;/p&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;span&gt;Terminal window&lt;/span&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;reset&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;此时还可以在串口终端中看到系统启动的日志：&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Boot SPI NAND&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;2&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;start read bootheader&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;3&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;start read secondboot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;4&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;non secure boot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;5&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Jump&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;6&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;7&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;enter bootloader...&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;8&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;crpm init enter&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;9&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;crpm init done&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;10&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ddr init enter, rate is 1333 Mbps&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;11&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;5ddr init done&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;12&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;serial init start&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;13&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;serial init done&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;14&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;SPI NAND&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;15&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;non secure uboot&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;16&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;backup header!!&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;17&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;Jump&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;18&lt;/div&gt;&lt;/div&gt;&lt;div&gt;
&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;19&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;.............&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;span&gt;展开&lt;/span&gt;&lt;span&gt;收起&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;p&gt;最后停在&lt;code&gt;Starting kernel ...&lt;/code&gt;代表系统已经成功启动。&lt;/p&gt;&lt;/section&gt;&lt;/section&gt;</content:encoded></item><item><title>联想小新 Pro16 2021 AMD 黑苹果安装教程</title><link>https://blog.zlion.top/posts/lenovo-pro16-2021-amd-hackintosh/</link><guid isPermaLink="true">https://blog.zlion.top/posts/lenovo-pro16-2021-amd-hackintosh/</guid><description>面向联想小新 Pro16 2021 AMD 版的黑苹果安装、EFI 调整和 OpenCore 启动项配置教程。</description><pubDate>Fri, 02 Jun 2023 00:00:00 GMT</pubDate><content:encoded>&lt;blockquote&gt;&lt;p&gt;本文档面向联想小新 Pro16 2021 AMD 版用户，整理黑苹果安装、EFI 调整与 OpenCore 启动项配置流程。
&lt;strong&gt;适用机型：&lt;/strong&gt; 联想小新 Pro16 2021 AMD（5600H / 5800H）
&lt;strong&gt;适用系统：&lt;/strong&gt; macOS Big Sur / Monterey / Ventura 13.x（取决于镜像与 EFI 支持）&lt;/p&gt;&lt;/blockquote&gt;
&lt;hr /&gt;
&lt;section&gt;&lt;h2&gt;1. 准备工作&lt;a href=&quot;#1-准备工作&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;重要&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;开始前请先确认硬盘型号不在不兼容列表内，并备份 Windows 与重要数据。调整 ESP 分区和抹盘都有数据风险。&lt;/p&gt;&lt;p&gt;硬盘兼容列表参考：&lt;a href=&quot;https://macoshome.com/hackintosh/hcourse/2476.html&quot; target=&quot;_blank&quot;&gt;https://macoshome.com/hackintosh/hcourse/2476.html&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;section&gt;&lt;h3&gt;1.1 下载所需文件&lt;a href=&quot;#11-下载所需文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&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;EFI&lt;/td&gt;&lt;td&gt;&lt;code&gt;https://wwbnc.lanzoub.com/b007up95be&lt;/code&gt;，密码：&lt;code&gt;zlion&lt;/code&gt;&lt;/td&gt;&lt;td&gt;5600H 与 5800H 使用不同 EFI，请按机型替换&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;macOS 镜像&lt;/td&gt;&lt;td&gt;&lt;code&gt;https://cloud.189.cn/t/BbyEFnE7FBJb&lt;/code&gt;，访问码：&lt;code&gt;uzx8&lt;/code&gt;&lt;/td&gt;&lt;td&gt;安装版本取决于镜像&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;DiskGenius&lt;/td&gt;&lt;td&gt;&lt;code&gt;https://www.diskgenius.cn/&lt;/code&gt;&lt;/td&gt;&lt;td&gt;用于检查硬盘、调整 ESP 分区、复制 EFI&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;1.2 检查 BIOS&lt;a href=&quot;#12-检查-bios&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;开机按 &lt;code&gt;F2&lt;/code&gt; 进入 BIOS。&lt;/li&gt;
&lt;li&gt;关闭「快速启动」和「安全启动」。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;1.3 调整 ESP 与 macOS 分区&lt;a href=&quot;#13-调整-esp-与-macos-分区&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;建议&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;Windows 默认 ESP 分区通常只有 100 MB。如果无法直接扩容，可进入微 PE 后使用 DiskGenius 调整分区。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;如果 ESP 小于 200 MB，可从 C 盘左侧腾出约 100 MB，再合并到 ESP 分区。&lt;/li&gt;
&lt;li&gt;单独划分一个用于安装 macOS 的分区，建议 &lt;code&gt;60 GB&lt;/code&gt; 以上；示例环境分配约 &lt;code&gt;160 GB&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;图 2：ESP调整&quot; loading=&quot;lazy&quot; width=&quot;1270&quot; height=&quot;897&quot; src=&quot;/_astro/lenovo-pro16-2021-amd-hackintosh-figure-02.iTp5Z0i2_Z14COP0.webp&quot; /&gt;&lt;figcaption&gt;图 2：ESP调整&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;2. 制作启动 U 盘&lt;a href=&quot;#2-制作启动-u-盘&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;section&gt;&lt;h3&gt;2.1 写入镜像&lt;a href=&quot;#21-写入镜像&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;p&gt;准备一个大于 &lt;code&gt;16 GB&lt;/code&gt; 的 U 盘，使用 balenaEtcher 写入 macOS 镜像。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;打开 balenaEtcher。&lt;/li&gt;
&lt;li&gt;选择下载好的 macOS 镜像。&lt;/li&gt;
&lt;li&gt;选择目标 U 盘。&lt;/li&gt;
&lt;li&gt;点击 &lt;code&gt;Flash&lt;/code&gt;，等待出现 &lt;code&gt;Complete&lt;/code&gt;。&lt;/li&gt;
&lt;/ol&gt;&lt;/section&gt;&lt;section&gt;&lt;h3&gt;2.2 处理 EFI 文件&lt;a href=&quot;#22-处理-efi-文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h3&gt;&lt;ol&gt;
&lt;li&gt;使用 OCAT 打开 &lt;code&gt;EFI/OC/config.plist&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;取消勾选 &lt;code&gt;Nootedred.kext&lt;/code&gt;，保存配置。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;图 3：取消勾选 Nootedred.kext&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;642&quot; src=&quot;/_astro/lenovo-pro16-2021-amd-hackintosh-figure-03.vrx575vJ_ZGH9uS.webp&quot; /&gt;&lt;figcaption&gt;图 3：取消勾选 Nootedred.kext&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;打开 DiskGenius，选中 U 盘的 EFI 分区。&lt;/li&gt;
&lt;li&gt;将调整后的 EFI 文件夹完整复制进去，最终路径应类似：&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;EFI(X:)/EFI/OC&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;3. 开始安装 macOS&lt;a href=&quot;#3-开始安装-macos&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;警告&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;抹掉分区会清空目标分区数据。请确认选择的是为 macOS 单独划出的分区，不要误选 Windows 分区。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;插入启动 U 盘，开机按 &lt;code&gt;F12&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;选择 USB 启动项。&lt;/li&gt;
&lt;li&gt;在 OpenCore 菜单中选择 &lt;code&gt;Install macOS Big Sur&lt;/code&gt; 并按 &lt;code&gt;Enter&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;等待代码加载完成，进入 macOS 实用工具界面。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;图 4：OpenCore 启动菜单&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;684&quot; src=&quot;/_astro/lenovo-pro16-2021-amd-hackintosh-figure-04.Bud3wrYV_Z1JBJoc.webp&quot; /&gt;&lt;figcaption&gt;图 4：OpenCore 启动菜单&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;图 5：代码加载界面&quot; loading=&quot;lazy&quot; width=&quot;1270&quot; height=&quot;951&quot; src=&quot;/_astro/lenovo-pro16-2021-amd-hackintosh-figure-05.C7MThSAB_Al6oL.webp&quot; /&gt;&lt;figcaption&gt;图 5：代码加载界面&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;打开「磁盘工具」。&lt;/li&gt;
&lt;li&gt;选中之前划出的 macOS 分区，点击「抹掉」。&lt;/li&gt;
&lt;li&gt;格式选择 &lt;code&gt;APFS&lt;/code&gt;，完成后返回实用工具界面。&lt;/li&gt;
&lt;li&gt;选择「安装 macOS」，按提示继续安装。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;图 6：macOS 实用工具&quot; loading=&quot;lazy&quot; width=&quot;1080&quot; height=&quot;884&quot; src=&quot;/_astro/lenovo-pro16-2021-amd-hackintosh-figure-06.ChEifH-g_VNxKc.webp&quot; /&gt;&lt;figcaption&gt;图 6：macOS 实用工具&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;提示&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;安装过程中可能会重启 1 到 2 次。如果重启后回到 Windows，请再次按 &lt;code&gt;F12&lt;/code&gt; 进入 U 盘启动项，并选择 &lt;code&gt;Installer&lt;/code&gt; 继续安装。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;4. 调整 EFI 文件&lt;a href=&quot;#4-调整-efi-文件&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;完成安装后，需要调整 EFI，避免每次启动都显示冗长代码，并为本机生成独立序列号。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;打开最初未修改的 EFI 文件。&lt;/li&gt;
&lt;li&gt;使用 OCAT 打开本机适配 EFI：&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;联想小新 Pro16 2021 5600H/EFI/OC/config.plist&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;找到 &lt;code&gt;NVRAM&lt;/code&gt; 第三行，双击编辑并删除对应启动参数-v。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;去掉启动界面跑码参数&quot; loading=&quot;lazy&quot; width=&quot;2560&quot; height=&quot;1513&quot; src=&quot;/_astro/lenovo-pro16-2021-amd-hackintosh-figure-11.DKd-EKlB_Z2wmGup.webp&quot; /&gt;&lt;figcaption&gt;去掉启动界面跑码参数&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;图 7：正常开机无跑码&quot; loading=&quot;lazy&quot; width=&quot;1270&quot; height=&quot;951&quot; src=&quot;/_astro/lenovo-pro16-2021-amd-hackintosh-figure-07.BKeZVjFF_Z245Qgi.webp&quot; /&gt;&lt;figcaption&gt;图 7：正常开机无跑码&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;生成并写入本机专属序列号，避免多人共用同一套序列号。&lt;/li&gt;
&lt;li&gt;保存修改后的最终 EFI。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;图 8：OCAT 调整 序列号&quot; loading=&quot;lazy&quot; width=&quot;1266&quot; height=&quot;750&quot; src=&quot;/_astro/lenovo-pro16-2021-amd-hackintosh-figure-08.BanbKPJd_ZLkK8Q.webp&quot; /&gt;&lt;figcaption&gt;图 8：OCAT 调整 序列号&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;5. 设置 OpenCore 启动项&lt;a href=&quot;#5-设置-opencore-启动项&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;p&gt;设置完成后，就不需要每次插 U 盘进入 macOS。&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;回到 Windows。&lt;/li&gt;
&lt;li&gt;使用 DiskGenius 打开硬盘 ESP 分区。&lt;/li&gt;
&lt;li&gt;将最终 EFI 中的 &lt;code&gt;OC&lt;/code&gt; 文件夹完整复制到：&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ESP/EFI/&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;p&gt;复制后，&lt;code&gt;OC&lt;/code&gt; 应与原本的 &lt;code&gt;Microsoft&lt;/code&gt;、&lt;code&gt;Boot&lt;/code&gt; 文件夹并列。&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;图 9：硬盘 ESP 中的 OC 文件夹&quot; loading=&quot;lazy&quot; width=&quot;1266&quot; height=&quot;893&quot; src=&quot;/_astro/lenovo-pro16-2021-amd-hackintosh-figure-09.Sfb2YCzo_Z1rBuDy.webp&quot; /&gt;&lt;figcaption&gt;图 9：硬盘 ESP 中的 OC 文件夹&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;ol&gt;
&lt;li&gt;在 DiskGenius 工具栏选择「设置 UEFI BIOS 启动项」。&lt;/li&gt;
&lt;li&gt;点击「添加」，按以下路径选中 &lt;code&gt;OpenCore.efi&lt;/code&gt;：&lt;/li&gt;
&lt;/ol&gt;&lt;div&gt;&lt;figure&gt;&lt;figcaption&gt;&lt;/figcaption&gt;&lt;pre&gt;&lt;code&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;1&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span&gt;ESP/EFI/OC/OpenCore.efi&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/code&gt;&lt;/pre&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;ol&gt;
&lt;li&gt;保存启动项。&lt;/li&gt;
&lt;li&gt;将新增的 OpenCore 启动项移动到最上方，作为默认启动项。&lt;/li&gt;
&lt;/ol&gt;&lt;p&gt;&lt;/p&gt;&lt;figure&gt;&lt;img alt=&quot;图 10：添加 OpenCore UEFI 启动项&quot; loading=&quot;lazy&quot; width=&quot;1268&quot; height=&quot;905&quot; src=&quot;/_astro/lenovo-pro16-2021-amd-hackintosh-figure-10.BGRVjO78_1KauBF.webp&quot; /&gt;&lt;figcaption&gt;图 10：添加 OpenCore UEFI 启动项&lt;/figcaption&gt;&lt;/figure&gt;&lt;p&gt;&lt;/p&gt;&lt;div&gt;&lt;div&gt;&lt;div&gt;&lt;/div&gt;&lt;div&gt;建议&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;p&gt;日常默认进入 macOS；需要进入 Windows 时，开机按 &lt;code&gt;F12&lt;/code&gt; 手动选择 Windows 启动项。&lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;6. 补充注意事项&lt;a href=&quot;#6-补充注意事项&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;&lt;ol&gt;
&lt;li&gt;2021 款小新 Pro16 存在网卡限制：自带有线网卡无法驱动，不能直插网线。&lt;/li&gt;
&lt;li&gt;可通过 USB 网卡或手机 USB 网络共享上网，iPhone 通常无需额外驱动。&lt;/li&gt;
&lt;li&gt;不要在 macOS 内直接在线更新系统大版本，否则可能导致无法开机或引导失效。&lt;/li&gt;
&lt;li&gt;如需交流，可加入 QQ 群：&lt;a href=&quot;https://qm.qq.com/q/y1tjknEfcG&quot; target=&quot;_blank&quot;&gt;https://qm.qq.com/q/y1tjknEfcG&lt;/a&gt;。&lt;/li&gt;
&lt;/ol&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;7. 故障排查&lt;a href=&quot;#7-故障排查&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&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;/tr&gt;&lt;/thead&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;OpenCore 菜单一闪进入 Windows&lt;/td&gt;&lt;td&gt;开机后尽快用方向键选择 macOS 安装项，或重新检查 U 盘启动顺序&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;安装中途重启回 Windows&lt;/td&gt;&lt;td&gt;再次按 &lt;code&gt;F12&lt;/code&gt; 进入 U 盘，选择 &lt;code&gt;Installer&lt;/code&gt; 继续安装&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;找不到 OpenCore 启动项&lt;/td&gt;&lt;td&gt;检查 &lt;code&gt;ESP/EFI/OC/OpenCore.efi&lt;/code&gt; 是否存在，并重新添加 UEFI 启动项&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;macOS 无法联网&lt;/td&gt;&lt;td&gt;使用 USB 网卡或手机 USB 网络共享&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;更新后无法启动&lt;/td&gt;&lt;td&gt;不建议在线升级大版本；恢复原 EFI 或重新制作安装 U 盘排查&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;hr /&gt;&lt;/section&gt;
&lt;section&gt;&lt;h2&gt;8. 视频演示&lt;a href=&quot;#8-视频演示&quot;&gt;&lt;span&gt;#&lt;/span&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;hr /&gt;&lt;/section&gt;</content:encoded></item></channel></rss>