ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

Flutter MCP服务端鸿蒙化实战:从协议适配到工业级部署

Flutter MCP服务端鸿蒙化实战:从协议适配到工业级部署 2025年还在折腾AI Agent的朋友应该都绕不开MCP这个协议。Model Context Protocol模型上下文协议说白了就是给大模型配了一套标准化的外设接口。而我这段时间在做的一件很硬核的事就是把pub.dev上的Flutter三方库mcp_server适配到鸿蒙系统上让鸿蒙设备直接变成一个工业级AI插件服务端——通过WSS通信给PC上的AI客户端提供设备侧能力。整个过程踩坑不少但也把Flutter鸿蒙化、MCP协议栈、平台通道适配这三条线彻底捋清了今天这篇把完整过程和方案写透给同样在琢磨Flutter鸿蒙适配、MCP服务端落地的朋友做个参考。如果你手头有一台鸿蒙手机或平板电脑上又跑着Claude Desktop、Cline这类AI工具你大概率想过一个问题怎么让AI直接读到手机里的电量、位置、传感器数据甚至帮你操作设备常规做法是让PC端Agent自己去接云服务但这样拿不到设备侧的实时上下文。我的解法是把MCP Server直接跑在鸿蒙设备上让设备成为AI Agent的感官和手脚。这篇文章不聊理论全部是实操包括环境配置、代码实现、权限处理、稳定性和性能调优每一段都是我本地跑通后整理出来的。1. MCP与mcp_server库先搞懂这套AI外设协议再动手1.1 MCP协议本质上是给大模型造的USB-C口很多朋友第一次接触MCP容易被它的文档绕晕什么Client、Server、Tool、Resource、Prompt一堆术语。我用一个生活化的类比讲清楚想象你的AI模型是一台笔记本电脑它很聪明但只有一个USB-C接口。你让它读文件、查天气、操作浏览器、访问数据库如果每个功能都专门做一根线接到电脑上那AI项目光接线就累死。MCP就是这个USB-C标准所有工具、数据源、服务都按统一协议做成外设插上就能用。在MCP体系里有几个关键角色我需要先区分开Host承载AI应用的宿主环境比如你电脑上的Claude Desktop、IDE插件它负责和用户交互同时管理多个MCP连接。Client内嵌在Host里的协议客户端负责与Server建立连接、发送请求、接收响应对用户透明。Server独立的服务进程注册并暴露工具tools、资源resources、提示词prompts给AI调用。这就是我们今天的主角。Transport传输层负责消息的载体支持stdio、HTTPSSE、WebSocket等。MCP协议的消息格式基于JSON-RPC 2.0。核心流程极其简洁Client先发initialize做能力协商双方确定协议版本和能力范围然后Client通过tools/list拿到Server暴露的工具清单AI决定调用某个工具时Client发tools/call请求并带上参数Server执行后返回结构化结果。整个过程是标准的请求-响应模型HTTP朋友上手会感觉非常亲切。1.2 mcp_server库的项目结构为什么用Flutter写服务端传统认知里MCP Server一般是Node.js或Python写的因为在服务端进程里跑、依赖stdio很自然。但mcp_server这个Flutter三方库选择了不同的路线用Dart把MCP协议的服务端完整实现让你能在任何支持Flutter的平台上跑起来。这有几个实打实的优势第一Dart是AOT编译的启动速度快、内存占用可控适合跑在移动设备这种资源受限的环境。第二Flutter本身跨平台同一套MCP服务端代码Android、iOS、鸿蒙、桌面端都能编译运行不用每个端单独写一套协议栈。第三Dart的async/await和Stream模型处理高并发网络请求非常顺手和MCP这种异步工具调用场景天然契合。mcp_server库在架构上通常分三层。协议层负责JSON-RPC 2.0消息的编解码、initialize握手、错误码映射服务管理层负责工具注册、资源管理、请求路由传输层负责与具体通信方式解耦支持stdio、WebSocket等Transport接口。这个设计有一个关键好处鸿蒙化适配时只要保证传输层能跑通Dart层的协议逻辑完全不用改。回头看标题里强调的上下文通信引擎我的理解是MCP Server不只是转发工具调用它还承担着上下文管理职责。比如AI需要持续读取设备传感器流、日志、消息通知这些不是一次性的问答式工具调用而是持续性的数据通道。mcp_server库如果支持resources订阅和事件推送就真正够格叫上下文通信引擎。2. 鸿蒙化适配方案选型先分清Next与Android的差异再决定怎么动手2.1 鸿蒙Next和Android的不兼容决定了适配不是简单重编译我遇到过不少团队以为鸿蒙适配就是把Flutter项目拿过来换个构建目标编译一遍。这个想法在鸿蒙Next之前勉强成立但现在的鸿蒙Next已经不再支持直接运行Android APK底层API也从Linux内核加Java虚拟机变成了鸿蒙微内核加ArkTS运行时。这意味着Flutter项目里依赖的原生代码比如通过MethodChannel调的Android SDK接口在鸿蒙上全部失效。Flutter框架本身提供了鸿蒙支持。OpenHarmony社区维护着一个Flutter的Fork版本通常叫flutter_flutter它把Flutter引擎适配到了鸿蒙的ArkUI和系统能力上。用这套SDK你可以执行flutter create生成带ohos目录的工程flutter build hap构建鸿蒙安装包。但要注意这个Fork不是Google官方的版本节奏、API细节都跟官方Flutter有差异。我后面会专门讲版本匹配的坑。鸿蒙化这个词我理解至少包含四个层面。一是工程层面项目要能通过hvigor构建出HAP包而不是APK二是插件层面项目依赖的所有Flutter插件都要有ohos平台的原生实现三是系统权限层面需要在module.json5里声明鸿蒙权限而不是AndroidManifest四是运行行为层面鸿蒙对后台任务、网络长连接、隐私权限的限制和Android完全不同MCP这种需要常驻服务的应用首当其冲。2.2 传输层选型移动端没有stdioWebSocket是唯一合理选择MCP官方传输层配置里stdio是最常见的方式。服务端进程启动后Client直接通过标准输入输出流与Server交互。这种模式在PC上完美但在鸿蒙设备上有一个根本性障碍鸿蒙应用的生命周期被Ability机制管理UIAbility、ServiceAbility都不是传统命令行进程你根本没有一个可以挂载stdin/stdout的进程环境。就算勉强起一个后台Service标准输入输出流也不存在。所以在鸿蒙设备上跑MCP Server必须走网络传输。我梳理了三种可行方案传输方式可行性适用场景实现的复杂程度HTTPSSE高请求-响应为主适合边缘MCP中等需要处理SSE长连接WebSocket极高双向通信、事件推送、工具调用混合低dart:io原生支持自定义TCP/QUIC中对延迟极度敏感的自研场景高需要自己处理协议帧综合评估下来WebSocket是在鸿蒙上最务实的方案。它天然支持双向通信AI客户端可以通过同一个连接同时发送工具调用请求也可以接收服务端推送的事件流恰好契合MCP的请求-响应加资源订阅混合模型。而且Dart标准库dart:io的HttpServer配合WebSocketTransformer就能实现服务端不需要额外引入重量级依赖。一个重要的经验是如果你的设备无法直接暴露端口比如处于移动网络、公司NAT环境就需要一个云端代理中转。鸿蒙设备作为WebSocket客户端主动连接到云端代理PC端AI作为另一个客户端也连上来代理负责双向转发。这种云端代理模式在真实部署中非常常见后面我把两种模式的代码都贴出来。2.3 平台通道鸿蒙化的通用思路Dart层不动ArkTS层重写Flutter插件跨平台的通用结构是Dart层定义统一接口各个平台用原生代码实现同一个MethodChannel/EventChannel。鸿蒙化适配的最大工作量就在原生实现这一层——要为每一套方法调用写一个ArkTS实现。这其实是一条已经有人趟过的路。社区里有人整理过Flutter平台插件okta适配鸿蒙的完整流程思路完全可以迁移到mcp_server上。核心方法论就一句话把Dart层当作协议规范把鸿蒙底层当作另一个待实现的平台后端。所有通过MethodChannel调用的原生方法在鸿蒙侧用ohos提供的API逐个实现所有需要原生主动推送的事件用EventChannel的StreamHandler在ArkTS里注册。Dart代码不需要动因为Dart层只知道平台通道这个抽象不在乎底下连着的是Android SDK还是鸿蒙API。这给我们的启示是mcp_server做鸿蒙化第一步不是改Dart代码而是盘点它用到了多少平台原生能力。我这边调研下来mcp_server核心的协议逻辑是纯Dart实现的理论上不碰平台通道。真正需要鸿蒙化的是你想给AI暴露的那些设备能力获取电量、读取传感器、访问文件、执行系统命令这些必须通过MethodChannel桥接到鸿蒙API。3. 从零到一跑通mcp_server鸿蒙化完整实操记录3.1 环境准备DevEco Studio与Flutter OHOS SDK的正确配对方式工具链对了整个流程能省一半时间。先说结论我的环境是DevEco Studio 5.0.0、HarmonyOS SDK API 12、OpenHarmony的Flutter SDKflutter_flutter的ohos-stable分支。这不是随便选的版本我踩过API 15和旧版Flutter SDK不兼容的坑后面会展开讲。操作步骤具体如下从Gitee的OpenHarmony仓库clone Flutter SDK。注意不要clone官方Flutter是OpenHarmony-sig/flutter_flutter这个仓库并切换到ohos-stable分支。执行flutter doctor确认Dart和Flutter环境正常。这里有个小提示鸿蒙Flutter SDK的Dart版本比官方Flutter通常要滞后几个版本如果你本机装了官方Flutter记得把PATH指向鸿蒙SDK的bin目录。安装DevEco Studio配置鸿蒙SDK路径。DevEco Studio自带SDK管理确保能创建HarmonyOS工程就行。用鸿蒙Flutter SDK执行flutter create --platforms ohos your_project_name生成带ohos原生目录的Flutter工程。有两点我想特别提醒。第一hygrove构建工具是鸿蒙工程的构建核心它读取的是build-profile.json5和hvigorfile.ts不是Android的gradle脚本不熟的人会懵建议提前看一眼官方文档。第二鸿蒙Flutter工程的ohos目录和现有Android/iOS目录是平级的也就是说这个项目同时保留android、ios、ohos三个平台目录三套构建体系互不干扰。3.2 工程初始化与依赖配置如何引入mcp_server和鸿蒙插件创建好工程后打开pubspec.yaml在dependencies里加上mcp_server依赖。我这边用的版本是基于Dart 3.x构建的如果你的项目还停留在Dart 2.x需要先升级Dart版本。顺带把需要的鸿蒙插件也加进去比如web_socket_channel用于WebSocket通信。注意这些插件在pub.dev上不一定有官方鸿蒙支持需要找社区维护的fork或者自己写ohos实现。还有一个细节mcp_server可能依赖dart:io的某些能力。我在Flutter鸿蒙SDK上跑的时候dart:io的基础能力Socket、HttpClient、File都是可用的这是鸿蒙Flutter引擎做了兼容的结果。但某些高级API比如Process进程管理、ServerSocket监听端口就需要逐个验证。确认依赖就绪后简单写一个MCP服务端初始化代码import package:mcp_server/mcp_server.dart; Futurevoid main() async { final server McpServer( serverInfo: ServerInfo( name: harmony_device_bridge, version: 1.0.0, ), transport: WebSocketTransport( port: 9443, path: /mcp, tls: true, ), ); // 注册工具这里只是一个示例具体以你用的库API为准 server.registerTool( ToolSpec( name: device_battery_level, description: 获取鸿蒙设备当前电池电量百分比, inputSchema: const { type: object, properties: {}, }, ), (arguments) async { final level await BatteryChannel.getLevel(); return McpToolResult.text(当前电池电量$level%); }, ); await server.start(); print(MCP Server started on wss://0.0.0.0:9443/mcp); }这里我想强调不同版本的mcp_server库API命名可能略有差异运行时以你pubspec.lock锁定的版本为准。上面这段代码的核心意义是展示了MCP服务端的三要素ServerInfo定义服务身份、ToolSpec定义工具协议、Transport定义通信方式。3.3 注册一个设备工具从定义ToolSpec到实现MethodChannel现在最关键的部分来了怎么让MCP Server真正拿到鸿蒙系统的数据。以获取电池电量为例全部链路是AI客户端发tools/call请求 → mcp_server的Dart层解析JSON-RPC消息 → 回调函数执行 → 通过MethodChannel通知鸿蒙原生层 → ArkTS调用鸿蒙系统API获取电量 → 结果逐层返回。MethodChannel的定义Dart侧代码import package:flutter/services.dart; class BatteryChannel { static const MethodChannel _channel MethodChannel(harmony_device_bridge/methods); static Futureint getLevel() async { final int? level await _channel.invokeMethod(device_battery_level); return level ?? -1; } }鸿蒙原生侧的ArkTS代码这是真正鸿蒙化的核心// ArkTS侧以FlutterPlugin的方式注册 import { FlutterPlugin, MethodChannel } from ohos/flutter_ohos/FlutterPlugin; import { battery } from kit.BatteryInfoKit; export class DeviceBridgePlugin extends FlutterPlugin { private channel: MethodChannel | null null; onAttachedToEngine(binding: FlutterPluginBinding): void { this.channel new MethodChannel(harmony_device_bridge/methods); this.channel.setMethodCallHandler((call, result) { if (call.method device_battery_level) { const level battery.getCapacity(); // 返回0~100的整数 result.success(level); } else { result.notImplemented(); } }); } onDetachedFromEngine(binding: FlutterPluginBinding): void { this.channel?.setMethodCallHandler(null); this.channel null; } }这个流程有个非常容易踩的坑MethodChannel在鸿蒙侧传递数据时对复杂类型的支持程度不如Android的StandardMessageCodec。我在实测中发现有些版本的鸿蒙Flutter插件API对Uint8List的传输支持不完善一件稳妥做法是把二进制数据先Base64编码成字符串再传。对于MCP场景工具返回的结果大多是JSON文本这倒不构成瓶颈但如果你要让AI读取设备上的图片文件就一定会碰到提前用Base64方案兜底。3.4 WSS传输启动权限申请与TLS证书处理要让PC端的AI客户端能通过WSS安全地连上鸿蒙设备有两件事躲不掉网络权限声明以及TLS证书信任。鸿蒙的权限声明在module.json5里。打开工程里ohos目录下的module.json5在requestPermissions数组里加上INTERNET权限{ module: { name: entry, requestPermissions: [ { name: ohos.permission.INTERNET }, { name: ohos.permission.KEEP_BACKGROUND } ] } }第二个权限是后台保活用的MCP Server需要持续接收AI请求如果应用一退后台就被挂起服务就断了。鸿蒙对后台任务的限制比Android更严格这个权限名在不同API版本可能变化建议以最新SDK文档为准。TLS证书这块MCP生产环境必须用WSS。最简单的验证方式是生成一个自签名证书在Dart侧用SecurityContext加载final context SecurityContext() ..useCertificateChain(cert.pem) ..usePrivateKey(key.pem); final transport WebSocketTransport( port: 9443, tls: true, securityContext: context, );但自签名证书有个连锁问题PC端的AI客户端发起连接时会提示证书不受信任。服务端总共两个方案要么在客户端侧把自签名证书加入信任库要么直接用Lets Encrypt这类公共CA签发的证书。工业级应用我强烈建议用公共CA证书因为你的AI客户端可能不止一个每个都去信任自签名证书运维成本太高了。3.5 打包构建与联调HAP装上手机PC端Agent连上来构建鸿蒙HAP包的流程和Android有相似之处都是IDE里点Build但底层是hvigor。在DevEco Studio里打开工程选择ohos目录作为运行目标点击Build按钮生成HAP包然后通过DevEco的远程模拟器或真机部署。联调环节推荐用MCP Inspector来快速验证。它是MCP官方提供的一个网页调试器支持配置远程连接地址。我在浏览器里填上wss://192.168.x.x:9443/mcp点击Connect顺利握手tools/list能看到我刚才注册的device_battery_level工具。再手动调用一下返回了当前电量整条链路就通了。如果想让PC端的AI Agent直接调用鸿蒙设备能力以Cline这类工具为例它通常支持自定义MCP Server填写同样的WSS地址AI就能在对话中实时获取鸿蒙设备信息。我实测下来局域网内单次工具调用的往返延迟大约在10到30毫秒对于工具调用场景完全可以接受唯一需要注意的是握手阶段会多几百毫秒的TLS协商开销。4. 我踩过的坑你最好别踩鸿蒙MCP服务端的稳定性打磨4.1 Flutter OHOS SDK的版本地狱与hvigor构建之痛鸿蒙Flutter适配的第一个坑一定是版本匹配。OpenHarmony的flutter_flutter仓库有多个分支master、ohos-stable、还有对应不同OpenHarmony版本的release分支。不匹配的后果很典型代码编译通过但运行期崩溃报一些莫名其妙的引擎错误。我总结的匹配原则是DevEco Studio版本、HarmonyOS API Level、Flutter OHOS分支、Dart SDK版本这四个要作为一个整体锁定。升级任何一个必须确认其他三个兼容。具体来说HarmonyOS API 12对应Flutter OHOS的ohos-stable分支如果你想升级到API 15至少要换到更新的Flutter分支同时DevEco Studio也要升级到能编译API 15工程的版本。hvigor构建速度慢这个要有心理准备。同样的Flutter工程Android的Gradle构建几分钟鸿蒙的hvigor首次构建可能要十几分钟。碰到的解决办法是不要频繁cleanhvigor的增量缓存做得很不错保留中间产物能显著加速第二次构建。另外hvigor的版本和DevEco Studio是强绑定的不要手动升级会直接导致构建失败。4.2 dart:io网络能力边界监听端口失败时的兜底方案这是我在这个项目里遇到的最深的坑。鸿蒙Flutter引擎虽然提供了dart:io的大部分实现但ServerSocket的监听能力在某些版本的SDK上是不可用的。具体表现为bind方法抛SocketException或者绑定了但外部无法连接。我当时检查了防火墙、网络权限都排除了最后把问题定位到鸿蒙Flutter引擎对端口监听的实现不完整。对应的解决方案有三种按优先级排列方案一升级Flutter OHOS SDK到最新stable分支很多早期版本的问题已经修复。实测我的API 12环境升级SDK后本地监听直接可用。方案二改用云端代理模式。鸿蒙设备作为WebSocket客户端主动连接到一个公网或局域网内的代理服务。这个代理同时暴露给PC端AI客户端。虽然多一跳但绕开了设备端口暴露的问题也顺便解决了NAT穿透。方案三完全用鸿蒙原生能力启动TCP/WebSocket服务再通过EventChannel把收到的消息转发给Dart层。这个方案工作量大一般只在SDK完全不支持时采用。我最终在生产环境采用了方案二的云端代理架构稳定性比本地监听更好。这里也解释了工业级的含义不依赖单一设备的网络条件服务端可用性由云端代理解耦。4.3 事件循环、微任务与鸿蒙UI线程异步陷阱一串接一串MCP Server本质上是高并发的异步服务对Dart事件循环的理解直接决定服务质量。很多Flutter开发者对事件循环理解不深最近也有人问我Future的then回调是不是放进微任务队列。这个问题在适配鸿蒙时不是理论题而是实战题。Dart的事件循环分两个队列微任务队列Microtask queue和事件队列Event queue。Future.then里注册的callback确实是放进微任务队列在当前同步代码执行完后立即执行而来自网络连接的事件、定时器事件等属于事件队列优先级低于微任务。MCP Server在接收大量工具调用请求时如果某个回调里写了重量级的同步计算会阻塞微任务队列导致后续的JSON-RPC请求处理延迟飙升。鸿蒙平台还有一个隐藏的坑MethodChannel的回调默认在平台线程执行如果你在里面做了耗时操作比如读文件、查询传感器会卡住鸿蒙原生侧的消息循环。正确的姿势是在ArkTS侧用TaskPool或异步API把耗时操作放到子线程再通过result回到Dart层。有一点值得说明MCP Server跑在UIAbility进程里鸿蒙对UI线程的调度有自己的一套规则。如果Dart层的事件循环被阻塞不仅仅是MCP服务响应变慢连Flutter UI都会卡顿。为了做到标题说的极致我在Dart侧对工具调用做了隔离重计算任务放到独立的Isolate里跑确保主Isolate的事件循环永远不被阻塞。4.4 权限、保活与透明审计工业级的最后一公里工业级和玩具demo的差别往往不在能不能跑通连接而在能不能扛住真实使用场景。有三个问题我会在项目上线前强制检查。首先是前台与后台的保活问题。鸿蒙对后台应用的内存和CPU有严格限制。MCP Server作为常驻服务如果用户把App切到后台几秒到几分钟内就会被挂起。想保住连接需要申请后台长时任务Long Running Task比如播放音频、导航、上传下载这类声明然后绑定一个前台服务。鸿蒙还实现了智能保活机制会根据用户习惯动态决定是否保留后台进程。这个你只能通过不断实测确认没有一劳永逸的配置。其次是用户授权问题。MCP Server如果暴露读取位置、摄像头、短信等敏感工具必须在鸿蒙的权限弹窗机制下逐个申请。我的建议是所有权限申请统一收敛到一个权限管理页用户在首次启动时一次性授权。AI调用工具前服务端要做二次鉴权不能在后台静默调敏感能力这是透明原则的第一要求。最后是审计日志。每一条AI工具调用都需要记录调用方、入参、出参、耗时、错误码。我在MCP Server里加了一个简单的结构化日志管道每次tools/call执行完都会把完整的请求响应JSON写入本地文件同时通过EventChannel实时送到前端展示。用户能清楚看到AI正在调用哪个设备能力、传了什么参数、返回了什么结果。这种透明性是让用户信任AI Agent的必要条件。5. 极致与透明落到工程上性能和可观测性的双向调优5.1 延迟、并发、内存优化MCP Server的三个基准指标把MCP Server跑起来简单但跑出极致性能需要量化和优化三个指标。延迟是最直观的。工具调用的往返时间由四段组成网络传输、JSON-RPC解析、工具执行、结果编解码。局域网内网络传输一般在2到3毫秒JSON-RPC解析用Dart自带的jsonDecode百微秒级工具执行看具体操作获取电量是亚毫秒级。真正容易被忽略的是TLS握手首次连接时wss握手可能吃掉500毫秒甚至更多。做法是启用TLS Session Resumption让新连接复用之前的握手结果实测能把重连握手降到30毫秒以内。并发指标衡量的是服务端同时能承载多少AI客户端。MCP Server是单Isolate处理所有请求每个请求是异步的理论上并发能力很高。但MethodChannel的调用是串行的多个Dart请求同时调到鸿蒙原生层会排队。鸿蒙侧的支持可以做一点优化把MethodChannel拆成多个通道按工具类型分散到不同原生线程执行。实测从单通道到三通道并发吞吐提升了两倍多代价是原生代码复杂度增加。内存指标决定了能否长期稳定运行。Dart AOT编译的Flutter应用内存基础占用大概在80到120MB。MCP Server常驻后工具调用的临时对象会频繁创建垃圾回收压力不小。我通过对频繁调用的路径做对象复用减少了约20%的GC触发次数。另外有一条铁律WebSocket连接必须做心跳探测和自动重连否则内存里会堆积一连串死连接这是长期运行内存泄漏的主要来源。5.2 日志和审计让每一条AI工具调用都留痕透明这个词很多人理解为UI透明、代码开源。但在我这个MCP Server的语境下它更接近可观测、可审计的工程概念。一个工业级MCP服务端必须能回答三个问题当前谁在调用调用在做什么结果是否合规我的做法是在mcp_server的请求处理链路上挂一个Middleware拦截所有tools/call、resources/read消息。每一条消息经过时生成一个traceId然后通过EventChannel推送到前端同时写入本地持久化存储。EventChannel在鸿蒙侧的实现和MethodChannel类似作用是让原生侧主动向Dart层推送数据。日志字段设计上不只记录请求和响应还记录AI客户端的连接信息IP、协议版本、首次连接时间、工具执行的性能指标耗时、内存增量、是否超时、错误码和错误详情。这样当用户质疑AI是不是偷偷动了我的文件时你能拿出精确到毫秒的完整操作记录。最终会让这些日志通过一套WebSocket通道实时流式输出用户直接在Flutter UI上看AI在干什么。这一步做完整条链路才真正配得上极致、透明、工业级这三个定语。这次适配做下来我个人体会最深的一点是所谓鸿蒙化从来不是把三方库拿过来编译一次那么简单而是要把这套库所依赖的平台能力在鸿蒙生态里重新生长一遍。mcp_server从Android/iOS跑到鸿蒙Dart协议层一行没改但每一处系统能力、每一个权限模型、每一条传输路径都经过了一次重新设计。最后再分享一个小技巧如果你在适配中遇到某个MethodChannel方法就是调不通先别急着怀疑协议用鸿蒙Deveco的日志过滤器抓一下有没有权限报错多半是module.json5里少声明了权限。这套组合拳打下来你的Flutter MCP服务端在鸿蒙上跑得稳、跑得快还能说得清。
返回列表