惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Cyberwarzone
Cyberwarzone
Help Net Security
Help Net Security
L
LINUX DO - 最新话题
Security Archives - TechRepublic
Security Archives - TechRepublic
A
About on SuperTechFans
www.infosecurity-magazine.com
www.infosecurity-magazine.com
Attack and Defense Labs
Attack and Defense Labs
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
The GitHub Blog
The GitHub Blog
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
Webroot Blog
Webroot Blog
T
Tenable Blog
C
Cyber Attacks, Cyber Crime and Cyber Security
Microsoft Security Blog
Microsoft Security Blog
人人都是产品经理
人人都是产品经理
Simon Willison's Weblog
Simon Willison's Weblog
D
Docker
爱范儿
爱范儿
AI
AI
宝玉的分享
宝玉的分享
PCI Perspectives
PCI Perspectives
The Register - Security
The Register - Security
Project Zero
Project Zero
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
IT之家
IT之家
S
Securelist
Scott Helme
Scott Helme
B
Blog
Forbes - Security
Forbes - Security
Google DeepMind News
Google DeepMind News
T
The Blog of Author Tim Ferriss
月光博客
月光博客
P
Proofpoint News Feed
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
F
Fortinet All Blogs
H
Help Net Security
Last Week in AI
Last Week in AI
N
News and Events Feed by Topic
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
MyScale Blog
MyScale Blog
I
InfoQ
P
Privacy International News Feed
V
V2EX
有赞技术团队
有赞技术团队
G
Google Developers Blog
阮一峰的网络日志
阮一峰的网络日志
腾讯CDC
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
S
Schneier on Security
T
Tailwind CSS Blog

人人都是产品经理

为什么你的产品找不到差异化?90%的失败都卡在第一步上(下) – 人人都是产品经理, 3年从30万到1300万用户、获2200万美元融资,这个AI教育产品用“抽卡”破解了获客难题 – 人人都是产品经理, 园区招商系统怎么做才能真正帮到去化?我加了这一个功能,推广链接转发400次阅读过万 – 人人都是产品经理, AI大事件:OpenAI发完网络安全模型又搞药物研发,小鹏汽车要抓”DeepSeek时刻” – 人人都是产品经理, 电商不是卖货,是一场更残酷的产品经理实战 – 人人都是产品经理, 没想到,活动营销又回来了! – 人人都是产品经理, 为何All-in海外KOC:一场关于AI时代窗口期的豪赌 – 人人都是产品经理, 重新理解企业的内部协作 – 人人都是产品经理, 苹果的 AI 战略到底是什么? – 人人都是产品经理, 医疗智能体·第2讲——合规护城河:等保、PIPL与HIPAA的架构实战 – 人人都是产品经理, 向量知识库五步法:从“答非所问”到“精准回复” – 人人都是产品经理, 鸿蒙PC三方库构建总指挥HPKBUILD(sha)库为例 – 人人都是产品经理, 何时该用LLM?AI产品经理的LLM设计指南 – 人人都是产品经理, 医疗信息领域的需求方、决策方、准入方以及关注点(二) – 人人都是产品经理, 即梦涨价:一场被误读的「傲慢」 – 人人都是产品经理, 面试AI PM必答题:Hermes和OpenClaw的区别,如何讲清楚业务价值 – 人人都是产品经理, AI的下一张船票:世界模型——AI产品经理必须理解的技术拐点 – 人人都是产品经理, 小红书做GEO,怎么让AI信你?记住这 3 个重要信息 – 人人都是产品经理, 5 家印度 AI 初创公司,看看印度 AI 再做什么 – 人人都是产品经理, AI项目跨团队协作:产品技术业务如何不打架 – 人人都是产品经理, Agentic Workflow(智能体工作流):让AI从”答案生成器”变成”数字员工” – 人人都是产品经理, lycium_plusplus 项目全景解读:OpenHarmony 三方库构建的“大管家” – 人人都是产品经理, 从爆单救火到前置履约:两套预采策略,把生鲜大促履约效率拉满 – 人人都是产品经理, 什么时候该补货?我用一轮数据做了一个决定 – 人人都是产品经理, 从“机械兜底”到“动态分流”:AI客服重复进线治理的4大底层逻辑 – 人人都是产品经理, 抖音拼效率,红书拼洞察 – 人人都是产品经理, 全民狂欢与退潮——为什么龙虾这波热潮冷却得如此之快? – 人人都是产品经理, Stripe押注!MPP重塑全球支付 – 人人都是产品经理, 小红书GEO:AI引用你的内容,不是因为你对,而是因为你看起来可信 – 人人都是产品经理, 前百度副总裁押注办公Agent,日韩付费爆发,Manus迎来强劲对手 – 人人都是产品经理, 企事业单位数字化的业务供需本质 – 人人都是产品经理, 医疗智能体·第1讲——医疗信息化重构:从“辅助软件”到“自主智能体”的范式转移 – 人人都是产品经理, 粉丝量就是空气!!! – 人人都是产品经理, 用户说“薯片碎了”,机器回“要买吗?”:意图识别的翻车与破局 – 人人都是产品经理, RAG召回准确率从75到90 我做对了这三件事 – 人人都是产品经理, AI大事件:Anthropic改收费、OpenAI发安全版、手术机器人纳入医保、阿里发布”秒悟” – 人人都是产品经理, Chrome 推出 Skills 新功能,Agent 重塑上网方式 – 人人都是产品经理, GitHub前创始人拿了a16z的1700万美元,做Agent时代的Git – 人人都是产品经理 拷贝或克隆其他 Flutter OH 项目到本地后无法运行 – 人人都是产品经理, 优惠券设计:优惠券创建 – 人人都是产品经理, 不用死磕文档!AI 助手 1 小时搞定飞书 CLI 安装 + 配置 + 知识库 – 人人都是产品经理, 用小龙虾做竞品分析报告:从2天到20分钟,我是怎么做到的 – 人人都是产品经理 用小龙虾做市场分析报告:搞懂这3个公式,市场规模不再靠猜 – 人人都是产品经理, 你早就在做 Harness 工程,只是不知道它叫这个名字 – 人人都是产品经理, Think Long就够?你可能想多了! – 人人都是产品经理, 货代SRM实战:供应商准入怎么做,才能让资源池不是通讯录而是可交付网络? – 人人都是产品经理, 如何做好用户调研?详解基本技巧 – 人人都是产品经理, 木鸟、途家、美团对打,平台春天行动开“卷” – 人人都是产品经理, 入职才发现公司不靠谱?小红书从业者求职避坑指南 – 人人都是产品经理, 美国 AI 三巨头联手封堵,中国 AI 突围之路在何方 – 人人都是产品经理, 小红书,放在需求对面的镜子 – 人人都是产品经理, AI 会带来大规模失业吗? – 人人都是产品经理, 从出单到补货前,我第一次犹豫:该不该放大? – 人人都是产品经理, Flutter 三方库鸿蒙化适配:5 种高效检查方式,快速判断是否需要适配 – 人人都是产品经理, 从做产品进阶拿结果:医美机构产品经理转岗科室运营经理 – 人人都是产品经理, 阿里HappyHorse,一场关于“Token经济”的阳谋 – 人人都是产品经理, To B AI:客户留存落地的观察与思考 – 人人都是产品经理, AI产品的“生命线”——数据采集、标注、清洗的产品化设计 – 人人都是产品经理, 谈谈AI Agent(二):当“孩子”能自己“体验世界”时,你该学什么? – 人人都是产品经理, UI/UX设计师的3层能力进阶,前两层让你活下来,第三层…才是真正的分水岭 – 人人都是产品经理, 2分钟 → 30秒,效率提升75%:B端产品经理如何用「规则枷锁」驯服AI幻觉? – 人人都是产品经理, 还没来得及学OpenClaw,来了个更猛的:Hermes Agent – 人人都是产品经理, AI日报:宇树机器人跑出10m/s刷新世界纪录 – 人人都是产品经理, 一文说透基金互金如何用情绪价值引导用户决策做转化 – 人人都是产品经理, 当浏览器开始替你”看”网页:AI 浏览器正在亲手拆掉它脚下的那张网 – 人人都是产品经理, 0代码,一天时间我Vibe Coding了个网站 – 人人都是产品经理, Hermes 和 OpenClaw 之争,Agent 的能力应该“装上去”还是“长出来”? – 人人都是产品经理 视频生成的“桌子”,字节Seedance 2掀完,阿里快乐马掀 – 人人都是产品经理, 从听不懂到完全信任:我的 Codex 深度产品体验 – 人人都是产品经理, 当虚拟偶像有了北京户口,与真人偶像还有什么区别? – 人人都是产品经理, 会说,远远比会做更重要 —— 对 SBTI 爆火现象的五层观察 – 人人都是产品经理, AI产品经理必看:当“搭环境”比“选模型”更重要,你的认知还在2024年吗? – 人人都是产品经理, 2026年AI产品商业化核心逻辑:从功能demo到规模化营收的3个必破卡点 – 人人都是产品经理, 京东围绕供应链,卷起裤腿下场的那些事儿 – 人人都是产品经理, SBTI一夜刷屏:它赢在了“太会说人话” – 人人都是产品经理, 折扣零售的真相:不是便宜,而是价值感! – 人人都是产品经理, 和甲方吵了一架,最后加钱做了——我学到的ToB产品经理生存法则 – 人人都是产品经理, 和几位小红书操盘手聊了8小时,干货全在这 – 人人都是产品经理, 智谱GLM-5.1登场,开源模型首超Opus4.6!!! – 人人都是产品经理 Anthropic收入凭什么反超OpenAI,终于有人把这事说清楚了 – 人人都是产品经理, 史上最有故事感的技术报告——Claude最强模型Mythos 7个极其精彩的细节 – 人人都是产品经理, 模型不是壁垒,Harness 也不是 – 人人都是产品经理, 抖音本地生活业务思考21 – 人人都是产品经理, Superpowers:145k Star的AI编码框架,到底是什么来头? Superpowers:145k Star的AI编码框架,到底是什么来头? – 人人都是产品经理, OpenAI 的路走错了,Anthropic Harness 解法启示:模型需要实践专科生 – 人人都是产品经理, 画原型图的前一步:设计站点地图 – 人人都是产品经理, 给 DeepSeek 的最后一封催更信 – 人人都是产品经理, 手把手教你用 Claude Code 搭建 AI 营销团队:5 个 Agent、12 项技能,独立完成研究、写作、设计全流程 – 人人都是产品经理, 你以为大模型在学语言?不,它在重新发明语言学 – 人人都是产品经理 所谓Skill,不过是AI时代的工业垃圾 – 人人都是产品经理, 聊一聊内容传播的几个方法 – 人人都是产品经理, 当平台开始吃掉生态:从 OpenClaw 被封杀,读懂 Anthropic 的这盘棋 – 人人都是产品经理, 你装了 10 个 AI 插件,Obsidian 还是一个文件夹 – 人人都是产品经理 关于AI智能体架构演进的系统性思考:从单体试水到多体协同的重构 – 人人都是产品经理, 当“人”变成Skill,我们又该何去何从? – 人人都是产品经理 Mythos 事件:前沿 AI 治理的意外实验 – 人人都是产品经理, 货代CRM:信用与风险管理怎么做,才能把坏账风险拦在放货之前? – 人人都是产品经理, 从HR收集自拍照到员工自助录入——我见证了园区人脸识别从”不可用”到”真好用”的全过程 – 人人都是产品经理 千问闯关AI混沌期:阿里画靶,吴嘉张弓,马云射箭? – 人人都是产品经理,
浅析鸿蒙(ark runtime)执行动态代码
纯爱掌门人 · 2026-01-21 · via 人人都是产品经理

众所周知,鸿蒙next的应用运行在ark runtime下,而ark runtime是驱动着鸿蒙应用的基石。ark runtime支持动态类型和静态类型在内的多种编程语言(目前支持js, ts, arkTs等,与传统js runtime不同的是,ark compiler工具链在编译ts源码时,不会像传统js引擎,先将ts转为js代码,再交给js runtime执行,而是在编译ts源码时,会分析推导类型信息,在运行前即可预生成内联缓存从而加速字节码执行)。详细的代码实现以及官方文档大家可以去这里看:arkcompiler仓库

整体上看,ark runtime仍然是符合Ecmascript规范的js虚拟机实现。既然是js虚拟机实现,那大家一定会想到这样执行远程动态代码下发/热修等场景在鸿蒙上岂不是可以遍地开花,分分钟绕过App Gallary的代码签名/审核随意更新客户端代码!

Eval / new Function

提起使用js动态执行代码,大家第一个想起的一定是eval

Eval作为js标准规范的方法,用于执行一段javascript表达式、声明、脚本并返回代码段执行结果。同时使用Function prototype也能达到相同的效果。

果然没有那么简单,还没有编译Dev Eco Studio的静态检查便提示无法在arkts中使用标准库。 image.png

这可难不倒大家,众所周知(大声宣扬),arkts的严格的静态检查仅适用于ets文件,只要把代码写在ts文件中,就能愉快的使用ts/js的大部分特性了(甚至any,随心所欲的向任意对象中加入/删除字段、方法等)。

说干就干,代码是不报错了,程序也跑起来了,但是在调用时app果断崩溃,调用eval / new Function分别提示:

Error message:not support eval().
Error message:Not support eval. Forbidden using new Function()/Function().
export class InjectUtil {
  static inject(obj: any) {
    eval("1+1")
    InjectUtil.evalByFunc()
    obj.Nav = null
  }

  static evalByFunc() {
    var fn = Function as any
    return fn('console.log(eval!!!!!!!!!!!!!!!!!!!!!!!!!!!!)')();
  }
}

看来arkcompiler在运行时也屏蔽掉了js可以随意动态执行代码的特性。看来直接使用ts的api是无法达到动态执行代码的目的。

查阅官方文档,已经对ark runtime的这一表现作出了解释:

ArkCompiler前端编译工具链将ArkTS/TS/JS程序预先静态编译为方舟字节码,并且还提供了多重混淆能力的增强,有效地提升了开发者代码资产的安全强度。另外出于安全的考虑,ArkCompiler不支持sloppy模式的JS代码,也不支持eval等运行动态字符串的功能。

在查阅了鸿蒙官方文档后,发现其并未完全堵死ark runtime动态代码的执行能力,在官方支持上仍然提供了使用ndk来开发动态js代码执行的能力。

JSVM-API

JSVM-API是鸿蒙中提供的基于标准JS引擎提供的一套稳定ABI,为开发者提供了一套较为完整的JS引擎能力,包括创建和销毁引擎,执行JS代码,JS/C++交互等关键能力。相当于v8 api的精简版。 image.png

这里的js engine在官方文档上并未说明是否是ark runtime,但基于目前ark runtime的开源代码,这里js vm的能力应该还是由ark runtime提供(欢迎勘误)。

受限于JSVM-API提供的能力,我们无法获取到主线程所在的jsvm env(也有可能主线程根本不是jsvm),只能通过jsvm创建一个全新的隔离环境,在这个js环境中,我们可以动态的执行js代码。

使用jsvm执行js脚本的主要流程:

image.png

核心代码

// jsvm提供的接口头文件
#include "ark_runtime/jsvm.h"

JSVM_VM* vm;
JSVM_ENV* env;

// 创建jsvm虚拟机 通过napi调用
static void createArcJsContext() {
  JSVM_Status status;

  // 初始化 可以设置vm启动参数 argv argc
  JSVM_InitOptions init_options;
  memset(&init_options, 0, sizeof(init_options));
  OH_JSVM_Init(&init_options);

  // 虚拟机实例
  // 可以设置gc相关参数、snapshot bin等
  JSVM_CreateVMOptions options;
  memset(&options, 0, sizeof(options));
  status = OH_JSVM_CreateVM(&options, vm);
  // vm scope。在jsvm中scope 即作用域,用于资源管理,在scope打开期间资源可用,scope关闭后自愿释放(RAII)
  // 类似v8中各种scope的设计,在后续使用中,各种scope可以以raii风格封装方便使用
  JSVM_VMScope vm_scope;
  status = OH_JSVM_OpenVMScope(js_vm, &vm_scope);

  // js env
  js_env = new JSVM_Env;
  status = OH_JSVM_CreateEnv(...);
  // env scope
  status = OH_JSVM_OpenEnvScope(...);
}

static napi_value EvalJS(napi_env env, napi_callback_info info) {
  ...省略...
  // 待运行js代码
  std::string scriptStr = napiValueToString(env, args[1]);
  // scope 用于资源管理
  OH_JSVM_OpenHandleScope(...);
  // 转为jsvm字符串
  OH_JSVM_CreateStringUtf8(...);
  // 编译js脚本
  OH_JSVM_CompileScript(...);
  // 运行脚本
  OH_JSVM_RunScript(...);
  // 获取执行结果(省略...)
  ...省略...
}

// 释放先前创建的各种scope 关闭vm napi调用
static void releaseResources() {
  OH_JSVM_CloseEnvScope(...);
  OH_JSVM_DestroyEnv(...);
  OH_JSVM_CloseVMScope(...);
  OH_JSVM_DestroyVM(...);
}
// index.d.ts 导出napi方法定义
export const createJsCore: (fun: Function) => number;
export const releaseJsCore: (a: number) => void;
export const evaluateJs: (a: number, str: string) => string;
// 创建首个运行环境,并绑定TS回调
const coreId = testNapi.createJsCore(MyCallback);

let sourcecodestr = `
          {
          let a = "hello World";
          consoleinfo(a);
          const mPromise = createPromise();
          mPromise.then((result) => {
          assertEqual(result, 0);
          onJSResultCallback(result, "abc", "v");
          });
          a;
          };`;

// 在首个运行环境中执行JS代码
console.log("TEST evalUateJS :   " + testNapi.evalUateJS(coreId, sourcecodestr));

// 释放运行环境
testNapi.releaseJsCore(coreId);

实测js代码片段可以成功运行编译执行,从应用的主线程调用napi创建jsvm,并执行指定的一段js代码,在jsvm中创建的环境也能调用创建vm时传入的回调函数将结果返回主线程/主vm。

可以正常实现动态代码和app主线程代码的双向调用:

主isolate(主线程) -> napi -> 用户isolate(jsvm)

用户isolate(jsvm) -> napi -> 主isolate(主线程)

优点

  • js执行环境与主线程环境隔离,通过napi进行中转通讯,在jsvm环境中执行代码不会影响到主线程代码执行,相对安全。

缺点

  • 需要手动管理jsvm、相关vm env等,使用较为繁琐,应用前需要对js vm api进行封装。
  • 动态执行的js代码不能使用import等,需为完整逻辑代码。
  • 不能调用主vm中中相关对象/api。
  • 未经编译arc compiler编译优化,可能会有性能损失。
  • 需要写大量的binding相关的胶水代码,繁杂的工作量较大。

NAPI

node的napi将v8底层数据结构全部黑盒化,抽象为统一的接口,使得开发者无需再使用v8相关api操作,与v8解耦,使开发者不会遇到由于v8引擎变更或node版本升级而重新开发的风险。

在鸿蒙中也实现了napi相关规范与接口定义,使开发者可以以napi规范来开发鸿蒙应用的native扩展。

napi_run_script

napi_run_script是napi标准规范中执行js代码的函数,依赖于napi,该方法的调用比较简单,直接上运行代码及调试结果

image.png 在鸿蒙中napi_run_script调用可以成功完成,也返回了napi_ok成功状态的返回码,但是实际上代码并没有执行,脚本运行返回值也被置为null。

查阅官方文档,并没有对napi_run_script这个接口做出说明,猜测ark runtime屏蔽了或未实现这个接口。

napi_run_script_path

针对这个接口,鸿蒙官方有给相关说明:napi_run_script_path官方文档。文档中提到可以使用该接口执行abc格式的文件(arkts编译后生成的字节码产物),但没有给出操作流程。摸索了下,鸿蒙sdk中的es2abc工具可以实现这个目标: /Applications/DevEco-Studio.app/Contents/sdk/HarmonyOS-NEXT-DB3/openharmony/ets/build-tools/ets-loader/bin/ark/build-mac/bin/es2abc

用法(注意,使用macos的同学需要将es2abc这个文件拷贝出.app, 否则会因为权限不足的原因拷贝失败):

./es2abc test.js

将生成的test.abc文件拷贝至entry的rawfile中,调用即可执行对应的代码。

napi_run_script_path(env, "/entry/resources/rawfile/test.abc", &result);

附上测试脚本test.ets:

console.log('hello world from dynamic code')
console.log(globalThis)
globalThis.Cornerstone.hello()

image.png 可以发现动态下发的代码可以正常调用到我们在程序运行时向globalThis中注入的Cornerstone对象,说明动态执行的代码与app运行的主线程代码处于同一vm环境。

优点

使用napi执行动态代码,无需手动管理vm虚拟机的生命周期,同时可以复用并调用到主vm环境中已存在的对象,更加灵活友好。

可享受到.abc带来的性能优化。

但同时下发的abc文件也与jsvm的限制一致,无法使用import,需将动态代码中的相关依赖提前注入到vm环境/携带完整逻辑等。

缺点

因为执行环境与app主vm一致,恶意代码可随意破环主vm中相关内存数据。

总结

出于安全考虑鸿蒙(ark runtime)在ts层面对动态执行代码作出了诸多限制,但是我们仍能通过napi / jsvm的方式达到动态执行代码的目的,尤其是napi,可在主vm环境中执行动态代码,并且能享受到方舟编译器所带来的性能优化。

本文作者@纯爱掌门人,未经许可禁止转载。