轻量设备上 JS 不能直接碰 MCU、DataCenter 和 ThemeManager。OpenHarmony ACE Lite 用 JSI(OHOS::ACELite::JSI)做引擎无关的 C++ 桥:JS 只看见模块方法,底层仍是车控协议和主题框架。jsi.h 把 JSIValue 做成不透明句柄,产品代码不绑 JerryScript 细节,换引擎时模块实现可以不动。

  产品入口在 AceFrameworkInit,由 APP_FEATURE_INIT 拉起。这里必须最先调用 RegisterCustomProductModules,再去做字体注册。原因很简单:JS 引擎一旦开始解析页面,就会按模块名去 ModuleManager 查找;钩子挂晚了,require 会失败。RegisterCustomProductModules 内部走 ProductAdapter::InitExtraModulesGetter,把 GetCustomProductModules / GetCustomPrivateModules 给ModuleManager::SetProductModulesGetter。这是 ACE Lite 给产品侧留的正式扩展点,和系统自带的 router、app、dialog 走同一套加载路径。
模块表是静态数组 g_customProductModules。Module 只有两个字段:name 和 initFunc。name 只写 "setting",不要自己拼 system. / ohos.,前缀由框架按调用方式补齐。initFunc 签名是 void(*)(JSIValue exports),exports 由框架创建并持有,产品代码不要 ReleaseValue。GetCustomProductModules 用 sizeof 算 moduleCount,后面加模块不用改计数。私有模块钩子当前返回空即可。

  JS 第一次用到该模块时,框架回调 InitSettingModule。这里会预读车辆名称、VIN、皮肤后景、CMD_DB_STATUS6 等 MCU 字段,初始化设置缓存,并把 JS 应用标成前台可见。真正对外的是四次 JSI::SetModuleAPI:vehicleControlGet、vehicleControlSet、setApState、setDataChangeListener。然后 StartSettingDataSubscription 按全部已配置 CMD 订阅 DataCenter,避免启动阶段支持位还没从 MCU 上来,把某些字段永久漏订。JS 侧 require 后即可读写车控、听数据变化。新增能力优先往 setting 上挂 API,而不是再开一套桥。这是设置页能通 C++ 的第一道门。

Logo

社区规范:仅讨论OpenHarmony相关问题。

更多推荐