Polyspace静态代码分析实战:嵌入式高可信软件开发指南
1. 项目概述为什么我们需要静态代码分析在嵌入式软件、汽车电子、航空航天这些对安全性和可靠性要求极高的领域一行有缺陷的代码可能意味着巨大的经济损失甚至是生命危险。传统的动态测试比如单元测试、集成测试依赖于运行代码但很难做到100%的路径覆盖那些深藏在复杂逻辑分支里的运行时错误、数据溢出、除零隐患就像定时炸弹一样难以被发现。这就是“Polyspace工具使用方法”这个主题的核心价值所在。Polyspace不是另一个调试器或测试框架它是一个静态代码分析工具。简单来说它不运行你的程序而是像一位极其严谨的“代码审查专家”通过数学形式化方法对你的源代码进行逻辑推演和抽象解释从而在编译阶段就证明或发现潜在的运行时错误。它能告诉你“在代码的第35行变量buffer的索引值可能越界因为当index等于MAX_SIZE时访问buffer[index]会导致未定义行为。”这种能力对于构建高可信软件至关重要。我接触Polyspace有七八年了从最初在汽车ECU软件项目里被客户强制要求使用到后来主动将其引入到所有安全相关项目的开发流程中深刻体会到它从“合规负担”到“质量利器”的转变。这篇文章我就以一个老码农的视角拆解Polyspace的核心用法、实战技巧以及那些官方手册里不会写的“坑”目标是让你不仅能跑起来这个工具更能真正用它提升代码质量让静态分析成为开发习惯的一部分。2. 核心概念与工作模式解析在动手配置之前我们必须先理解Polyspace的“大脑”是如何工作的。这决定了我们后续如何配置、如何解读结果以及如何最大化其价值。2.1 形式化方法与抽象解释Polyspace的基石是抽象解释。你可以把它想象成在一个简化但保留了关键属性的“模型世界”里模拟所有可能的程序执行。它不关心变量的具体值比如x5而是关心变量的取值范围和状态比如x ∈ [0, 10]且x ! 0。工作原理工具会为每个变量在程序的每个点建立一个“抽象状态”。当遇到一个操作比如y x 1它会根据x的抽象状态例如[0,10]推导出y的抽象状态[1,11]。通过这种方式它沿着所有可能的控制流路径进行传播和计算。与编译器的区别编译器检查语法和简单的语义如类型匹配而Polyspace检查的是动态语义即程序运行时可能发生的错误。与动态测试的区别动态测试需要你提供输入测试用例覆盖的路径有限。Polyspace理论上可以分析所有路径但受限于计算复杂度它会使用一些保守的近似这也是某些“误报”的来源。2.2 四种经典检查与颜色编码Polyspace将检查结果通过四种颜色直观地呈现这是其最著名的特性绿色证明无错误。工具通过形式化方法数学上证明了在该代码位置对应的运行时错误绝对不会发生。这是最高置信度的结果。例如它证明了一个循环内的数组访问索引始终在边界内。红色证明有错误。工具数学上证明了在该代码位置对应的运行时错误一定发生。这是必须修复的缺陷。例如它证明了一个指针在解引用前一定为NULL。橙色未证明。工具无法确定错误是否会发生。这通常是因为代码逻辑过于复杂、缺少约束如函数输入范围或涉及工具未建模的外部操作。橙色是分析结果的大头也是需要工程师投入最多精力进行审查和约束补充的地方。灰色未分析代码。代码未被分析可能因为它是死代码、被#ifdef排除或者是工具不支持的语言特性/编译器扩展。核心检查类别包括运行时错误数组越界、指针越界/误用、被零除、整数溢出、非法移位、非初始化变量读取、数据竞争等。代码规范合规可配置检查MISRA C/C、JSF、AUTOSAR C14等编码规范。代码度量圈复杂度、嵌套深度、函数长度等。注意不要追求将所有橙色都变成绿色或红色这是不现实且不必要的。我们的目标是消除所有红色并审查关键路径上的橙色通过补充约束或代码重构将其转化为绿色或确认其风险可接受。2.3 Polyspace产品线选型MathWorks提供了多个Polyspace产品选对工具是第一步Polyspace Code Prover核心产品专注于通过形式化方法证明运行时错误红/绿/橙。这是进行深度安全分析的利器。Polyspace Bug Finder更侧重于快速扫描使用基于模式的检查、数据流分析等轻量级技术快速发现常见的编码缺陷和违反编码规范的问题。速度更快但证明强度不如Code Prover。Polyspace Access基于Web的代码评审与协作平台。用于团队集中管理分析结果、进行代码评审、跟踪问题生命周期。Polyspace as You Code集成在VS Code等IDE中的插件在开发者编写代码时实时提供反馈。选型建议对于安全关键项目ISO 26262, DO-178CPolyspace Code Prover是必需品用于生成满足高级别ASIL D, DAL A认证要求的验证证据。对于日常开发和质量门禁Polyspace Bug Finder或Polyspace as You Code非常适合能快速反馈提升代码健壮性。Polyspace Access适合团队协作尤其当审计人员或系统工程师需要审查代码质量时。3. 环境准备与项目配置实战假设我们为一个基于ARM Cortex-M的嵌入式项目配置Polyspace Code Prover。这是最复杂但也最具代表性的场景。3.1 安装与基础环境安装Polyspace通过MathWorks安装器安装Polyspace产品。建议同时安装对应的编译器支持包如Polyspace Support Package for ARM Cortex-M Processors这包含了针对特定编译器的内置知识如内存映射、编译器内置函数。理解“编译器配置”Polyspace需要模拟目标编译器的行为。你需要一个编译器配置Compiler Configuration。你可以使用内置配置对于GCC、ARM Compilerarmclang、IAR等主流编译器Polyspace提供了预置配置。自定义配置如果使用冷门或高度定制的编译器你需要手动创建配置指定编译器可执行文件路径、标志、宏定义、包含路径等。这是一个技术活需要仔细对照编译器的输出。3.2 创建与分析工程以命令行/脚本为例图形界面Polyspace Desktop适合探索和一次性分析但对于集成到CI/CD流水线命令行polyspace-bug-finder或polyspace-code-prover是唯一选择。下面是一个典型的脚本步骤#!/bin/bash # 1. 设置环境变量Windows下为set export POLYSPACE_ARM_COMPILER_DIR/path/to/arm/gcc/bin export PATH$POLYSPACE_ARM_COMPILER_DIR:$PATH # 2. 定义分析参数 ANALYSIS_DIR./analysis_output SRC_DIRS./src ./driver INCLUDE_DIRS-I ./inc -I ./vendor/STM32Cube/Drivers/CMSIS/Include DEFINES-D USE_HAL_DRIVER -D STM32F407xx COMPILERgnu # 指定编译器家族 TARGETcortex-m4 # 指定目标处理器 # 3. 运行Polyspace Code Prover polyspace-code-prover \ -sources $SRC_DIRS \ -I $INCLUDE_DIRS \ $DEFINES \ -compiler $COMPILER \ -target $TARGET \ -results-dir $ANALYSIS_DIR \ -code-prover-checkers all \ -main-generator \ -allow-overflow \ -verbose关键参数解析-sources: 指定源代码目录或文件列表。-I,-D: 与GCC编译选项一致指定头文件路径和宏定义。确保与你的编译构建系统如Makefile, CMake完全一致否则分析环境不匹配会导致大量误报。-compiler/-target: 告诉Polyspace使用哪个编译器模型和处理器架构。这直接影响对数据类型大小、内存对齐、中断行为等的建模。-results-dir: 分析结果输出目录。会生成一个.pscp或.psbf文件用于Polyspace Desktop查看和HTML报告。-code-prover-checkers all: 启用所有运行时错误检查器。-main-generator: 让Polyspace自动为没有明显main函数的嵌入式代码生成入口点假设。对于中断驱动型嵌入式程序这是必须的。-allow-overflow: 这是一个重要的配置决策。默认情况下Polyspace将整数溢出视为错误红色/橙色。但在嵌入式领域尤其是位操作和硬件寄存器访问时有意的溢出是常见的。此选项将溢出检查降级为“审查”级别橙色而不是“错误”级别。你需要根据项目编码规范决定是否启用。3.3 配置难点多任务与中断建模嵌入式系统核心复杂性在于并发RTOS任务和异步中断。Polyspace需要你显式告知这些信息。RTOS任务你需要创建一个多任务配置文件通常是.m或.json格式定义每个任务的入口函数、栈大小、优先级以及任务间通信机制如队列、信号量的初始状态。% 示例定义两个任务 task1.entryPoint Task_1_Entry; task1.stackSize 512; task1.priority 1; task1.autoStart true; task2.entryPoint Task_2_Entry; task2.stackSize 512; task2.priority 2; task2.autoStart false; % 由task1创建在命令行中通过-multi-tasking-config task_config.m加载此文件。中断服务程序你需要通过-interrupt选项或配置脚本来声明ISR。polyspace-code-prover ... -interrupt SysTick_Handler这告诉PolyspaceSysTick_Handler函数可能在任何时间点被异步调用分析时需要考虑到这种最坏情况下的数据竞争和重入问题。实操心得第一次配置多任务和中断时几乎一定会产生海量的橙色警告数据竞争、全局变量非原子访问。不要慌这恰恰暴露了代码中潜在的并发缺陷。你需要逐一审查并通过添加约束如-global-constraints指定某个全局变量只在某个任务中被访问或重构代码使用互斥锁保护、将变量改为任务局部变量来解决。4. 结果解读与有效性提升分析完成后打开生成的.pscp文件或用浏览器查看HTML报告。面对成千上万个检查点尤其是橙色如何高效工作4.1 分级处理策略我通常采用“筛子”策略分层过滤第一层消灭红色。红色是已证实的缺陷优先级最高。立即定位代码修复它。常见的红色错误包括解引用明确为NULL的指针、访问越界数组索引为常量且超出范围、被零除除数是常量零。第二层审查关键橙色。并非所有橙色都需要处理。我定义的“关键橙色”包括安全相关函数涉及内存操作memcpy,sprintf、指针运算、资源释放的函数内的橙色。高复杂度代码圈复杂度超过10的函数内的橙色。被频繁调用的函数库函数或底层驱动中的橙色影响面广。特定检查器如“数据竞争”、“非原子访问共享变量”在并发代码中的橙色。第三层补充约束以消除噪声。很多橙色是因为分析条件不足。例如一个函数void process(int* data, int len)如果Polyspace不知道len的范围它就无法判断data[0]到data[len-1]的访问是否安全。这时你需要添加约束文件。4.2 使用约束文件.c文件或.m文件约束文件是告诉Polyspace关于代码的“先验知识”是降低误报率的关键。函数契约约束在约束文件中你可以为函数指定前提条件Precondition和后续条件Postcondition。/* 约束文件my_constraints.c */ /* 告诉Polyspace: 函数validate_index的返回值总是0或1 */ int validate_index(int idx) polyspace(routine) { polyspace(assume) return 0 || return 1; } /* 告诉Polyspace: 对于safe_copy函数调用时dst和src都不为NULL且size大于0 */ void safe_copy(void* dst, const void* src, size_t size) polyspace(routine) { polyspace(require) dst ! 0; polyspace(require) src ! 0; polyspace(require) size 0; // 还可以指定后续条件如复制后dst的内容等于src的内容 }在分析时通过-constraints my_constraints.c加载此文件。全局变量约束指定全局变量的初始范围或关系。extern int g_sensor_value; polyspace(global) g_sensor_value [0, 1023]; // 假设ADC采样值范围内存区域约束对于嵌入式开发定义不同内存区域如Flash, RAM, 外设寄存器的属性至关重要。// 告诉Polyspace地址0x20000000开始的大小为0x10000的区域是可读写的RAM polyspace(memory) region(0x20000000, 0x20010000) readwrite; // 告诉Polyspace地址0x40000000开始的大小为0x1000的区域是只写的外设寄存器 polyspace(memory) region(0x40000000, 0x40001000) writeonly volatile;4.3 利用Polyspace Access进行团队协作对于大型项目个人在桌面端查看结果效率低下。Polyspace Access提供了Web化的解决方案。上传结果分析完成后使用polyspace-access命令或通过CI脚本将结果.psbf/.pscp文件上传到Access服务器。polyspace-access -upload -results-dir $ANALYSIS_DIR -project MyEmbeddedProject -version git_commit_hash仪表盘与评审项目经理可以在Access仪表盘上看到整个项目的质量趋势红/橙/绿点数量变化。开发者可以针对具体的橙色或红色点发起评审邀请同事讨论这个检查点是否是真问题、如何修复或是否可接受。与Jira/GitLab集成可以将Access中的检查点直接创建为问题跟踪系统如Jira的任务实现缺陷跟踪的闭环管理。生成认证证据对于需要合规的项目Access可以生成标准化的报告列出所有已证明无错误的代码绿色作为满足功能安全标准如ISO 26262 Part 6 Table 1验证活动的证据。5. 集成到CI/CD流水线与最佳实践将Polyspace分析作为代码提交的门禁或夜间构建的一部分是确保质量持续提升的关键。5.1 流水线设计示例一个简单的GitLab CI.gitlab-ci.yml配置可能如下stages: - build - analyze polyspace-analysis: stage: analyze image: mathworks/polyspace:latest # 使用官方Docker镜像 script: - # 1. 检出代码 - git checkout $CI_COMMIT_SHA - # 2. 配置环境模拟你的编译环境 - source /opt/toolchain/activate.sh - # 3. 运行Polyspace分析Bug Finder用于快速反馈Code Prover用于发布前深度分析 - polyspace-bug-finder -sources ./src -I ./inc -D DEBUG0 -compiler gnu -target cortex-m4 -results-dir ./ps_results -bug-finder-checkers all -allow-overflow - # 4. 设置质量门禁如果红色缺陷数 0则流水线失败 - RED_COUNT$(polyspace-results-query -results-dir ./ps_results -filter color:red -count) - if [ $RED_COUNT -gt 0 ]; then echo 发现 $RED_COUNT 个红色缺陷流水线失败; exit 1; fi - # 5. 可选上传结果到Polyspace Access用于详细评审 - polyspace-access -upload -results-dir ./ps_results -project $CI_PROJECT_NAME -version $CI_COMMIT_SHA artifacts: paths: - ps_results/ expire_in: 1 week only: - merge_requests # 针对合并请求进行分析 - main # 主分支的定时任务进行更全面的Code Prover分析5.2 最佳实践与避坑指南根据多年踩坑经验总结以下几点从小处开始迭代进行不要试图一次性分析数百万行遗留代码。你会被淹没在结果中。选择一个关键模块或新开发的功能开始逐步建立约束积累经验再推广到全项目。约束是双刃剑约束能极大减少误报但错误的约束会掩盖真实缺陷。为约束添加充分的注释说明其依据如硬件手册、需求文档、数学定理。定期复审约束的有效性。处理“未分析代码”灰色灰色代码是分析盲区。你需要确认它们是否真的不需要分析如平台相关的汇编文件。如果是必要的C/C代码变灰了检查是否是编译器特殊语法、非标准的#pragma或复杂的宏导致的。有时需要调整编译器配置或使用-stub功能为其创建桩函数。性能调优分析大型项目可能耗时很长。可以尝试-module分模块分析最后合并结果。调整抽象级别-abstract但会牺牲精度。使用更强大的服务器增加内存。教育团队最大的阻力往往来自开发人员对橙色警告的抵触。需要培训团队让他们理解颜色含义将Polyspace视为帮助发现深层缺陷的“伙伴”而不是挑刺的“警察”。建立代码评审流程将Polyspace结果作为评审的必要输入。与单元测试互补Polyspace不能替代单元测试。单元测试验证功能正确性“代码做了该做的事”Polyspace证明代码安全性“代码不会做不该做的事”。两者结合才能构建高可信软件。静态代码分析尤其是像Polyspace这样的形式化验证工具其价值不在于某一次发现了多少个致命Bug而在于它推动了一种文化在代码运行之前就尽最大努力去思考并证明其正确性。这个过程最初会有些痛苦需要额外的学习和配置投入但一旦融入开发流程它将成为代码质量最坚实的防火墙。从我个人的经验看经过Polyspace“洗礼”的代码模块后期测试和现场故障率确实有肉眼可见的下降。工具是冷的但用它构建起的对代码的信心是热的。

