一种移动端无码埋点解决方法
技术领域
本发明涉及APP应用程序处理相关技术领域,尤其是指一种移动端无码埋点解决方法。
背景技术
在智能手机高速发展的今天,安卓手机机型和系统的多样性,同一个App在市场中需要面临各种手机机型的挑战。手机程序在运行中出现异常数据也时有发生。为了帮助开发者快速定位问题,在程序运行中埋点也成了追踪问题的方式之一。埋点:为了记录程序的执行动作或结果数据而做的统计。
现有的Android App开发埋点需要开发者在开发过程中,手动在一些程序函数中加入统计代码,上报给服务器端。一旦服务器端想要统计新的埋点数据,就不得不通过发布新的app版本来实现,且app的版本迭代需要较长的周期,无法满足快速实统计数据验证程序问题的需求。
发明内容
本发明是为了克服现有技术中存在上述的不足,提供了一种自动实现埋入上报的移动端无码埋点解决方法。
为了实现上述目的,本发明采用以下技术方案:
一种移动端无码埋点解决方法,具体包括如下步骤:
(1)在安卓系统app端接入信息上报模块;
(2)通过编译期无码插桩技术对app中所有函数的进入和退出插入代码片段,并为每个函数生成不一样的标识符用于区分;
(3)在服务器端配置需要上报的唯一埋点标识符,在app启动时获取服务器需要上报埋点标识符,保存到本地文件A中;
(4)app程序运行时,每个函数在进入和退出时,会先运行插桩的代码块,根据判断是否和本地文件A中需要上报的埋点标识符相符合,如果符合则整合函数标识符和函数的参数或者返回结果,上报到服务器端;
(5)服务器端根据app端上报的数据,分析是否函数运行异常。
其中:无码指的是不需要开发者在开发过程手动编写代码。插桩指的是在保证程序原有逻辑完整性的基础上,在程序中插入一些代码片段。本方法解决的问题就是帮助开发者实现无码埋点,在代码编译期就自动实现埋入上报代码,帮助开发者让App能够根据服务器配置快速开始统计app程序动作或结果数据,协助开发者统计数据查找问题。
作为优选,在步骤(1)中,具体操作方法为:新建日志类LogReportUtil.java,添加静态函数reportLog用于将采集到的程序运行信息发送给服务器。
作为优选,在步骤(2)中,具体操作方法为:通对Gradle编译期Transform任务的Hook,在transform中创建ClassVisitor,即可对所有类文件进行编译期字节码无码插桩,利用对ClassVisitor中的onMethodEnter和onMethodExit的自定义处理,成功的对App工程所有函数的进入和退出分别插入代码片段,标识符组成方式:包路径+类名+方法名+参数。
作为优选,在步骤(3)中,具体操作方法为:在服务器端配置需要统计的函数标识符,在App启动时,通过向服务器发送请求,获取需要上报的函数标识符列表,保存到LogReportUtil类中的configs变量中,这样在调用到LogReportUtil.reportLog方法时,则会根据是否存在configs中来处理是否需要发送给服务器。
作为优选,在步骤(4)中,具体操作方法为:程序运行时,每个函数在进入或退出时,会先运行插桩的代码LogReportUtil.reportLog,当符合服务器配置时,此时则会向服务器发送程序运行数据,通过该方式,让客户端只采集服务器配置的程序数据,根据需要对上报数据进行方便的调整。
作为优选,在步骤(5)中,具体操作方法为:服务器在收到客户端发送的程序运行数据时,会将数据写入到服务器文件中,通过分析服务器文件每个函数的日志次数,分析程序每个功能的运行频率,如果程序运行发生异常,通过匹配服务器文件中每个方法是否包含进入和退出数据,定位出只有进入但是没有退出的异常函数,然后再对日志中该函数的输入参数分析,更方便的找出程序异常原因。
本发明的有益效果是:帮助开发者实现无码埋点,在代码编译期就自动实现埋入上报代码,帮助开发者让App能够根据服务器配置快速开始统计app程序动作或结果数据,协助开发者统计数据查找问题。
具体实施方式
下面结合具体实施方式对本发明做进一步的描述。
一种移动端无码埋点解决方法,具体包括如下步骤:
(1)在安卓系统app端接入信息上报模块;具体操作方法为:新建日志类LogReportUtil.java,添加静态函数reportLog用于将采集到的程序运行信息发送给服务器。
(2)通过编译期无码插桩技术对app中所有函数的进入和退出插入代码片段,并为每个函数生成不一样的标识符用于区分;具体操作方法为:通对Gradle编译期Transform任务的Hook,在transform中创建ClassVisitor,即可对所有类文件进行编译期字节码无码插桩,利用对ClassVisitor中的onMethodEnter和onMethodExit的自定义处理,成功的对App工程所有函数的进入和退出分别插入代码片段LogReportUtil.reportLog(true,methosMsg,paramMsg)和LogReportUtil.reportLog(false,methosMsg,paramMsg),其中methodMsg为用于区分函数的标识符,paramMsg为函数进入时传入的参数或返回时的result;标识符组成方式:包路径+类名+方法名+参数。(如:com/test/TestClass.testMethod$[Ljava/lang/String;]V和com/test/TestClass.testMethod$[Ljava/lang/String;]V分别作为类TestClass中函数testMethod的函数标识符,这样在程序运行进入和退出函数时,便会往文件methodlog.txt中写入信息entry:com/test/TestClass.testMethod$[Ljava/lang/String;]V:paramMsg和exit:com/test/TestClass.testMethod$[Ljava/lang/String;]V:paramMsg)。
(3)在服务器端配置需要上报的唯一埋点标识符,在app启动时获取服务器需要上报埋点标识符,保存到本地文件A中;具体操作方法为:在服务器端配置需要统计的函数标识符(如:com/test/TestClass.testMethod$[Ljava/lang/String;]V),在App启动时,通过向服务器发送请求,获取需要上报的函数标识符列表,保存到LogReportUtil类中的configs变量中,这样在调用到LogReportUtil.reportLog方法时,则会根据是否存在configs中(即是否服务器配置需要监控)来处理是否需要发送给服务器。
(4)app程序运行时,每个函数在进入和退出时,会先运行插桩的代码块,根据判断是否和本地文件A中需要上报的埋点标识符相符合,如果符合则整合函数标识符和函数的参数或者返回结果,上报到服务器端;具体操作方法为:程序运行时,每个函数在进入或退出时,会先运行插桩的代码LogReportUtil.reportLog,当符合服务器配置时,此时则会向服务器发送程序运行数据(如entry:com/test/TestClass.testMethod$[Ljava/lang/String;]V:hello和exit:com/test/TestClass.testMethod$[Ljava/lang/String;]V:welcome),通过该方式,让客户端只采集服务器配置的程序数据,根据需要对上报数据进行方便的调整。
(5)服务器端根据app端上报的数据,分析是否函数运行异常:具体操作方法为:服务器在收到客户端发送的程序运行数据时,会将数据写入到服务器文件methodlog.txt中,通过分析服务器文件methodlog.txt每个函数的日志次数,分析程序每个功能的运行频率,如果程序运行发生异常,通过匹配服务器文件methodlog.txt中每个方法是否包含进入和退出数据,定位出只有进入但是没有退出的异常函数(即只有entry日志没有,exit日志的函数),然后再对日志中该函数的输入参数分析,更方便的找出程序异常原因。
具体实施例:
步骤1)设计信息上报模块,根据本地文件A中是否包含标识符为上报条件;在服务器配置需要监听的函数标识符:com/test/TestClass.testMethod$[Ljava/lang/String;]V;
步骤2)依赖安卓插桩插件,实现编译期对app中所有函数的进入和退出插入代码片段,并为每个函数生成字符串,以包路径加类名加方法名作为唯一标识符;
步骤3)生成APK安装,启动app从服务器获取需要上报的配置,并保存到本地文件A中;当App运行时,调用到函数TestClass.testMethod2()时,由于该函数未在服务器监控配置中,所以并不会发送函数testMethod2执行数据到服务器,所以服务器文件文件methodlog.txt不会统计testMethod2信息;
步骤4)在app运行期每次进入函数或退出函数时,都检测该函数的唯一标识符是否可以在配置文件中找到,如果找到,则向服务器上报该唯一标识符信息和函数的入参信息和结果数据;当App调用到函数TestClass.testMethod且传参为“9”时,服务器文件methodlog.txt中可以看到信息有entry和exit发现函数正常运行。当App调用到函数TestClass.testMethod且传参为”ab”时,服务器文件methodlog.txt中可以看出函数testMethod只有entry而没有exit,可以分析出函数异常退出,且传参为“ab”,通过对参数分析,可以找到异常原因,即Integer.parseInt无法处理非数字字符串。当App调用到函数TestClass.testMethod随机次数且传参为“6”后,服务器文件methodlog.txt中通过entry和exit的匹配可以分析出该函数一共使用的次数。
步骤5)服务器根据客户端上报的入参数据和结果数据,进行预期数据的对比,判断是否处于正常运行状态。通过测试可以发现,App可以根据服务器配置,对服务器想要采集的程序数据进行上报。对APP发送给服务器的程序运行数据埋点分析,可以有效的判断功能进入的频率以及是否处于正常运行状态。