基于Android终端的用户数据采集的方法及系统与流程

文档序号:15462220发布日期:2018-09-18 18:26阅读:741来源:国知局

本申请涉及Android终端技术领域,特别是涉及一种基于Android终端的用户数据采集的方法及系统。



背景技术:

近年来,移动终端的用户逐年增加,用户数已远远超过PC,并且人们已经习惯用移动终端的app来帮助完成生活和工作中的各种问题,比如聊天,购物,支付等等。对于特定的app,通过用户分析,可以深度挖掘用户在使用该app过程中的需求,从而给用户提供更好的体验。

目前,基于Android终端的关于用户行为的用户数据采集,一般是通过软件开发人员在需要采集数据的事件触发位置进行手动多次多点的添加事件代码来实现的。

这种方式存在的弊端是:由于用户的行为非常多,并且Android app实现的功能也越来越多,因此,软件开发人员需要添加的代码就会非常多,并且,大部分都是重复代码,比如一个点击事件的代码,app的每个页面都有点击事件,那么软件开发人员就需要在每个页面触发点击事件的位置添加上重复的数据采集代码。这使软件开发人员陷入繁杂重复的添加采集数据代码的工作中。



技术实现要素:

本申请旨在提出一种基于Android终端的用户数据采集的方法及系统,基于本发明,能够对用户行为的用户数据进行高效自动的采集。

根据本申请的一个方面,提供了一种基于Android终端的用户数据采集的方法,包括如下步骤:在Android系统对APP编译阶段,采用动态代理java agent,与编译器进行交互,指示编译器通过修改目标class文件添加预定事件埋点并生成对应该事件的机器代码,完成对用户数据采集。

可选地,上述Android终端的用户数据采集的方法中,当编译开始时,通过插件启动所述动态代理java agent。

可选地,上述Android终端的用户数据采集的方法中,包括如下步骤:在所述Android系统开始编译APP时,通过gradle插件启动动态代理java agent;所述java agent修改目标class文件;判断是否修改成功,若是,则编译成功,无埋点成功;若否,则编译成功,无埋点失败;在埋点成功的情况下,基于被修改的目标class文件,进行用户数据采集。

可选地,上述Android终端的用户数据采集的方法中,所述java agent修改目标class文件包括如下步骤:创建InvocationHandler实例;将所述InvocationHandler实例赋值给SecurityManager.class的packageAccessLock变量;令ProcessBuilder类通过反射获取所述InvocationHandler的实例;ProcessBuilder类执行start方法,启动dx.bat的进程;使用ClassFileTransformer来实现对com.android.dx.command.dexer.Main类的processClass方法进行修改;将修改好的目标Class文件编译成dex文件。

可选地,上述Android终端的用户数据采集的方法中,通过ASM使ClassFileTransformer实现对com.android.dx.command.dexer.Main类的processClass方法进行修改。

第二方面,本发明还公开了一种基于Android终端的用户数据采集的系统,包括:用于在Android系统对APP编译阶段,采用动态代理java agent,与编译器进行交互,指示编译器通过修改目标class文件添加预定事件埋点并生成对应该事件的机器代码,完成对用户数据采集。

可选地,上述基于Android终端的用户数据采集的系统中,当编译开始时,通过插件启动所述动态代理java agent。

可选地,上述基于Android终端的用户数据采集的系统中,包括:启动单元、修改单元、判断单元和采集单元。其中,启动单元用于在所述Android系统开始编译APP时,通过gradle插件启动动态代理java agent;修改单元用于所述java agent修改目标class文件;判断单元用于判断是否修改成功,若是,则编译成功,无埋点成功;若否,则编译成功,无埋点失败;采集单元用于在埋点成功的情况下,基于被修改的目标class文件,进行用户数据采集。

可选地,上述基于Android终端的用户数据采集的系统中,所述修改单元包括:实例创建子单元、赋值子单元、实例反射获取子单元、进程启动子单元、修改子单元和编辑子单元。其中,实例创建子单元用于创建InvocationHandler实例;赋值子单元用于将所述InvocationHandler实例赋值给SecurityManager.class的packageAccessLock变量;实例反射获取子单元用于反射令ProcessBuilder类通过反射获取所述InvocationHandler的实例;进程启动子单元用于ProcessBuilder类执行start方法,启动dx.bat的进程;修改子单元用于使用ClassFileTransformer来实现对com.android.dx.command.dexer.Main类的processClass方法进行修改;编辑子单元用于将修改好的目标Class文件编译成dex文件。

可选地,上述基于Android终端的用户数据采集的系统中,通过ASM修改目标class文件。

本申请在进行用户行为数据的采集时,不是通过软件开发人员在需要采集数据的事件触发位置进行手动多次多点的添加事件代码来实现,而是在机器对软件程序代码的编译阶段,采用动态代理java agent,与编译器进行交互,指示编译器通过修改目标class文件添加预定事件埋点并生成对应该事件的机器代码,完成对用户数据采集。由此可见,本申请在进行用户数据采集时,从编码阶段改变为编译阶段,由手动多次多点添加事件代码改为机器自动添加事件代码,因此,将软件开发人员从繁重的添加采集数据代码的工作中解放出来,让其能全身心投入到核心的开发工作中去。

并且,需要指出的是,由于编译阶段的代码具有高度集成化的特点,可以用编译阶段很少的代码实现编码阶段较多代码的工作,故,本申请效率非常高。

根据下文结合附图对本申请的具体实施例的详细描述,本领域技术人员将会更加明了本申请的上述以及其他目的、优点和特征。

附图说明

后文将参照附图以示例性而非限制性的方式详细描述本申请的一些具体实施例。附图中相同的附图标记标示了相同或类似的部件或部分。本领域技术人员应该理解,这些附图未必是按比例绘制的。附图中:

图1是根据本申请基于Android终端的用户数据采集的方法第一实施例的步骤流程图;

图2是根据本申请基于Android终端的用户数据采集的方法第二实施例的步骤流程图;

图3是根据本申请基于Android终端的用户数据采集的系统第一实施例的结构框图;

图4是根据本申请基于Android终端的用户数据采集的系统第一实施例中个,修改单元的结构框图;

图5是根据本申请一个实施例的计算机设备的示意图;

图6是根据本申请一个实施例的计算机可读存储介质的示意图。

具体实施方式

根据下文结合附图对本申请的具体实施例的详细描述,本领域技术人员将会更加明了本申请的上述以及其他目的、优点和特征。

为了更好的理解对如下术语进行解释。

Android终端:使用Android开源系统的硬件终端。

事件触发位置:对于Android终端,所谓事件指用户在屏幕上的所有操作都被标记为一种事件类型,这样系统就能识别用户的操作的具体意义,当某种类型事件被触发时系统就会及时响应用户的操作。这个响应用户操作的位置,称为事件触发位置。

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

ASM:字节码操作工具,可以用来改造class文件。

下面结合几个实施例,对上述过程做进一步地说明。

第一方面,本发明提供了一种基于Android终端的用户数据采集的方法实施例。

参照图1,图1是根据本申请基于Android终端的用户数据采集的方法第一实施例的步骤流程图,包括如下步骤:

步骤S110,Android studio开始编译app;

步骤S120,通过gradle的配置文件启动gradle插件;

步骤S130,gradle插件启动java agent程序;

步骤S140,java agent程序修改目标class文件;

步骤S150,判断是否修改成功,若是,则编译成功,无埋点成功;若否,则编译成功,无埋点失败;

步骤S160,利用修改好的目标class文件,进行用户数据采集。

本实施例中,在Android系统对APP编译阶段,采用动态代理技术,与编译器进行交互,指示编译器通过修改目标class文件添加预定事件埋点并生成对应该事件的机器代码,进行对用户数据采集。

参照图2,图2是根据本申请基于Android终端的用户数据采集的方法第二实施例的步骤流程图,包括如下步骤:

步骤S210,Android studio开始编译app;

步骤S220,通过gradle的配置文件启动gradle插件;

步骤S230,gradle插件启动java agent程序;

步骤S240,创建InvocationHandler实例,将所述InvocationHandler实例赋值给SecurityManager.class的packageAccessLock变量;

步骤S250,令ProcessBuilder类通过反射获取所述InvocationHandler的实例;

步骤S260,ProcessBuilder类执行start方法,启动dx.bat的进程;

步骤S270,通过ClassFileTransformer实现对com.android.dx.command.dexer.Main类的processClass方法进行修改;

步骤S280,将修改好的目标Class文件编译成dex文件。

步骤S290,在修改成功的情况下,利用修改好的目标class文件,进行用户数据采集。

本实施例是在Android平台上通过java agent动态代理技术对Android app的编译期进行干预,实现修改目标class文件,从而实现用户数据采集。

具体过程是,当编译开始时,gradle插件负责启动agent。第一次启动agent是为了ProcessBuilder类的start方法启动dx.bat的进程时携带上需要启动的agent参数。

因为类是由AppClassLoader进行加载的,而ProcessBuilder类是由Bootstrap ClassLoader进行加载的,而Bootstrap ClassLoader处于AppClassLoader的上层。导致无法直接通过修改ProcessBuilder的command成员来达到二次启动agent。所以动态agent启动后,创建一个InvocationHandler实例并赋值给SecurityManager.class的packageAccessLock变量,这样ProcessBuilder类就可以通过反射获取InvocationHandler的实例。

第二次启动agent,是修改com.android.dx.command.dexer.Main类的processClass方法,此方法的第二个参数就是class的byte数组,需要在进入processClass方法的时候用ASM工具对class数组中的class文件进行修改,修改完成后再替换掉原有的参数,从而实现添加采集数据代码的目的。

从上述实施例可以看出:

本实施例的关键点在Android系统app编译过程中通过java agent机制对编译过程进行干预,通过ASM实现修改.class字节码文件,实现在编译期对class文件的修改来达到添加数据采集代码的目的。其中,有两点需要着重指出:

第一:通过SecurityManager.class的packageAccessLock变量来保存InvocationHandler实例,ProcessBuilder就能通过反射的方式来获取InvocationHandler实例。

第二:通过修改ProcessBuilder的command成员的值来使我们的agent能和dx.bat在同一个进程中,从而实现修改目标class的目的。

本实施例在进行用户行为数据的采集时,不是通过软件开发人员在需要采集数据的事件触发位置进行手动多次多点的添加事件代码来实现,而是在机器对软件程序代码的编译阶段,采用动态代理java agent,与编译器进行交互,指示编译器通过修改目标class文件添加预定事件埋点并生成对应该事件的机器代码,完成对用户数据采集。由此可见,本申请在进行用户数据采集时,从编码阶段改变为编译阶段,由手动多次多点添加事件代码改为机器自动添加事件代码,因此,将软件开发人员从繁重的添加采集数据代码的工作中解放出来,让其能全身心投入到核心的开发工作中去。

并且,需要指出的是,由于编译阶段的代码具有高度集成化的特点,可以用编译阶段很少的代码实现编码阶段较多代码的工作,故,本申请效率非常高。

第二方面,本发明还提供了一种基于Android终端的用户数据采集的系统实施例,该系统用于在Android系统对APP编译阶段,采用动态代理java agent,与编译器进行交互,指示编译器通过修改目标class文件添加预定事件埋点并生成对应该事件的机器代码,进行用户数据采集。

参照图3,给出了该系统的具体结构示意图。图3是根据本申请基于Android终端的用户数据采集的系统第一实施例的结构框图。本实施例基于Android终端的用户数据采集的系统包括:

启动单元30,用于在所述Android系统开始编译APP时,通过gradle插件启动动态代理java agent;

修改单元31,用于所述java agent修改目标class文件;

判断单元32,用于判断是否修改成功,若是,则编译成功,无埋点成功;若否,则编译成功,无埋点失败;

采集单元33,用于在埋点成功的情况下,基于被修改的目标class文件,进行用户数据采集。

本实施例中,在Android系统对app编译阶段,采用动态代理,与编译器进行交互,指示编译器通过修改目标class文件添加预定事件埋点并生成对应该事件的机器代码,进行对用户数据采集。

参照图3,图3是根据本申请基于Android终端的用户数据采集的系统第二实施例的结构框图。

修改单元包括:

实例创建子单元311,用于创建InvocationHandler实例;

赋值子单元312,用于将所述InvocationHandler实例赋值给SecurityManager.class的packageAccessLock变量;

实例反射获取子单元313,用于反射令ProcessBuilder类通过反射获取所述InvocationHandler的实例;