相关新闻

C++控制台游戏开发实战:从贪吃蛇到俄罗斯方块的核心技术与优化

C++控制台游戏开发实战:从贪吃蛇到俄罗斯方块的核心技术与优化

1. 项目概述:为什么选择控制台游戏开发? 很多刚学完C基础语法的新手,或者想找个项目练手巩固知识的朋友,常常会陷入一个迷茫期:学了一堆指针、类、模板,但不知道能用来做什么。做图形界面吧,Qt…

2026/8/6 1:33:38 阅读更多 →
手眼标定实战:眼在手上、眼在手外两种方案代码实现

手眼标定实战:眼在手上、眼在手外两种方案代码实现

手眼标定实战:眼在手上、眼在手外两种方案代码实现手眼标定就像给机械臂配了一副"翻译眼镜"——把相机看到的世界坐标翻译成机械臂能懂的动作坐标。这篇直接上代码,两种方案一网打尽。一、手眼标定两种安装方式 1.1 眼在手上(Eye-i…

2026/8/6 1:33:38 阅读更多 →
基于1Panel与雷池WAF的Web应用安全防护部署实践

基于1Panel与雷池WAF的Web应用安全防护部署实践

1. 项目概述:一次关于面板与WAF的“旧版本”部署实录最近在折腾一个对外提供服务的Web应用,安全防护自然成了头等大事。WAF(Web应用防火墙)是抵御常见Web攻击(如SQL注入、XSS跨站脚本)的必备盾牌。在众多选…

2026/8/6 1:33:38 阅读更多 →

最新新闻

AI论文写作工具测评:功能与实用性分析

AI论文写作工具测评:功能与实用性分析

一、毕业季的论文写作困境 每年临近六月,无数毕业生都面临一道共同的难关——毕业论文。从选题、开题到初稿、修改、定稿,每一环节都考验着学术积累和时间管理能力。2026年毕业季的到来,让这一压力显得尤为突出。此时,越来越多的…

2026/8/6 23:54:17 阅读更多 →
MinerU终极实战指南:从PDF文档解析到AI应用集成的完整解决方案

MinerU终极实战指南:从PDF文档解析到AI应用集成的完整解决方案

MinerU终极实战指南:从PDF文档解析到AI应用集成的完整解决方案 【免费下载链接】MinerU A high-quality tool for convert PDF to Markdown and JSON.一站式开源高质量数据提取工具,将PDF转换成Markdown和JSON格式。 项目地址: https://gitcode.com/Op…

2026/8/6 23:54:17 阅读更多 →
三步解锁终极AI视频生成:ComfyUI-LTXVideo完全配置指南

三步解锁终极AI视频生成:ComfyUI-LTXVideo完全配置指南

三步解锁终极AI视频生成:ComfyUI-LTXVideo完全配置指南 【免费下载链接】ComfyUI-LTXVideo LTX-Video Support for ComfyUI 项目地址: https://gitcode.com/GitHub_Trending/co/ComfyUI-LTXVideo 您是否渴望在ComfyUI中体验专业级的AI视频生成能力&#xff1…

2026/8/6 23:54:17 阅读更多 →
实战记录:我用 MonkeyCode 半天做出一个团队内部工具,全程只写了几十行代码

实战记录:我用 MonkeyCode 半天做出一个团队内部工具,全程只写了几十行代码

一、背景:一个拖了两周的小需求 事情要从团队的一个小需求说起:运维同学每天要把一堆服务器日志里的关键错误统计出来,按模块分类,再做成日报发到群里。这个活靠人工做,每天要花一个多小时,而且容易漏。 …

2026/8/6 23:54:17 阅读更多 →
抗菌硅胶:是真的有效,还是营销噱头?

抗菌硅胶:是真的有效,还是营销噱头?

不知道大家有没有注意到,最近市面上出现了越来越多“抗菌硅胶”产品——抗菌奶嘴、抗菌围兜、抗菌手机壳、抗菌密封圈……价格比普通硅胶贵一截,包装上印着大大的“抗菌”字样。这时候很多消费者和采购方都会产生一个疑问:抗菌硅胶到底是真功…

2026/8/6 23:54:17 阅读更多 →
5分钟打造专属桌面伙伴:开源虚拟宠物框架深度体验指南

5分钟打造专属桌面伙伴:开源虚拟宠物框架深度体验指南

5分钟打造专属桌面伙伴:开源虚拟宠物框架深度体验指南 【免费下载链接】DyberPet Desktop Cyber Pet Framework based on PySide6 项目地址: https://gitcode.com/GitHub_Trending/dy/DyberPet 呆啵宠物(DyberPet)是一款基于PySide6开…

2026/8/6 23:53:17 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/6 22:02:27 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/6 22:02:27 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/6 22:02:27 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/6 22:02:28 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →