[{"data":1,"prerenderedAt":827},["ShallowReactive",2],{"projects-all":3,"project-\u002Fprojects\u002Fstatic-hub":771},[4,139,276,371,474,575,663],{"id":5,"title":6,"accent":7,"body":8,"category":78,"categoryLabel":79,"cover":80,"description":72,"extension":81,"featured":82,"features":83,"gallery":102,"links":103,"meta":105,"metrics":106,"navigation":82,"order":116,"path":117,"platforms":118,"related":120,"role":123,"seo":124,"slug":125,"stack":126,"status":131,"statusLabel":132,"stem":133,"summary":134,"tagline":135,"titleEn":136,"year":137,"__hash__":138},"projects\u002Fprojects\u002Fdianmo.md","点墨","orange",{"type":9,"value":10,"toc":71},"minimark",[11,15,19,26,29,53,56],[12,13,14],"h2",{"id":14},"一个学习项目",[16,17,18],"p",{},"点墨最初叫 MemTool，是一个原生内存扫描 CLI 加简易悬浮窗。后来重做成完整的悬浮窗工具：大尺寸面板、自绘数字键盘、模糊搜索、指针链、地址簿与变速，并把视觉改成和纸风格。",[16,20,21,25],{},[22,23,24],"strong",{},"使用边界","：仅用于本人拥有的离线单机游戏；不用于联机游戏、内购绕过或任何商业作弊场景。官网保留这段说明，是为了避免被误用。",[12,27,28],{"id":28},"架构",[16,30,31,32,36,37,40,41,44,45,48,49,52],{},"App 进程本身没有 root。所有内存访问都由 ",[33,34,35],"code",{},"su"," 拉起的独立 ",[33,38,39],{},"memtool-scanner"," 子进程完成：App 只负责参数、结果展示与安装。扫描器优先用 ",[33,42,43],{},"process_vm_readv\u002Fwritev","，失败回退 ",[33,46,47],{},"\u002Fproc\u002F\u003Cpid>\u002Fmem","；",[33,50,51],{},"maps"," 解析只保留可读写的匿名段。",[12,54,55],{"id":55},"视觉",[16,57,58,59,62,63,66,67,70],{},"界面用 ",[33,60,61],{},"#EFE7D6"," 纸色、",[33,64,65],{},"#241F18"," 墨色与 ",[33,68,69],{},"#B23A2E"," 朱红，四角是 L 形朱线，数字键盘自己画，字体用衬线。它不追求“酷”，而是让一个偏底层的工具看起来像一本摊开的册子。",{"title":72,"searchDepth":73,"depth":73,"links":74},"",2,[75,76,77],{"id":14,"depth":73,"text":14},{"id":28,"depth":73,"text":28},{"id":55,"depth":73,"text":55},"mobile","移动",null,"md",true,[84,87,90,93,96,99],{"title":85,"description":86},"首扫与过滤","按 Int32 \u002F Int64 \u002F Float \u002F Double 扫描，再通过变大、变小、未变、变化逐步收敛。",{"title":88,"description":89},"模糊搜索","先对内存段做快照，再按差值条件多轮过滤，适合不知道确切数值的场景。",{"title":91,"description":92},"指针链","在指定范围内查找指针，用 BFS 追到模块基址，得到可复用的地址链。",{"title":94,"description":95},"地址簿","把常用地址与备注存进本地，下次进入游戏可以直接读取或改写。",{"title":97,"description":98},"变速","调整目标进程的时间倍率，用于单机场景下的节奏测试。",{"title":100,"description":101},"和纸界面","纸、墨、朱印三色，四角朱线、衬线字体与自绘键盘，尽量不像一个“黑客工具”。",[],{"github":104},"https:\u002F\u002Fgithub.com\u002FRouarn\u002FDianMo",{},[107,110,113],{"label":108,"value":109},"数值类型","4 种",{"label":111,"value":112},"结果上限","5000 条",{"label":114,"value":115},"扫描器","1 个 CLI",3,"\u002Fprojects\u002Fdianmo",[119],"Android",[121,122],"wiredeck","lantai","设计 \u002F Android \u002F Native",{"title":6,"description":72},"dianmo",[127,128,129,130],"Kotlin","C++","libsu","Material 3","maintained","维护中","projects\u002Fdianmo","点墨是一个面向 Android 单机离线场景的内存调试工具。App 本身不持有 root，通过 libsu 拉起独立 native 扫描器，再做首扫、过滤、指针链与地址簿。","纸、墨、朱印，和一枚能读内存的悬浮窗。","DIANMO","2026","EHqWp3-AySgXtyuZr1kHEBTBgOexfK22X4QgwhtNX3w",{"id":140,"title":141,"accent":142,"body":143,"category":219,"categoryLabel":220,"cover":80,"description":72,"extension":81,"featured":82,"features":221,"gallery":240,"links":241,"meta":242,"metrics":243,"navigation":82,"order":253,"path":254,"platforms":255,"related":258,"role":260,"seo":261,"slug":122,"stack":262,"status":269,"statusLabel":132,"stem":270,"summary":271,"tagline":272,"titleEn":273,"year":274,"__hash__":275},"projects\u002Fprojects\u002Flantai.md","兰台","blue",{"type":9,"value":144,"toc":214},[145,148,155,166,169,208,211],[12,146,147],{"id":147},"为什么做兰台",[16,149,150,151,154],{},"大多数“全栈模板”把前后端放在两个仓库里：类型各写一份、请求层各封一套、部署要维护 Node 与 Go 两套运行时。兰台反过来做——",[22,152,153],{},"一个仓库、一个二进制、一份配置","，把多端交付的固定成本压到最低。",[16,156,157,158,161,162,165],{},"后端是 GoFrame 主服务与独立的更新分发服务；前台包括 Element Plus 管理端、Naive UI 云阁 Web、uni-app 移动端。三端构建产物先组装到 ",[33,159,160],{},"resource\u002Fpublic","，再由 ",[33,163,164],{},"gf build --ps"," 嵌入二进制。改动前端需要重新构建，这是单文件交付的代价，也是它最简单的地方。",[12,167,168],{"id":168},"几个关键取舍",[170,171,172,187,193,199],"ul",{},[173,174,175,178,179,182,183,186],"li",{},[22,176,177],{},"双域 JWT 隔离","：",[33,180,181],{},"\u002Fapi\u002Fv1\u002Fadmin\u002F*"," 与 ",[33,184,185],{},"\u002Fapi\u002Fv1\u002Fapp\u002F*"," 使用不同的受众，管理端令牌不能打业务接口。",[173,188,189,192],{},[22,190,191],{},"goose 迁移而不是自动同步","：生产 DDL 必须可审计、可回滚；开发期才允许自动同步。",[173,194,195,198],{},[22,196,197],{},"更新服务独立部署","：APK 下载是长带宽、发布节奏独立，拆开后不影响业务 API。",[173,200,201,204,205,207],{},[22,202,203],{},"内嵌资源优先","：改了 ",[33,206,160],{}," 却没有重新构建，运行时会继续读旧资源——这是最容易踩的坑之一。",[12,209,210],{"id":210},"现状",[16,212,213],{},"兰台仍在持续迭代，主要精力放在移动端更新链路、权限模型与部署体验上。它是一个内部平台型项目，演示与接入需要单独沟通。",{"title":72,"searchDepth":73,"depth":73,"links":215},[216,217,218],{"id":147,"depth":73,"text":147},{"id":168,"depth":73,"text":168},{"id":210,"depth":73,"text":210},"platform","平台",[222,225,228,231,234,237],{"title":223,"description":224},"单仓多端","后端、管理端、云阁 Web 与移动端放在同一个仓库，共享类型、请求层与构建约定。",{"title":226,"description":227},"双域认证","管理端与业务端使用独立的 JWT 受众，令牌不能跨域使用，避免权限越界。",{"title":229,"description":230},"三段式权限","用“域:资源:操作”描述权限点，在线授权后实时生效，不需要重新登录。",{"title":232,"description":233},"独立更新分发","APK 与 wgt 的检测、灰度、签名下载与事件回收拆成独立服务，不占用业务 API。",{"title":235,"description":236},"可观测性","结构化日志、Prometheus 指标、操作审计与按日滚动日志，排障时能还原链路。",{"title":238,"description":239},"单文件部署","三端静态产物嵌入 Go 二进制，生产环境只需要二进制与一份配置文件。",[],{},{},[244,247,250],{"label":245,"value":246},"前台形态","3 端",{"label":248,"value":249},"交付物","1 个二进制",{"label":251,"value":252},"服务拆分","2 个服务",1,"\u002Fprojects\u002Flantai",[256,119,257],"Web","iOS",[259,121],"static-hub","架构 \u002F 全栈 \u002F 设计",{"title":141,"description":72},[263,264,265,266,267,268],"Go","GoFrame","Vue 3","uni-app","MySQL","Redis","active","projects\u002Flantai","兰台是 VaKao 的全栈单仓实践：GoFrame 主服务、独立更新分发、管理端、云阁 Web 与 uni-app 移动端。三端产物嵌入二进制，部署只需要一个文件与一份配置。","一套后端，三端前台，单文件交付。","LANTAI \u002F VAKAO PLATFORM","持续迭代","10rJAjyqG8ajsErfdpcTRKKfLzH8UFSu2x2k0OuyNa8",{"id":277,"title":278,"accent":279,"body":280,"category":317,"categoryLabel":318,"cover":80,"description":72,"extension":81,"featured":319,"features":320,"gallery":336,"links":337,"meta":339,"metrics":340,"navigation":82,"order":350,"path":351,"platforms":352,"related":354,"role":357,"seo":358,"slug":359,"stack":360,"status":131,"statusLabel":364,"stem":365,"summary":366,"tagline":367,"titleEn":368,"year":369,"__hash__":370},"projects\u002Fprojects\u002Frequest-interceptor.md","请求拦截与调试器","purple",{"type":9,"value":281,"toc":313},[282,286,289,299,302],[12,283,285],{"id":284},"为什么不用-devtools","为什么不用 DevTools",[16,287,288],{},"Chrome DevTools 已经能看请求，但“改一个响应再刷新”并不顺手：要么用本地代理，要么在代码里加断点。这个扩展把常用动作放进侧边栏：捕获、过滤、Mock、改包、重定向，规则可以保存和导入。",[16,290,291,292,182,295,298],{},"实现方式是在页面上下文里 Monkey Patch ",[33,293,294],{},"fetch",[33,296,297],{},"XMLHttpRequest","，扩展侧边栏通过消息通道读取记录。所有数据留在本地，不上传服务器。",[12,300,301],{"id":301},"边界",[170,303,304,307,310],{},[173,305,306],{},"只处理页面 JS 发起的请求，Service Worker、WebSocket 与部分跨域场景需要单独处理。",[173,308,309],{},"改包可能破坏签名或业务校验，规则默认关闭，命中时在列表里明确标记。",[173,311,312],{},"仅用于自己有权调试的页面与接口。",{"title":72,"searchDepth":73,"depth":73,"links":314},[315,316],{"id":284,"depth":73,"text":285},{"id":301,"depth":73,"text":301},"extension","扩展",false,[321,324,327,330,333],{"title":322,"description":323},"请求捕获","在页面上下文里替换 fetch 与 XMLHttpRequest，记录请求、响应与耗时。",{"title":325,"description":326},"过滤与搜索","按 URL、方法、状态码筛选，长列表里快速定位目标请求。",{"title":328,"description":329},"Mock 与改包","命中规则时直接返回本地响应，或修改请求头、请求体后再放行。",{"title":331,"description":332},"重定向","把请求转发到另一个地址，用于本地联调与环境切换。",{"title":334,"description":335},"规则导入导出","规则以 JSON 保存，可以在团队之间共享，也可以纳入版本管理。",[],{"github":338},"https:\u002F\u002Fgithub.com\u002FRouarn\u002FRequestInterceptorDebugger",{},[341,344,347],{"label":342,"value":343},"捕获对象","fetch \u002F XHR",{"label":345,"value":346},"规则能力","Mock \u002F 改包 \u002F 重定向",{"label":348,"value":349},"数据位置","本地",6,"\u002Fprojects\u002Frequest-interceptor",[353],"Chrome",[355,356],"video-speed","vakao-ui","扩展开发",{"title":278,"description":72},"request-interceptor",[361,362,363],"Manifest V3","Monkey Patch","JavaScript","可用","projects\u002Frequest-interceptor","一个 Manifest V3 侧边栏扩展：Monkey Patch 页面 fetch\u002FXHR，做请求捕获、过滤、Mock、改包、重定向与规则导入导出。","在侧边栏里看清、改掉、重放每一个请求。","REQUEST INTERCEPTOR","持续维护","UAK4oMg2N9SKZRk9sicTkKSfVxQ8WmAio502kwhFSxU",{"id":372,"title":373,"accent":279,"body":374,"category":219,"categoryLabel":424,"cover":80,"description":72,"extension":81,"featured":82,"features":425,"gallery":444,"links":445,"meta":447,"metrics":448,"navigation":82,"order":73,"path":458,"platforms":459,"related":461,"role":462,"seo":463,"slug":259,"stack":464,"status":269,"statusLabel":364,"stem":469,"summary":470,"tagline":471,"titleEn":472,"year":274,"__hash__":473},"projects\u002Fprojects\u002Fstatic-hub.md","静态资源中心",{"type":9,"value":375,"toc":419},[376,379,382,385,388,414,416],[12,377,378],{"id":378},"它解决什么问题",[16,380,381],{},"小团队经常把图片、APK、安装包、临时文件散落在服务器目录、网盘和聊天记录里。静态资源中心把这些东西收进一个可检索的控制台：文件有分类、有缩略图、有分享链接，App 更新包也有独立的发布状态。",[16,383,384],{},"后端是 NestJS + SQLite，前端是 Vue 3 + Naive UI。SQLite 的选择很务实：单机静态资源站，零外部依赖，拷一个库文件就能备份；代价是并发写和大数据量受限。",[12,386,387],{"id":387},"值得说的细节",[170,389,390,396,402,408],{},[173,391,392,395],{},[22,393,394],{},"文件系统是真相，数据库是索引","：启动全量扫描、定时增量、根目录变更触发刷新，避免“库里有、盘上没有”。",[173,397,398,401],{},[22,399,400],{},"分片上传 + SHA-256 合并校验","：APK 与视频动辄数百 MB，整包上传容易断；分片让失败只影响一个块。",[173,403,404,407],{},[22,405,406],{},"分享用 HMAC 短期令牌","：链接本身不暴露真实路径，密码不落明文。",[173,409,410,413],{},[22,411,412],{},"更新中心是独立模块","：与兰台的更新服务功能重叠，长期需要收敛；当前保留两套实现是历史包袱。",[12,415,210],{"id":210},[16,417,418],{},"作为内部工具持续使用中。后台涉及真实文件与账号信息，官网只展示结构与能力，不公开管理入口。",{"title":72,"searchDepth":73,"depth":73,"links":420},[421,422,423],{"id":378,"depth":73,"text":378},{"id":387,"depth":73,"text":387},{"id":210,"depth":73,"text":210},"工具",[426,429,432,435,438,441],{"title":427,"description":428},"多根目录","一个后台管理多个资源根目录，按分类浏览、搜索、排序，文件系统仍是最终事实。",{"title":430,"description":431},"分片上传","大文件切 5MB 分片，支持断点续传与合并校验，弱网下不用整包重来。",{"title":433,"description":434},"分享链接","单文件或多文件聚合分享，支持有效期、访问次数与访问密码，链接不暴露真实路径。",{"title":436,"description":437},"图片处理","基于 Sharp 的缩放、格式转换与磁盘缩略图缓存，避免每次请求都重新解码。",{"title":439,"description":440},"更新中心","APK 上传、四态发布、灰度分桶、强更与回滚，客户端按设备稳定命中。",{"title":442,"description":443},"审计与指标","登录、上传、删除、发布、分享等关键动作落审计日志，指标页看 QPS 与存储量。",[],{"github":446},"https:\u002F\u002Fgithub.com\u002FRouarn\u002FVakaoStaticHub",{},[449,452,455],{"label":450,"value":451},"上传方式","5MB 分片",{"label":453,"value":454},"内容校验","SHA-256",{"label":456,"value":457},"更新状态","4 态","\u002Fprojects\u002Fstatic-hub",[256,460],"API",[122,356],"全栈 \u002F 运维",{"title":373,"description":72},[465,466,265,467,468],"NestJS","SQLite","Sharp","TypeScript","projects\u002Fstatic-hub","一个面向小团队的静态资源管理系统：多根目录文件管理、分片上传、图片处理、分享链接、随机图与占位图，以及 App 在线更新中心。","把文件、分享与更新包放进一个可检索的控制台。","VAKAO STATIC HUB","hCHHdJuV2ZAilDYjYjGkjP4xf7FnQHtvmREG9x3UGQM",{"id":475,"title":476,"accent":142,"body":477,"category":534,"categoryLabel":535,"cover":80,"description":72,"extension":81,"featured":319,"features":536,"gallery":545,"links":546,"meta":548,"metrics":549,"navigation":82,"order":559,"path":560,"platforms":561,"related":563,"role":564,"seo":565,"slug":356,"stack":566,"status":269,"statusLabel":132,"stem":570,"summary":571,"tagline":572,"titleEn":573,"year":369,"__hash__":574},"projects\u002Fprojects\u002Fvakao-ui.md","VaKao UI",{"type":9,"value":478,"toc":530},[479,482,489,525,527],[12,480,481],{"id":481},"为什么自己写",[16,483,484,485,488],{},"团队项目多了之后，每个仓库都会复制一份 axios 封装：有的处理 401，有的不处理；有的解信封，有的不解。",[33,486,487],{},"@vakao-ui\u002F*"," 把这些约定收进三个小包，项目只依赖接口，不依赖实现细节。",[170,490,491,502,510,518],{},[173,492,493,178,498,501],{},[22,494,495],{},[33,496,497],{},"@vakao-ui\u002Faxios",[33,499,500],{},"createClient"," 一次性配置 baseURL、超时、鉴权头、刷新与错误出口；401 只刷新一次，失败的请求排队重放。",[173,503,504,509],{},[22,505,506],{},[33,507,508],{},"@vakao-ui\u002Fsocket-system","：把连接、重连、房间恢复、消息编解码与错误处理收进一个无框架的客户端，测试用假传输与虚拟时钟。",[173,511,512,517],{},[22,513,514],{},[33,515,516],{},"@vakao-ui\u002Fscripts-utils","：统一终端颜色、图标、横幅与日志，让不同项目的构建输出看起来像一家人。",[173,519,520,524],{},[22,521,522],{},[33,523,356],{},"：Vue 3 + TypeScript 组件库，承接团队页面里反复出现的交互与视觉约定。",[12,526,210],{"id":210},[16,528,529],{},"内部使用为主，API 仍在收敛。它们不追求成为通用框架，只解决 VaKao 项目里反复出现的那几个问题。",{"title":72,"searchDepth":73,"depth":73,"links":531},[532,533],{"id":481,"depth":73,"text":481},{"id":210,"depth":73,"text":210},"library","开源库",[537,539,542],{"title":500,"description":538},"统一信封解包、401 单飞刷新、重复请求取消与全局 loading 计数。",{"title":540,"description":541},"类型安全 Socket","连接管理、自动重连、房间恢复、标准化消息与统一错误出口。",{"title":543,"description":544},"脚本工具","终端颜色、图标、ASCII 横幅、日志与常用工具函数，供各项目构建脚本复用。",[],{"github":547},"https:\u002F\u002Fgithub.com\u002FRouarn\u002FVakaoUI",{},[550,553,556],{"label":551,"value":552},"包数量","4 个",{"label":554,"value":555},"请求层","0.0.2",{"label":557,"value":558},"框架绑定","无",7,"\u002Fprojects\u002Fvakao-ui",[256,562],"Node",[122,259],"库设计与维护",{"title":476,"description":72},[468,567,568,569],"axios","Socket.IO","CLI","projects\u002Fvakao-ui","团队内部的前端基础设施：@vakao-ui\u002Faxios 统一请求与 401 刷新，@vakao-ui\u002Fsocket-system 提供类型安全的 Socket 协议，@vakao-ui\u002Fscripts-utils 收敛构建脚本的终端输出，vakao-ui 提供 Vue 3 组件。","四个小库，把团队项目里重复的脏活收掉。","VAKAO UI \u002F INTERNAL LIBS","hH3E7BtjcZOGcjZQp2rWdVHUw7oMuii_1uCGoIAYZT8",{"id":576,"title":577,"accent":142,"body":578,"category":317,"categoryLabel":318,"cover":80,"description":72,"extension":81,"featured":319,"features":624,"gallery":637,"links":638,"meta":640,"metrics":641,"navigation":82,"order":650,"path":651,"platforms":652,"related":654,"role":357,"seo":655,"slug":355,"stack":656,"status":131,"statusLabel":364,"stem":658,"summary":659,"tagline":660,"titleEn":661,"year":369,"__hash__":662},"projects\u002Fprojects\u002Fvideo-speed.md","视频速度控制器",{"type":9,"value":579,"toc":620},[580,583,586,593,596],[12,581,582],{"id":582},"一个小而完整的扩展",[16,584,585],{},"视频网站大多有倍速菜单，但操作路径长：点开菜单、选倍速、再关掉。这个扩展把最常用的动作变成键盘：Z 减速、X 加速、C 复位，数字键直接输入目标倍速。",[16,587,588,589,592],{},"实现上是 Manifest V3 + 内容脚本，监听页面里的 HTML5 ",[33,590,591],{},"\u003Cvideo>","，不依赖任何后端。全屏时用一个轻量浮层提示当前倍速，几秒后自动消失。",[12,594,595],{"id":595},"设计取舍",[170,597,598,608,614],{},[173,599,600,603,604,607],{},[22,601,602],{},"不做站点适配清单","：优先操作标准 ",[33,605,606],{},"video"," 元素，站点自定义播放器需要单独处理。",[173,609,610,613],{},[22,611,612],{},"不接管所有键盘","：只在视频获得焦点或用户主动触发时响应，避免和站点快捷键打架。",[173,615,616,619],{},[22,617,618],{},"权限最小化","：只申请必要的站点访问权限，不读取页面内容上传。",{"title":72,"searchDepth":73,"depth":73,"links":621},[622,623],{"id":582,"depth":73,"text":582},{"id":595,"depth":73,"text":595},[625,628,631,634],{"title":626,"description":627},"快捷键","Z 减速、X 加速、C 复位，不离开画面就能调。",{"title":629,"description":630},"数字直输","直接键入倍速数字，适合需要精确 1.25× \u002F 1.75× 的场景。",{"title":632,"description":633},"预设面板","弹窗里提供常用倍速，点一下即可应用。",{"title":635,"description":636},"全屏浮层","全屏时在角落短暂显示当前倍速，不打断观看。",[],{"github":639},"https:\u002F\u002Fgithub.com\u002FRouarn\u002FVideoSpeedControl",{},[642,645,648],{"label":643,"value":644},"核心操作","键盘优先",{"label":646,"value":647},"覆盖范围","HTML5 视频",{"label":649,"value":558},"后端",5,"\u002Fprojects\u002Fvideo-speed",[353,653],"Edge",[359,356],{"title":577,"description":72},[361,363,657],"HTML\u002FCSS","projects\u002Fvideo-speed","一个 Manifest V3 浏览器扩展：Z \u002F X \u002F C 快捷键、数字直输、预设面板与全屏浮层提示，把视频倍速从菜单里解放出来。","给全网 HTML5 视频一个统一的倍速键盘。","VIDEO SPEED CONTROL","ZUuBRWNBJ1-Yfv2K5Mq5dK0N7yqthk4COJdIXLQtKjI",{"id":664,"title":665,"accent":666,"body":667,"category":717,"categoryLabel":718,"cover":80,"description":72,"extension":81,"featured":82,"features":719,"gallery":738,"links":739,"meta":743,"metrics":744,"navigation":82,"order":753,"path":754,"platforms":755,"related":758,"role":759,"seo":760,"slug":121,"stack":761,"status":764,"statusLabel":765,"stem":766,"summary":767,"tagline":768,"titleEn":769,"year":137,"__hash__":770},"projects\u002Fprojects\u002Fwiredeck.md","WireDeck","yellow",{"type":9,"value":668,"toc":712},[669,673,680,683,686,707,709],[12,670,672],{"id":671},"为什么做-wiredeck","为什么做 WireDeck",[16,674,675,676,679],{},"Android 自带的“无线调试”很好用，但门槛不低：找 IP、记端口、输入配对码，再敲一堆 ",[33,677,678],{},"adb"," 命令。WireDeck 把这些步骤收进一个窗口：扫码连接，然后安装、卸载、传文件、看日志都不需要命令行。",[16,681,682],{},"技术上是 Wails v2 + Go + Vue 3：Go 负责 adb、进程、文件与 scrcpy 编排，Vue 负责界面。选择 Wails 而不是 Electron，是为了更小的包体和更直接的系统调用；代价是跨平台细节要自己填。",[12,684,685],{"id":685},"两个真实的坑",[170,687,688,698],{},[173,689,690,693,694,697],{},[22,691,692],{},"Windows 子进程必须隐藏窗口","：GUI 程序调用 adb 会反复弹 CMD，所有子进程都要加 ",[33,695,696],{},"HideWindow + CREATE_NO_WINDOW","。",[173,699,700,706],{},[22,701,702,705],{},[33,703,704],{},"\u002Freleases\u002Flatest"," 会忽略 prerelease","：下载链接使用显式 tag，避免 404。",[12,708,210],{"id":210},[16,710,711],{},"v1.0.1 已发布，目前进入维护暂停；有问题提交 Issue，看到后会恢复维护。macOS 为 ad-hoc 签名、未公证，首次打开需要右键 → 打开。",{"title":72,"searchDepth":73,"depth":73,"links":713},[714,715,716],{"id":671,"depth":73,"text":672},{"id":685,"depth":73,"text":685},{"id":210,"depth":73,"text":210},"desktop","桌面",[720,723,726,729,732,735],{"title":721,"description":722},"扫码配对","手机扫一下电脑上的二维码就能连上，也可以手动输入配对码。",{"title":724,"description":725},"应用管理","应用列表、卸载、启动、强停、清数据、导出 APK，文件名优先中文名。",{"title":727,"description":728},"文件传输","双栏管理、拖放添加、批量推送与拉取，截图可以直接保存到电脑。",{"title":730,"description":731},"日志与 Shell","按应用过滤 logcat，自动识别崩溃与 ANR；常用命令有快捷入口。",{"title":733,"description":734},"投屏控制","内置 scrcpy，一键在电脑上操作手机，窗口标题带设备名。",{"title":736,"description":737},"开箱即用","不要求安装 Android Studio；adb、aapt2、scrcpy 都随应用打包。",[],{"site":740,"github":741,"download":742},"https:\u002F\u002Fwiredeck.woyuxiaji.cn","https:\u002F\u002Fgithub.com\u002FRouarn\u002FWireDeck","https:\u002F\u002Fgithub.com\u002FRouarn\u002FWireDeck\u002Freleases",{},[745,748,750],{"label":746,"value":747},"正式版","v1.0.1",{"label":220,"value":749},"macOS \u002F Windows",{"label":751,"value":752},"内置工具","adb \u002F aapt2 \u002F scrcpy",4,"\u002Fprojects\u002Fwiredeck",[756,757],"macOS","Windows",[125,259],"产品 \u002F 桌面端 \u002F 发布",{"title":665,"description":72},[762,263,265,678,763],"Wails","scrcpy","paused","维护暂停","projects\u002Fwiredeck","一个把无线 ADB 包进图形界面的桌面工具：扫码配对、应用管理、APK 安装、文件传输、实时日志与 Shell。内置 adb、aapt2 与 scrcpy，不需要 Android SDK。","在电脑上无线管理安卓手机，开箱即用。","WIREDECK","svPInLxMWRhKtFjfqUXvUBMnCBZy9Nx9MnJkAZX-MLk",{"id":372,"title":373,"accent":279,"body":772,"category":219,"categoryLabel":424,"cover":80,"description":72,"extension":81,"featured":82,"features":809,"gallery":816,"links":817,"meta":818,"metrics":819,"navigation":82,"order":73,"path":458,"platforms":823,"related":824,"role":462,"seo":825,"slug":259,"stack":826,"status":269,"statusLabel":364,"stem":469,"summary":470,"tagline":471,"titleEn":472,"year":274,"__hash__":473},{"type":9,"value":773,"toc":804},[774,776,778,780,782,800,802],[12,775,378],{"id":378},[16,777,381],{},[16,779,384],{},[12,781,387],{"id":387},[170,783,784,788,792,796],{},[173,785,786,395],{},[22,787,394],{},[173,789,790,401],{},[22,791,400],{},[173,793,794,407],{},[22,795,406],{},[173,797,798,413],{},[22,799,412],{},[12,801,210],{"id":210},[16,803,418],{},{"title":72,"searchDepth":73,"depth":73,"links":805},[806,807,808],{"id":378,"depth":73,"text":378},{"id":387,"depth":73,"text":387},{"id":210,"depth":73,"text":210},[810,811,812,813,814,815],{"title":427,"description":428},{"title":430,"description":431},{"title":433,"description":434},{"title":436,"description":437},{"title":439,"description":440},{"title":442,"description":443},[],{"github":446},{},[820,821,822],{"label":450,"value":451},{"label":453,"value":454},{"label":456,"value":457},[256,460],[122,356],{"title":373,"description":72},[465,466,265,467,468],1793534192156]