作者:杨兰馨(楠瑆)
背景介绍
2024 年 10 月 22 日,华为在原生鸿蒙之夜正式发布 HarmonyOS NEXT(版本号 5.0.0,API 12 起)。与此前 HarmonyOS 3.1/4.0 的“双框架、双生态”过渡形态不同,NEXT 直接挥别 Android 开源项目(Android Open Source Project,AOSP),全面切换至自研鸿蒙内核,成为真正意义上的“纯鸿蒙”。
1. 三大关键词读懂 NEXT
- 纯血:零 AOSP 代码,统一鸿蒙内核 + ArkTS 语法链,彻底去除 Android 兼容包袱。
- 极速:方舟编译器在编译阶段直接将代码翻译为机器码,极大提升了系统运行效率。
- 极简:一次开发、多端部署,1(手机)+8(平板、穿戴、车机等)+N(IoT 泛生态)覆盖全场景。
2. 开发底座全景
- 开发 IDE:DevEco Studio(JetBrains 内核),实现可视化多端预览。
- 开发语言:ArkTS 语言,在 TypeScript 语言基础上,强化静态类型检查,增强并发能力。
- 编译方式:传统的 JS 程序开发中,应用程序往往带的是经过前端打包工具处理过的 JS bundle 文件,在程序运行阶段进行解释执行;这种运行方式需要设备有强大的计算能力。鸿蒙系统能够支持的设备范围广泛,覆盖从低端的 IoT 设备到高性能手机设备。采用传统的方式,无法保证多类型设备的体验一致性。在鸿蒙开发环境中,应用代码是通过前端编译器完成编译的。前端编译器按照语言规范解析源代码,编译成方舟运行时能够理解的二进制字节码格式 ,最后打包到应用中。
- 编译产物:针对不同的部署态需求,模块的编译结果有三种目标形态。
- HAR(HarmonyOS Archive):这是一种中间编译产物格式,它最终将被编译合并到 HSP 或 HAP 格式的包中。
- HSP(HarmonyOS Shared Package):HSP 使得模块可以以运行态复用的形式共享。相较于 HAR,当有多个 HAP 包依赖与同一个 HSP 时,最终的打包产物中,HSP 只会存在一份。
- HAP(HarmonyOS Ability Package):HAP 包是鸿蒙应用可单独安装的容器包。同一个 HAP 包可以支持在多个设备上运行。一次开发上架,多端分发、部署的效果。
3. 系统级开放能力图谱
- 应用框架:提供应用程序开发的基础设施,如运行时、引擎、框架等相关开放能力。
- 应用服务:提供应用程序开发的核心功能和服务,包括推送消息,认证登录,支付等开放能力。
- 媒体:存储、处理、传输视频、音频、图片等多媒体内容的相关开放能力。
- 图形:渲染、显示和交互的图形技术,包括 2D 和 3D 图形、动画、游戏等相关的开放能力。
- AI:机器学习、深度学习、自然语言处理、计算机视觉等相关的开放能力。
- 系统:通信、安全、驱动程序、DFX、诊断和测试等相关的开放能力。
至此,鸿蒙 NEXT 的基础轮廓已清晰——它不仅是手机 OS,更是面向万物智联时代的原生神经系统。随着鸿蒙 NEXT 生态系统的蓬勃发展,应用性能监控变得愈发重要。阿里云 ARMS 团队倾力打造的鸿蒙 NEXT SDK,为鸿蒙应用提供了业界领先的全链路监控解决方案。这不仅仅是一个 SDK,更是您洞察用户体验、优化应用性能的智能伙伴。
HarmonyOS SDK 架构与设计
1. SDK 整体架构
- 接口层:最上层,对外暴露,供客户调用的 API。
- 功能层:数据采集,具体包含 网络、交互、应用、卡顿、崩溃、自定义、Webview、页面等模块。
- 核心层:基础服务,工具类,日志,时间,数据协议。会话管理,配置管理,OT的扩展层。
- 依赖:Opentelemetry-ts/js,pako 做压缩.
2. 如何进行会话管理
首先明确会话的概念,会话是指一个用户在进入宿主 APP 到退出宿主 APP,这段时间内发生的行为轨迹。具体会话管理的原理:在应用启动时,就开始会话,将会话唯一ID(SessionID)写入全局变量中,在产生事件时,将当前的 SessionID 写入 Event 的指标中。
也就是说,会话是 SDK 用来串联管理用户行为轨迹的一种手段。开发者可以通过在控制台查看会话轨迹,明确用户在 APP 的操作行为上下文,进而展开多种角度的分析。当用户直接杀死应用或者后台切换时间大于 60s 时,开启新的会话。
3. 数据采集方案设计
针对不同场景的数据采集,SDK 根据鸿蒙系统的特性采用了不同的采集方案。整体采取了下面三种无感知采集方案。
方案1:鸿蒙系统级 API 助力
正如前文提到,鸿蒙系统提供了一些 Kit 能力,我们主要借助系统 Kit 中的性能分析服务(Performance Analysis Kit)的 HiAppEvent 能力,对异常、卡顿、启动时间进行采集。通俗地讲,就是该 API 提供了对系统事件的订阅能力,我们主要在订阅事件发生时的回调函数中,进行数据采集等操作。
HiAppEvent 提供了订阅应用事件和系统事件的能力,系统事件主要是指应用运行期间发生的性能、功耗、稳定性等问题。SDK 关心的异常事件、卡顿事件、启动事件都属于系统事件的范畴。下面以崩溃事件为例,HiAppEvent 提供了检测 NativeCrash 和 JsError 类型崩溃的能力,在系统完成崩溃信息收集后,进行事件生成与事件上报,SDK 只关心事件上报后的操作,并且根据上报的 params 的属性进行数据分析与处理,最后进行数据上报。下图展示了崩溃事件的采集原理。
方案2:监听 UI 组件的生命周期
具有生命周期跨度的事件,SDK 通过监听生命周期实现采集。以 NavDestination 组件为例,UiContext 提供了 UiObserver 的能力,其中的接口 on(type: 'navDestinationSwitch', callback: Callback): void 提供了对 Navigation 的页面切换事件的监听能力。在 SDK 初始化时,注册监听,并且构造数据处理的回调函数,在不同生命周期的进行不同的数据处理。
如下图所示,以页面停留时长为例,可以通过 onHidden 的时间节点和 onShown 的时间节点的差值计算。值得一提的是,在需要取消 navDestinationSwitch 监听的时候,需要指定取消对应回调函数的监听。否则,会导致全局所有关于 navDestinationSwitch 的监听都会失效,这样可能会造成 APP 某些功能失效。
方案3:结合 Hvigorw 插件实现编译时替换 (AOP)
在数据采集过程中,有一些事件系统并未提供对其的监听能力,也不具备完备的生命周期的监听能力。为了做到无感知的数据采集,SDK 采用 AOP 的理念,在代码编译时,实现无感知插桩。插件的开发整体思路参考了货拉拉的开源方案:https://github.com/HuolalaTech/AspectPro/tree/master,实现在代码编译过程中的代码替换。
以网络框架 ohos.net.http 为例,每一个 httpRequest 对应一个 HTTP 请求任务。SDK 对关键代码 http.createHttp() 进行插桩,添加关键处理逻辑,记录网络成功/失败的性能指标,进而生成 Network Span,从而上报数据。
结语
在鸿蒙 NEXT 的新时代,阿里云 ARMS RUM SDK 作为一款性能体验监控工具,可以作为辅助 APP 运维强有力的助手。ARMS RUM 鸿蒙 NEXT SDK 已经发布正式版本,可以参考接入文档 [ 1] 体验使用。相关问题可以加入“RUM 用户体验监控支持群”(钉钉群号: 67370002064)进行咨询。
参考资料:
华为官方开发指南
https://developer.huawei.com/consumer/cn/doc/harmonyos-guides/arkts-global-interface
鸿蒙生态应用开发白皮书
https://developer.huawei.com/consumer/cn/doc/guidebook/harmonyecoapp-guidebook-0000001761818040
相关链接:
[1] 接入鸿蒙应用
https://help.aliyun.com/zh/arms/user-experience-monitoring/access-harmonyos-application