一种Android客户端通用自动埋点方法与流程

    专利2022-07-08  109


    本发明涉及客户端埋点技术领域,尤其是一种android客户端通用自动埋点方法。



    背景技术:

    为了了解客户端在运行过程中的各种状态以及用户使用过程中的各种行为特征,开发人员会在特定的逻辑中编写代码记录这样一些数据,最终上报至服务端。开发人员编写这些代码的行为,称为埋点。

    传统埋点方式为开发人员手动写入埋点逻辑到业务逻辑中,然后由测试人员验证是否正确,难免会出现各种问题,导致错误的埋点逻辑被带到线上环境,且需要一定的开发时间和测试时间,不仅增加人力成本,还会增加开发时长。除此之外,发版后若发现埋点错误无法及时修复或者需新增埋点,必须通过热修复和重新发版的方式进行解决,这就需要一个时间周期才能覆盖足够多的用户,时效性较差。埋点代码分散,不易统一维护。

    为解决传统埋点的技术问题,本领域技术人员提供一种自动埋点方案,现有的自动埋点方案是通过在页面创建时,往页面根节点插入一个自定义控件,把页面所有控件都移到这个自定义控件的子节点,然后遍历控件树,确定所有控件的唯一id,然后监听所有控件的点击事件,当控件被点击时,则上报对应的点击事件埋点。

    控件的唯一标识是控件在当前页面布局树的路径,即xpath,后台管理人员会把xpath绑定一个别名,方便非开发人员理解该控件位于页面的位置。而xpath可能在服务端接口返回不同数据时发生变化,导致埋点数据不准确。另外。新版本开发完成后,页面布局很大概率会有变化,老版本的xpath可能会对应到一个新的控件,导致之前后台管理人员绑定的别名跟实际对应的控件不相符,从而导致埋点数据发生错误。



    技术实现要素:

    为解决上述技术问题,本发明提供一种android客户端通用自动埋点方法。

    本发明提供如下技术方案:

    提供一种android客户端通用自动埋点方法,包括:gradle插件进行代码插桩;sdk进行埋点上报;网络接口进行埋点配置文件下发和埋点数据接收。

    其中,所述gradle插件进行代码插桩的过程包括:trace模块扫描所有编译生成的class文件;filter模块按照类名过滤不需要关注的类;所述trace模块使用asm解析class文件;所述filter模块按照方法名过滤不需要关注的方法;generate模块为每一个方法生成唯一标识,即mpath;所述generate模块为方法生成摘要;inject模块在方法的首行插入一段代码,用于获取方法的参数,上报给服务端;所述generate模块汇总所有方法的mpath及摘要,生成mpath.map文件。

    其中,所述sdk进行埋点上报的过程包括:在app启动时拉取埋点配置;当方法调用时,判断该方法是否在配置中;如果在配置中,则写入埋点信息,否则继续执行方法内部的逻辑;写入埋点时判断是否满足上报到服务端的条件,所述上报到服务端的条件是指每2分钟上报一次;若满足上报到服务端的条件,则上报埋点,否则继续执行方法内部的逻辑。

    其中,所述网络接口进行埋点配置文件下发和埋点数据接收的过程包括:服务端提供下发埋点配置和接收埋点数据的接口;所述服务端接收埋点数据后同步到数据仓库中以供清洗和后续计算。

    本发明所带来的有益效果:

    1.在android客户端开发过程中对代码无侵入,使代码更精简;

    2.无需开发者手动写入埋点逻辑,避免了手动编写容易出错的问题,保证埋点数据的准确性,同时节省开发时间,提升开发效率;

    3.自动完成代码插入,减少了人工成本;

    4.埋点配置通过服务端下发,更为灵活,可以随时新增埋点,即使配置错误,也可以及时修改,实时生效;

    5.修改埋点无需发版,可以短时间覆盖全量用户,提升时效性。

    附图说明

    为了更清楚地说明本发明实施例或现有技术中的技术方案,下面将对实施例或现有技术描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。

    图1是本发明的流程示意图;

    图2是本发明代码插桩的流程示意图;

    图3是本发明埋点上报的流程示意图。

    具体实施方式

    下面将结合本发明的附图,对本发明的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域普通技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。

    术语说明:

    groovy:是一种基于jvm,即java虚拟机的敏捷开发语言,它是一种成熟的面向对象编程语言,既可以用于面向对象编程,又可以用作纯粹的脚本语言。

    gradle:是一个项目自动化构建开源工具。它使用一种基于groovy的特定领域语言,即dsl来声明项目设置。

    gradle插件:可运行于gradle构建工具中的自定义任务。

    asm:字节码操作工具,可用于修改class文件。

    class文件:class文件全名称为javaclass文件,主要在平台无关性和网络移动性方面使java更适合网络。它在平台无关性方面的任务是:为java程序提供独立于底层主机平台的二进制形式的服务。

    sdk:软件开发工具包。

    mpath:是由方法的名称、方法的入参、方法的返回值,以及方法所在类的完整名称所构成,用于唯一标识一个方法。

    根据图1所示,说明本发明的一种android客户端通用自动埋点方法。本方案包含3个部分:

    第一,gradle插件:用于代码插桩。

    第二,埋点sdk:用于埋点上报。

    第三,网络接口:用于埋点配置文件下发和埋点数据接收。

    本发明的一种android客户端通用自动埋点方法,包括如下步骤:

    101:gradle插件进行代码插桩。

    gradle插件在编译android客户端代码时会运行。gradle插件包含5个模块:初始化模块、trace模块、filter模块、inject模块、generate模块。

    初始化模块是整个插件的入口,负责读取配置、初始化其它模块。

    trace模块负责遍历所有class文件,还用于回调用generate模块,生成方法的mpath和方法的签名,即方法所有指令的摘要,还用于调用filter模块的方法,过滤掉不需要关注的类和方法。

    filter模块用于过滤部分类和方法,比如类的构造函数、接口内定义的函数、虚函数、桥接函数或者一些第三方依赖包等,过滤通过判断包名、类名、方法名及参数的方式,支持可动态配置。

    inject模块负责字节码注入,通过asm框架实现,在每个方法的第一行注入一段代码,上报方法的入参以及方法的mpath。

    generate模块用于生成mpath文件,mpath文件内包含所有过滤后的方法的mpath,每一个app的版本对应一个mpath文件。版本升级时会把埋点配置文件跟新旧版本的mpath文件做比较,以检测是否有漏埋和错埋。

    如图2所示,gradle插件进行代码插桩的过程包括:

    1011:trace模块扫描所有编译生成的class文件。

    1012:filter模块按照类名过滤不需要关注的类。

    1013:trace模块使用asm解析class文件。

    1014:filter模块按照方法名过滤不需要关注的方法。

    1015:generate模块为每一个方法生成唯一标识,即mpath;generate模块为方法生成摘要;generate模块汇总所有方法的mpath及摘要,生成mpath.map文件。

    1016:inject模块在方法的首行插入一段代码,用于获取方法的参数,上报给服务端。

    102:sdk进行埋点上报。埋点上报由sdk完成,即sdk提供埋点上报的功能。sdk在app启动时通过服务端接口拉取配置文件,所述配置文件描述了需要上报埋点的方法,即配置文件描述了哪些方法需要上报埋点。gradle插件插入的代码,就是调用埋点sdk的上报埋点的方法。

    如图3所示,sdk进行埋点上报的过程包括:

    1021:在app启动时拉取埋点配置。

    1022:当方法调用时,判断该方法是否在配置中。

    1023:如果在配置中,则写入埋点信息,否则进行步骤1024。

    1024:继续执行方法内部的逻辑。

    1025:写入埋点时判断是否满足上报到服务端的条件,:上报到服务端的条件是指每2分钟上报一次。

    1026:若满足上报到服务端的条件,则上报埋点,否则进行步骤1024。

    103:网络接口进行埋点配置文件下发和埋点数据接收。

    网络接口进行埋点配置文件下发和埋点数据接收的过程包括:

    首先,服务端提供下发埋点配置和接收埋点数据的接口;

    然后,服务端接收埋点数据后同步到数据仓库中以供清洗和后续计算。

    能保证埋点数据准确性的同时,还能节省开发时间,且对代码没有侵入性。

    以上所述,仅为本发明的具体实施方式,但本发明的保护范围并不局限于此,任何熟悉本技术领域的技术人员在本发明揭露的技术范围内,可轻易想到变化或替换,都应涵盖在本发明的保护范围之内。因此,本发明的保护范围应所述以权利要求的保护范围为准。


    技术特征:

    1.一种android客户端通用自动埋点方法,其特征在于,包括:

    gradle插件进行代码插桩;

    sdk进行埋点上报;

    网络接口进行埋点配置文件下发和埋点数据接收。

    2.根据权利要求1所述的一种android客户端通用自动埋点方法,其特征在于,所述gradle插件进行代码插桩的过程包括:

    trace模块扫描所有编译生成的class文件;

    filter模块按照类名过滤不需要关注的类;

    所述trace模块使用asm解析class文件;

    所述filter模块按照方法名过滤不需要关注的方法;

    generate模块为每一个方法生成唯一标识,即mpath;

    所述generate模块为方法生成摘要;

    inject模块在方法的首行插入一段代码,用于获取方法的参数,上报给服务端;

    所述generate模块汇总所有方法的mpath及摘要,生成mpath.map文件。

    3.根据权利要求2所述的一种android客户端通用自动埋点方法,其特征在于,所述sdk进行埋点上报的过程包括:

    在app启动时拉取埋点配置;

    当方法调用时,判断该方法是否在配置中;

    如果在配置中,则写入埋点信息,否则继续执行方法内部的逻辑;

    写入埋点时判断是否满足上报到服务端的条件,所述上报到服务端的条件是指每2分钟上报一次;

    若满足上报到服务端的条件,则上报埋点,否则继续执行方法内部的逻辑。

    4.根据权利要求3所述的一种android客户端通用自动埋点方法,其特征在于,所述网络接口进行埋点配置文件下发和埋点数据接收的过程包括:

    服务端提供下发埋点配置和接收埋点数据的接口;

    所述服务端接收埋点数据后同步到数据仓库中以供清洗和后续计算。

    技术总结
    本发明提供了一种Android客户端通用自动埋点方法,本方案包含3个部分:第一,Gradle插件:用于代码插桩;第二,埋点SDK:用于埋点上报;第三,网络接口:埋点配置文件下发和埋点数据接收。在Android客户端开发过程中对代码无侵入,使代码更精简;无需开发者手动写入埋点逻辑,避免了手动编写容易出错的问题,保证埋点数据的准确性,同时节省开发时间,提升开发效率;自动完成代码插入,减少了人工成本;埋点配置通过服务端下发,更为灵活,可以随时新增埋点,即使配置错误,也可以及时修改,实时生效;修改埋点无需发版,可以短时间覆盖全量用户,提升时效性。

    技术研发人员:安骥航
    受保护的技术使用者:北京转转精神科技有限责任公司
    技术研发日:2020.11.27
    技术公布日:2021.03.12

    转载请注明原文地址:https://wp.8miu.com/read-22204.html

    最新回复(0)