HarmonyOS 鸿蒙Next埋点探究

HarmonyOS 鸿蒙Next埋点探究

背景

大多数软件产品上线前,都会采用有规则的日志来对软件进行相关数据的采集,这个过程称为:埋点,采集的数据主要用于产品分析。

埋点技术已在PC端, 移动端非常成熟,并且有大批量以此为生的公司。

本篇将探究一下HarmonyOS中的埋点,目标是统计用户浏览页面轨迹

准备

  • 了解移动端的埋点技术方案
  • 了解HarmonyOS页面生命周期

声明周期

先回顾一下有关页面显示的生命周期

UIAbility

在HarmonyOS中这个算是一个页面容器,因为它仅仅加载带@Entry装饰的自定义组件,几乎所有和业务相关的逻辑都是从自定义组件中触发。

这个容器共有四个状态,创建(Create),回到前台(Foreground), 回到后台(Background), 销毁(Destrory)

状态 Create Foreground Background Destroy
API接口 onCreate onForeground() onBackground() onDestroy()

@Entry修饰的自定义组件

在HarmonyOS中的业务页面,实际上指的就是这个。这个对移动端的Web开发人员 ,React Native开发人员,Flutter开发人员比容易接受。

注意:这种自定义组件的生命周期,容易产生混淆

@Entry 修饰

总共有三个生命周期接口

@Component 修饰

预研小结

  • 对于UIAbility的生命周期监测,可以监听事件‘abilityLifecycle‘事件,进而实现应用全局监测
  • 对于@Entry修饰的组件生命周期监测,目前还没有可统一监听的事件,只能手动在相应的方法中添加埋点

本篇探究的对象就是针对@Entry修饰的组件,实现生命周期的统一监听

探究

1)注解/装饰器方案

HarmonyOS 应用研发语言ArkTS,是基于TypeScript扩展而来,因此,理论上是可以自定义装饰器来完成对函数执行时的统计。

TypeScript装饰器可以了解一下

准备代码

定义一个统计方法
export function Harvey(params?: string) {
  return function(target:any, methodName:any, desc:any){
    console.log(params);
    console.log(JSON.stringify(target));
    console.log(JSON.stringify(methodName));
    console.log(JSON.stringify(desc));
  }
}
布局测试页面
[@Entry](/user/Entry)
[@Component](/user/Component)
struct RadomIndex {
 
  @Harvey('注解-aboutToAppear')
  aboutToAppear(){
     console.log('方法内-aboutToAppear')
  }

  @Harvey('注解-aboutToDisappear')
  aboutToDisappear(){
    console.log('方法内-aboutToDisappear')
  }

  @Harvey('注解-onPageShow')
  onPageShow(){
    console.log('方法内-onPageShow')
  }

  @Harvey('注解-onPageHide')
  onPageHide(){
    console.log('方法内-onPageHide')
  }

  @Harvey('注解-onBackPress')
  onBackPress(){
    console.log('方法内-onBackPress')
  }

  @Harvey('注解-build')
  build() {
     ......
  }
}

运行效果

日志分析

  • 所有的生命周期上的装饰器方法全部跑了一遍,即 “注解-” 开头的日志
  • 生命周期API最后运行,即 “方法内-” 开头的日志

2)TypeScript AST

结论

这种方案暂时没有尝试成功

相关链接

3) 脚本硬插入代码

这个方案比较原始,属于最笨的方法。

适用编译场景: 打包机编译

原因:编译前会直接修改源文件

大概流程如下

最终效果

尝试

创建埋点文件
import common from '@ohos.app.ability.common';

export default class PageLifecycle{

  public static record(uiContext: common.UIAbilityContext, fileName: string,  funName: string){
    console.log('埋点:' + uiContext.abilityInfo.bundleName + ' -> ' + uiContext.abilityInfo.moduleName +
    ' -> ' + uiContext.abilityInfo.name + ' -> ' + fileName + ' -> ' + funName)
  }

}
插入时机
entry 模块中的 hvigorfile.ts

注意: hvigorfile.ts 文件中提示文件不能修改,暂时不用去关心它

脚本代码
import * as fs from 'fs';
import * as path from 'path';

const INSERT_FUNCTION: string[] = [
  'aboutToAppear',
  'aboutToDisappear',
  'onPageShow',
  'onPageHide',
  'onBackPress'
]

const PAGELIFECYCLE_NAME = 'PageLifecycle.ets'

//开始复制埋点文件
copyConfigFile(process.cwd() + `/Project/${PAGELIFECYCLE_NAME}`, __dirname + `/src/main/ets/${PAGELIFECYCLE_NAME}`)

//遍历所有带[@Entry](/user/Entry)装饰器的自定义组件
findAllPagesFiles(__dirname + '/src/main/ets/', __dirname + '/src/main/ets/', PAGELIFECYCLE_NAME);

结尾

内容不多,祝你好运


更多关于HarmonyOS 鸿蒙Next埋点探究的实战教程也可以访问 https://www.itying.com/category-93-b0.html

1 回复

更多关于HarmonyOS 鸿蒙Next埋点探究的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html


HarmonyOS Next的埋点机制主要用于收集用户行为数据,以优化应用性能和用户体验。开发者可以通过埋点记录用户操作、页面访问、事件触发等信息。埋点数据通常通过SDK集成到应用中,支持自定义事件和属性,确保数据采集的灵活性和准确性。采集的数据会上传到服务器进行分析,帮助开发者了解用户行为模式,优化产品功能。埋点过程中需注意用户隐私保护,确保数据采集符合相关法律法规。

回到顶部