ARTICLE · 1036270
你的 App 还在等人点图标?HarmonyOS 7 让小艺直接调你的功能
“HarmonyOS 7 把应用入口改了:功能不再等人点,而是被点名。V哥把 Skill 化压成一篇,读完带走三样东西:① 一套解剖图:一个
skills/目录、两份文件、一处skillProfiles注册,老业务一行不改;② 一份契约写法:SKILL.md 三段式(元数据/触发场景/能力契约),写糙了系统根本不调你;③ 一张上线自检表:三处命名一致、回包唯一出口、边界条款防误触发,六项全勾再提交。
兄弟们好,我是V哥。
先问个扎心的:用户要用你 App 里"排队取餐"这个功能,得点几步?解锁、找图标、进首页、过广告位、点 tabBar——五步。而用户心里想的就四个字:"帮我取餐。"
9 月 7 日 HarmonyOS 7(API 26)正式发布,这事有解了:应用内业务能力可以以 Skill 形式开放给系统智能体调用。用户说一句话,小艺找到你的能力、自己调。应用从"被打开",变成了"被调用"。
三秒钩子
图标时代,你的功能在等人点;意图时代,你的功能在被点名。SKILL.md 就是你在系统意图分发池里的简历——系统不进你代码,只看简历决定调不调你。
一个目录、两份文件、一处注册
物理形态官方规定得很死:模块下建 skills/ 目录,每个 Skill 一个文件夹,里面一份 SKILL.md 描述文件加一份入口脚本,再到 module.json5 的 skillProfiles 标签里注册一下,完事。
{ "module": { "skillProfiles": [ { "name": "vge-org-milktea-assistant", // 三处必须完全一致 "abilityName": "EntryAbility", "srcEntries": ["../../skills/vge-org-milktea-assistant/scripts/MilkteaSkill.ets"], "version": "1.0.0" } ] } }最爽的一点:薄封装。入口脚本只是个"参数适配器",老业务一行不动,加个壳就能被系统调。V哥的奶茶点单示例里,MilkTeaService 这个既有业务类零改动,Skill 脚本只做四步:校验参数 → 调业务 → 按契约装回包 → 经 completeArkTSScriptInApp 上报。
// 薄适配层:只翻译参数,不装业务 import { scriptManager } from '@kit.AbilityKit'; export default class MilkteaSkill { public async orderMilkTea(info: scriptManager.ArkTSScriptInfo, ...argv: string[]): Promise<void> { // 校验 → 调 MilkTeaService → report 回包(略,见社区版全文) } }注意一个坑:回包必须全走唯一出口。V哥把 completeArkTSScriptInApp 收进一个 report 私有方法——回包点一散,某个分支忘了报,系统只会觉得这 Skill "失联",下次直接不调你。
契约写得好不好,决定你会不会被调用
SKILL.md 三段式,每段都有命门:
元数据:name 三处一致(目录名、文件头、module.json5);description 是系统初次筛选的依据,写"奶茶相关服务"这种糊涂话,筛选关都过不去。
触发场景:官方建议除典型话术外,还要写"不调用的情况"。"附近的奶茶店"是搜店铺、"这杯多少钱"是查价格,一条条踢出去。误触发一次透支的是用户对整个入口的信任,这个保险丝不能省。
能力契约:exec-cli 调用示例 + JSON Schema,anyOf 管二选一必填、oneOf 管回包分支互斥。回包里的 suggestion 是直接给用户看的,写"ERR_TIMEOUT_504"这不叫提示,叫劝退——按"用户下一步能干什么"来写人话。
V哥的判断:红利窗口就是现在
Skill 化真正改的是分发的粒度:从 App 降到了功能。以前用户装你的应用才能用你的功能,现在你的功能直接进意图分发池,长尾功能第一次有机会被"说"出来。
7.0 刚发一周,池子里占位的人还不多。以前V哥说过合规是上架的门票,现在补一句:Skill 化是新门票,门开着的窗口不会一直开着。
今天V哥去把V哥那杯"五分甜少冰"的真奶茶点了,兄弟们跟上。
【好文精选】