ARMS用户体验监控提供了鸿蒙(HarmonyOS)SDK用于监控鸿蒙应用。本文介绍如何集成HarmonyOS SDK并将应用接入用户体验监控。
版本要求
Stage应用的compatibleSdkVersion不低于5.0.0(12)。
步骤一:创建应用
登录ARMS控制台。
在左侧导航栏选择
,并在顶部菜单栏选择目标地域。在应用列表页面单击添加应用。
在创建应用面板单击HarmonyOS。
在HarmonyOS面板输入应用名称,并根据需求配置其他参数,然后单击创建。
说明应用名称唯一,不能与已创建的应用名称重复。
创建成功后,当前应用将会自动生成对应的ConfigAddress(上报地址)和AppID。
步骤二:集成 SDK
鸿蒙 RUM SDK 已发布到第三方仓库中,在工程 oh-package.json5 的 dependencies 中添加 sdk har 包依赖,配置如下:
"dependencies": { "@alibabacloud_rum/harmony_sdk": "1.0.0" }
依赖设置完成后,需要执行 ohpm install 命令安装依赖包,依赖包会安装到工程的 oh_modules 目录下。
ohpm clean ohpm install
Rebuild 项目,确保配置生效。
步骤三:配置 SDK
1. 配置授权信息
检查应用程序 module.json5 配置文件,确保已引入如下授权:
ohos.permission.INTERNET 发送网络数据
ohos.permission.GET_NETWORK_INFO 获取网络状态信息
2. 配置 ohmurl 规则
将工程级或模块级 build-profile.json5 中的 useNormalizedOHMUrl 修改为 true,若没有该配置项请手动添加。
{
"app" : {
"products": [{
"buildOption": {
"strictMode": {
"useNormalizedOHMUrl": true
}
}
}]
}
}
3. 配置 hvigor 插件
Hvigor 插件与 SDK 搭配使用,用于在编译时将探针代码注入到您的鸿蒙应用中。
该插件作用于网络采集,目前支持采集的网络框架有:
hms.collaboration.rcp
ohos.net.http
ohos.net.webSocket
ohos.net.socket.TCPSocket
如果您工程中没有使用如上网络库,可以不安装插件。
添加依赖声明。
在工程下的 hvigor/hvigor-config.json5 中添加插件依赖:
{ "dependencies": { "@arms/rum-harmonyos-plugin": "^1.0.3" } }
安装依赖。
方式1:执行编辑区右上角 Sync Now 或执行菜单
进行工程Sync,DevEco Studio将会根据hvigor-config.json5中的依赖配置自动安装。方式2:使用 hvigorw 命令行工具执行任一命令,命令行工具会自动执行安装构建依赖。
hvigorw --sync
(必要)创建配置文件。
在您的项目根目录下创建一个名为
alibabaCloudRumConfig.txt
的配置文件。该文件用于指定插件需要处理和忽略的源码范围。文件内容需要配置:-hook
:指定需要处理的目录或文件。插件将扫描并处理这些路径下的源码文件。-keep
:指定需要排除(即不处理)的目录或文件。即使 hook 包含了这部分路径,keep 指定的路径也会被跳过。即网络采集仅在配置的 hook 路径下生效。
示例:
# 指定需要处理的 ets 源码根目录 -hook ./src/main/ets/ # 指定不处理 hook 目录下的任何文件 -keep ./src/main/ets/hook/
将插件添加到您的模块构建配置文件 hvigorfile.ts 中。
// 引入插件 import { AlibabaCloudRumPlugin } from '@arms/rum-harmonyos-plugin'; // 在你的构建配置中 export default { plugins: [ // 添加插件实例,注意这里需要调用函数 AlibabaCloudRumPlugin() ] };
4. 初始化 SDK
方式一(推荐)
在入口 entry moudle 自定义 AbilityStage 中的 onCreate 函数中,添加如下代码。
AlibabaCloudRum.withAppID("${your_appid}") // AppID 在步骤一创建 RUM 应用时获取 .withConfigAddress("${your_configAddress}") // ConfigAddress 在步骤一创建 RUM 应用时获取 .start(this.context.getApplicationContext()); //获取 application 上下文
代码示例:
import AbilityStage from '@ohos.app.ability.AbilityStage' import { AlibabaCloudRum } from '@alibabacloud_rum/harmony_sdk' export default class EntryAbilityStage extends AbilityStage { onCreate() { this.initAlibabaCloudRumSdk(); } private initAlibabaCloudRumSdk() { AlibabaCloudRum.withAppID("eou*****@*****98678c") .withConfigAddress("https://******") .start(this.context.getApplicationContext()); } }
方式二
如果由于App自身业务逻辑,不能在自定义 AbilityStage 的 onCreate 生命周期进行 SDK 初始化。可以考虑在第一个页面加载的生命周期内进行 SDK 的初始化。此时在页面加载前 APP 发生的行为 SDK 采集不到是符合预期的。在第一个页面加载的生命周期内,添加如下代码:
AlibabaCloudRum.withAppID("${your_appid}") // AppID 在步骤一创建 RUM 应用时获取 .withConfigAddress("${your_configAddress}") // ConfigAddress 在步骤一创建 RUM 应用时获取 .withUiContext(this.getUIContext()) //获取 uiContext 上下文 .start(getContext(this).getApplicationContext()) //获取 application 上下文
代码示例:
import { AlibabaCloudRum } from '@alibabacloud_rum/harmony_sdk'; @Entry @Component struct MainPage { aboutToAppear(): void { AlibabaCloudRum.withAppID("eou*****@*****98678c") .withConfigAddress("https://******") .withUiContext(this.getUIContext()) .start(getContext(this).getApplicationContext()) } build() { } }
5. 数据采集
目前鸿蒙 SDK 支持对部分数据的无感知采集,其中对三方网络库 axios 和 webview 的采集需要手动埋点,具体步骤参考如下。
Axios 网络采集
(可选配置)端对端的全链路打通需要在请求头中插入Alibaba的自定义业务请求头,如不需要全链路业务可跳过此步骤。注意,若使用端对端全链路打通功能,需要事先在控制台配置 host 白名单,具体操作请参见 App监控关联前后端Trace。
重要每条网络请求自定义头都需要重新获取赋值,非同一个requestUrl的API调用结果不要复用!
function getInsertHeaderMap(requestUrl: string): Map<string, string> | undefined
参数
是否必要
说明
参数限制
失败结果
requestUrl
必要
请求URL
String类型。有效请求地址
当次获取无效
//示例通过`AxiosRequestConfig`插入请求头,您也可以通过实现请求拦截器处理`InternalAxiosRequestConfig.headers`进行插头操作 import axios, { AxiosError, AxiosHeaders, AxiosResponse, AxiosRequestConfig, InternalAxiosRequestConfig } from '@ohos/axios' import { AlibabaCloudRumTrace } from '@alibabacloud_rum/harmony_sdk' let customHeaders: AxiosHeaders = new AxiosHeaders() let traceHeader = AlibabaCloudRumTrace.axios.getInsertHeaderMap("https://www.example.com"); if (traceHeader) { traceHeader.forEach((value: string, key: string) => { customHeaders.set(key, value); }) } // 通过AxiosRequestConfig插入到实际请求头中 let requestConfig: AxiosRequestConfig = { method: this.currMethod, headers: customHeaders, params: this.currRequestParam } axios.get("https://www.example.com", requestConfig);
(必要配置)采集正常/异常网络数据。
function handleSuccess(requestUrl: string, method: string, responseCode: number, requestDataSizeByte?: number, downloadSizeByte?: number, timingParam?: object, remoteAddressIP?: string, requestHeader?: Record<string, Object>, responseHeader?: Record<string, Object>, resourceType?: string, requestBody?: string)
参数说明:
参数
是否必要
说明
参数限制
失败结果
requestUrl
必要
请求URL
String类型。有效请求地址
当次网络事件不采集
method
必要
请求方法
String类型。非HTTP请求方法,传空字符串即可
当次网络事件不采集
responseCode
必要
响应码
Number类型
当次网络事件不采集
requestDataSizeByte
可选
请求上传数据大小
Number类型(单位Byte)
当次网络事件不采集
downloadSizeByte
可选
下载大小
Number类型(单位Byte)
当次网络事件不采集
timingParam
可选
axios 请求各个阶段所花费的时间
http.PerformanceTiming类型
当次网络事件不采集
remoteAddressIP
可选
目标地址IP
String类型
当次网络事件缺失相关字段
requestHeader
可选
请求Header,当需要使用链路打通功能,此参数需要必传
Record类型
当次网络事件缺失相关字段
responseHeader
可选
响应header
Record类型
当次网络事件缺失相关字段
resourceType
可选
资源类型
String类型。遵循MIME类型的Content-Type字段
当次网络事件缺失相关字段
requestBody
可选
请求内容
String类型
当次网络事件缺失相关字段
采集异常网络数据:
function handleError(requestUrl: string, method: string, requestDataSizeByte: number, errorParam: Error,requestHeader?: Record<string, Object>)
参数
是否必要
说明
参数限制
失败结果
requestUrl
必要
请求URL
String类型。有效请求地址
当次网络事件不采集
method
必要
请求方法
String类型。非HTTP请求方法,传空字符串即可
当次网络事件不采集
requestDataSizeByte
必要
请求上传数据大小
Number类型(单位Byte)
当次网络事件不采集
errorParam
必要
网络Error错误
BusinessError类型
当次网络事件不采集
requestHeader
可选
请求header
Record类型
当次网络事件缺失相关字段
示例如下:
axios.get("http://www.example.com",requestConfig).then((responseData: AxiosResponse) => { AlibabaCloudRumTrace.axios.handleSuccess("http://www.example.com", "GET", responseData.status, requestDataSize, downloadSize, responseData.performanceTiming); }).catch((err: BusinessError) => { AlibabaCloudRumTrace.axios.handleError("http://www.example.com", "GET", 0, err); });
Webview 数据采集
在 Web 组件的生命周期回调中添加 SDK 采集逻辑,具体如下:
插入js脚本:
在
javaScriptOnDocumentStart
的参数中,添加AlibabaCloudRumTrace.Web.getScriptItem()
。在 onPageEnd 生命周期埋点:
在
onPageEnd
中添加AlibabaCloudRumTrace.Web.onPageEndHilt(this.controller);
。在卸载组件时销毁 SDK 相关采集资源:
在
onDisAppear
中添加AlibabaCloudRumTrace.Web.onDisAppearHilt(this.controller)
。
代码示例:
import { AlibabaCloudRumTrace } from '@alibabacloud_rum/harmony_sdk';
Web()
.javaScriptOnDocumentStart([AlibabaCloudRumTrace.Web.getScriptItem()])
.onPageEnd(() => {
AlibabaCloudRumTrace.Web.onPageEndHilt(this.controller);
// this.controller:必须是当前Web绑定的WebviewController
})
.onDisAppear(() => {
AlibabaCloudRumTrace.Web.onDisAppearHilt(this.controller);
// this.controller:必须是当前Web绑定的WebviewController
})
合规说明
应用的数据合规非常重要,您须确保按照当前法律法规或监管要求使用用户体验监控SDK服务,为避免因数据合规问题导致的应用下架,请您务必做好以下三步:
请务必确保您已经将用户体验监控SDK升级到满足监管新规的最新版本。
请务必在《隐私权政策》中向用户告知使用了用户体验监控SDK,参考条款如下:
使用SDK名称:用户体验监控SDK
服务类型:SDK服务
使用目的:采集应用体验数据,用于应用性能问题统计与分析
收集个人信息类型:用户信息、应用信息、设备信息、流量信息、设备状态信息、网络状态信息
请务必做延迟初始化配置,确保用户授权《隐私权政策》后再初始化用户体验监控SDK。
请您务必按照如上提示合规使用用户体验监控SDK服务,因您未合规使用SDK服务所导致的风险由您自行承担,并承担因此对用户体验监控带来的损失。
更多说明,请参见用户体验监控SDK隐私合规书写说明。