进程启动子单元314,用于ProcessBuilder类执行start方法,启动dx.bat的进程;

修改子单元315,通过ASM使ClassFileTransformer实现对com.android.dx.command.dexer.Main类的processClass方法进行修改;

编辑子单元316,用于将修改好的目标Class文件编译成dex文件

本实施例中,修改单元通过如下方式实现:在Android平台上通过java agent动态代理技术对Android app的编译期进行干预,实现修改目标class文件。

具体过程是,当编译开始时,gradle插件负责启动agent。第一次启动agent是为了ProcessBuilder类的start方法启动dx.bat的进程时携带上需要启动的agent参数。

因为类是由AppClassLoader进行加载的,而ProcessBuilder类是由BootstrapClassLoader进行加载的,而Bootstrap ClassLoader处于AppClassLoader的上层。导致无法直接通过修改ProcessBuilder的command成员来达到二次启动agent。所以动态agent启动后,创建一个InvocationHandler实例并赋值给SecurityManager.class的packageAccessLock变量,这样ProcessBuilder类就可以通过反射获取InvocationHandler的实例。

第二次启动agent,是修改com.android.dx.command.dexer.Main类的processClass方法,此方法的第二个参数就是class的byte数组,需要在进入processClass方法的时候用ASM工具对class数组中的class文件进行修改,修改完成后再替换掉原有的参数,从而实现添加采集数据代码的目的。

参照图5,本申请实施例还提供了一种计算机可读存储介质。处理器1110和存储器1120共同作为计算设备的组成部分。存储器1120中,设置有用于程序代码的空间1130,该空间1130上存储有用于执行根据本发明的方法步骤的程序。也就是说,该计算设备的可读存储介质上存储有计算机程序,该程序被图5中处理器1110执行。

参照图6,本申请实施例还提供了一种包含指令的计算机程序产品,在用于程序代码的存储单元中,设置有用于执行根据本发明的方法步骤的程序1131’,当该计算机程序产品在计算机上运行时,使得计算机执行图1或图2中的方法。

在上述实施例中,可以全部或部分地通过软件、硬件、固件或者其任意组合来实现。当使用软件实现时,可以全部或部分地以计算机程序产品的形式实现。所述计算机程序产品包括一个或多个计算机指令。在计算机加载和执行所述计算机程序指令时,全部或部分地产生按照本申请实施例所述的流程或功能。所述计算机可以是通用计算机、专用计算机、计算机网络、获取其他可编程装置。所述计算机指令可以存储在计算机可读存储介质中,或者从一个计算机可读存储介质向另一个计算机可读存储介质传输,例如,所述计算机指令可以从一个网站站点、计算机、服务器或数据中心通过有线(例如同轴电缆、光纤、数字用户线(DSL))或无线(例如红外、无线、微波等)方式向另一个网站站点、计算机、服务器或数据中心进行传输。所述计算机可读存储介质可以是计算机能够存取的任何可用介质或者是包含一个或多个可用介质集成的服务器、数据中心等数据存储设备。所述可用介质可以是磁性介质,(例如,软盘、硬盘、磁带)、光介质(例如,DVD)、或者半导体介质(例如固态硬盘SolidState Disk(SSD))等。

专业人员应该还可以进一步意识到,结合本文中所公开的实施例描述的各示例的单元及算法步骤,能够以电子硬件、计算机软件或者二者的结合来实现,为了清楚地说明硬件和软件的可互换性,在上述说明中已经按照功能一般性地描述了各示例的组成及步骤。这些功能究竟以硬件还是软件方式来执行,取决于技术方案的特定应用和设计约束条件。专业技术人员可以对每个特定的应用来使用不同方法来实现所描述的功能,但是这种实现不应认为超出本申请的范围。

本领域普通技术人员可以理解实现上述实施例方法中的全部或部分步骤是可以通过程序来指令处理器完成,所述的程序可以存储于计算机可读存储介质中,所述存储介质是非短暂性(英文:non-transitory)介质,例如随机存取存储器,只读存储器,快闪存储器,硬盘,固态硬盘,磁带(英文:magnetic tape),软盘(英文:floppy disk),光盘(英文:optical disc)及其任意组合。

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

当前第1页1 2 3 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1