应用程序运行监控方法、装置以及终端
技术领域
本发明涉及计算机技术领域,更具体地,涉及一种应用程序运行监控方法、装置以及终端。
背景技术
面向对象编程程序的信息带有隐蔽、封装性、继承性、多态性和动态绑定等特性,其使程序的质量更高,更使程序易于维护与修改。但是另一方面,它基于独立封装的类的代码构造,其代码的重用性高,降低了开发的效率,更是不利于业务的专业性,同时不利于程序的后续开发。这类方法会导致在应用程序运行时监控拦截获得生成数据需要大量的时间和运存,监控效率低下,同时对构造应用程序开发人员的专业性要求高,还要求开发人员对相应业务很熟悉,以上问题的存在使得基于面向对象思想构造的运行监控程序所获得的结果信息可信度较低。
发明内容
鉴于上述问题,本发明首要目的提出了一种应用程序运行监控方法,其采用面向切面的编程思想,构造应用程序调用类的拦截代码,提高了开发人员的生产力,缩短了开发周期,降低了开发成本。
本发明另一目的提出了一种应用程序运行监控装置。
本发明另一目的提出了一种应用程序运行监控终端。
第一方面,本发明提供一种应用程序运行监控方法,其包括如下步骤:在基于面向对象编程构造的所述应用程序的多个目标类中织入同一切面,以由该切面所映射的拦截代码接管所述多个目标类的共有代码的产生;将切面相对应的拦截代码与所述应用程序源代码一起进行编译,以重新生成所述应用程序;在运行重新生成的应用程序后,所述应用程序运行监控的结果信息均由其相应的切面相关的拦截代码的执行而确定。
结合第一方面,本发明在第一方面的第一种实现方式中,还包括步骤:获取所述应用程序源代码,拦截监控的多个目标类,从多个目标类中获取切面。
结合第一方面,本发明在第一方面的第二种实现方式中,所述在基于面向对象编程构造的所述应用程序的多个目标类中织入同一切面的步骤为将所述应用程序源代码与所述切面进行预编译。
结合第一方面,本发明在第一方面的第三种实现方式中,所述在基于面向对象编程构造的所述应用程序的多个目标类中织入同一切面的步骤包括:获取所述切面在所述应用程序源代码中的织入位置;根据所述织入位置将所述切面织入到所述应用程序源代码中。
结合第一方面的第三种实现方式,本发明在第一方面的第四种实现方式中,所述织入位置为所述应用程序提供给切面织入的连接点,所述连接点可根据新增的目标类给切面提供新的连接点。
结合第一方面,本发明在第一方面的第五种实现方式中,所述在基于面向对象编程构造的所述应用程序的多个目标类中织入同一切面的步骤还包括:过滤所述多个目标类中的共有代码。
结合第一方面,本发明在第一方面的第六种实现方式中,所述织入同一切面的方法为面向切面编程方式的静态织入法。
结合第一方面,本发明在第一方面的第七种实现方式中,所述拦截代码接管所述多个目标类的共有代码的产生的步骤中包括:由所述拦截代码对所述多个目标类进行统一管理。
结合第一方面,本发明在第一方面的第八种实现方式中,所述运行重新生成的应用程序的步骤包括:将所述重新生成的应用程序安装至移动终端;运行所述重新生成的应用程序,输出相关结果信息。
结合第一方面的第八种实现方式,本发明在第一方面的第九种实现方式中,还包括步骤:将所述结果信息发送至云端服务器进行存储与分析。
结合第一方面,本发明在第一方面的第十种实现方式中,所述多个目标类为对所述应用程序运行时所需要监控的对象,其至少为多个调用的java类。
结合第一方面的第十种实现方式,本发明在第一方面的第十一种实现方式中,所述调用的java类为网络相关类时,其包括rg.apache.http.HttpHost、
org.apache.http.HttpResponses、org.apache.http.HttpRequest、
org.apache.http.client.ResponseHondler、
org.apache.http.client.methods.HttpUriRequest、
org.apache.http.protocol.HttpContext、java.net.URLConnection、
org.apache.http.client.HttpClient中的至少一项。
结合第一方面的第十一种实现方式,本发明在第一方面的第十二种实现方式中,所述多个目标类为网络相关类时,所述结果信息包括访问的URL、发送数据字节大小、接收数据字节大小、触发具体时间、连接时间、是否为WIFI状态、错误码至少其中一项。
结合第一方面的第十种实现方式,本发明在第一方面的第十三种实现方式中所述调用的java类为耗电相关类时,其包括全局定时器管理类、WIFI管理类、传感器管理类、位置定位管理类、电源管理类中的至少一项。
结合第一方面,本发明在第一方面的第十四种实现方式中,所述结果信息至少包括所述应用程序运行时的数据字段。
第二方面,本发明提供一种应用程序运行监控装置,其包括:织入模块,用于在基于面向对象编程构造的所述应用程序的多个目标类中织入同一切面,以由该切面所映射的拦截代码接管所述多个目标类的共有代码的产生;编译模块,用于将切面相对应的拦截代码与所述应用程序源代码一起进行编译,以重新生成所述应用程序;运行模块,用于在运行重新生成的应用程序后,所述应用程序运行监控的结果信息均由其相应的切面相关的拦截代码的执行而确定。
结合第二方面,本发明在第二方面的第一种实现方式中,还包括:获取模块,用于获取所述应用程序源代码,拦截监控的多个目标类,从多个目标类中获取切面。
结合第二方面,本发明在第二方面的第二种实现方式中,所述织入模块中在基于面向对象编程构造的所述应用程序的多个目标类中织入同一切面为将所述应用程序源代码与所述切面进行预编译。
结合第二方面,本发明在第二方面的第三种实现方式中,所述织入模块还用于:获取所述切面在所述应用程序源代码中的织入位置;根据所述织入位置将所述切面织入到所述应用程序源代码中。
结合第二方面的第三种实现方式,本发明在第二方面的第四种实现方式中,所述织入位置为所述应用程序提供给切面织入的连接点,所述连接点可根据新增的目标类给切面提供新的连接点。
结合第二方面,本发明在第二方面的第五种实现方式中,所述织入模块还用于过滤所述多个目标类中的共有代码。
结合第二方面,本发明在第二方面的第六种实现方式中,所述织入同一切面的方法为面向切面编程方式的静态织入法。
结合第二方面,本发明在第二方面的第七种实现方式中,所述拦截代码接管所述多个目标类的共有代码的产生中包括:由所述拦截代码对所述多个目标类进行统一管理。
结合第二方面,本发明在第二方面的第八种实现方式中,所述运行模块,还用于:将所述重新生成的应用程序安装至移动终端;运行所述重新生成的应用程序,输出相关结果信息。
结合第二方面的第八种实现方式,本发明在第二方面的第九种实现方式中,所述运行模块包括发送单元,用于将所述结果信息发送至云端服务器进行存储与分析。
结合第二方面,本发明在第二方面的第十种实现方式中,所述多个目标类为对所述应用程序运行时所需要监控的对象,其至少为多个调用的java类。
结合第二方面的第十种实现方式,本发明在第二方面的第十一种实现方式中,所述调用的java类为网络相关类时,其包括
org.apache.http.HttpHost、org.apache.http.HttpResponses、
org.apache.http.HttpRequest、org.apache.http.client.ResponseHondler、
org.apache.http.client.methods.HttpUriRequest、
org.apache.http.protocol.HttpContext、java.net.URLConnection、
org.apache.http.client.HttpClient中的至少一项。
结合第二方面的第十一种实现方式,本发明在第二方面的第十二种实现方式中,所述多个目标类为网络相关类时,所述结果信息包括访问的URL、发送数据字节大小、接收数据字节大小、触发具体时间、连接时间、是否为WIFI状态、错误码至少其中一项。
结合第二方面的第十种实现方式,本发明在第二方面的第十三种实现方式中,所述调用的java类为耗电相关类时,其包括全局定时器管理类、WIFI管理类、传感器管理类、位置定位管理类、电源管理类中的至少一项。
结合第二方面,本发明在第二方面的第十四种实现方式中,所述结果信息至少包括所述应用程序运行时的数据字段。
第三方面,本发明提供一种应用程序运行监控终端,包括:触敏显示器;一个或多个处理器;存储器;一个或多个应用程序,其中所述一个或多个应用程序被存储在所述存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个程序配置用于如权利要求1至15任意一项所述的应用程序运行监控方法的步骤。
区别于现有技术,本发明具有以下优势:
(1)本发明通过采用面向切面的编程思想,构造应用程序调用类的拦截代码,替换原有面向对象编程思想中将每个类封装的构造。其仅需要编写一段拦截代码,根据调用相应的目标类的连接点切入,生成相应应用程序。运行应用程序时,当对相应的目标类进行调用时,拦截代码会对调用前的数据进行拦截,当调用结束,拦截代码会对调用后的数据进行拦截;生成应用程序调用目标类的结果信息。其中,仅需要编写一段拦截代码相应于使用面向对象思想编写的封装类而言,其提高了开发人员的生产力,缩短了开发周期,降低了开发成本。
(2)本发明中运行应用程序后,运行监控的结果信息均由其相应的切面相关的拦截代码的执行而确定。当需要获取不同的结果信息,即改变对不同目标类的调用时,仅需要改变其中的一段拦截代码。其提高了程序的可维护性以及提高了开发人员的生产力。
(3)本发明中,采用面向切面思想构造监控应用程序运行时调用目标类的数据收集的代码,其通过同一段代码进行统一管理,减少了代码的重复性;同时,切面的切入对业务逻辑的各个部分进行隔离,使得业务逻辑各个部分之间的耦合度降低,从而使整个代码的构造更具专业性,提高了程序的重用性,提高了开发的效率。
附图说明
为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明的一些实施例,对于本领域技术人员来讲,在不付出创造性劳动的前提下,还可以根据这些附图获得其他的附图。
图1示出了根据本发明一个实施例的用于应用程序运行监控方法流程图。
图2示出了根据本发明一个实施例的用于应用程序运行监控装置模块图。
具体实施方式
为了使本技术领域的人员更好地理解本发明方案,下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述。
在本发明的说明书和权利要求书及上述附图中的描述的一些流程中,包含了按照特定顺序出现的多个操作,但是应该清楚了解,这些操作可以不按照其在本文中出现的顺序来执行或并行执行,操作的序号如101、102等,仅仅是用于区分开各个不同的操作,序号本身不代表任何的执行顺序。另外,这些流程可以包括更多或更少的操作,并且这些操作可以按顺序执行或并行执行。需要说明的是,本文中的“第一”、“第二”等描述,是用于区分不同的消息、设备、模块等,不代表先后顺序,也不限定“第一”和“第二”是不同的类型。
下面将结合本发明实施例中的附图,对本发明实施例中的技术方案进行清楚、完整地描述,显然,所描述的实施例仅仅是本发明一部分实施例,而不是全部的实施例。基于本发明中的实施例,本领域技术人员在没有作出创造性劳动前提下所获得的所有其他实施例,都属于本发明保护的范围。
本实施例的应用程序运行监控方法,是采用基于Java的JVM环境下的AspectJ语言,对应用程序运行监控收集数据的过程进行优化。其采用面向切面编程方式,将原有封装于多个目标类的共有代码(调用相关目标类的路径)作为切面实现对多个目标类的拦截。将切面进行与应用程序源代码的共同编译后,当运行所述应用程序时,当客户端访问所述多个目标类指向对象时,根据路径调用相关的类时,使用本实施例提供的方法,可实现在工作中对多个目标类的拦截,获取调用类所产生的结果信息。
Java是目前最流行的语言之一,其具有简单性、可移植性、健壮性、安全性、动态性、面向对象、解释型、分布式、高性能、多线程、体系结构中立等特点。利用Java的开源中间件不但可以构建出扩展性、稳定性较好的应用,而且可以提高开发效率,节省成本。
AOP(Aspect Oriented Programming,面向切面编程)作为对目前最流行的OOP(Object Programming,面向对象编程)开发方式的一种补充,取得了巨大的成功,它可以使程序更容易设计、实现和维护,提供了更好的重用性、灵活性和扩展性。这种设计方法让设计者从更高的维度去思考问题,而不是以前的从类层面或者方法层面思考。AOP的设计方法最早就是在Java领域得到应用的,目前最流行的AOP中间件基本上都是Java领域的。目前市场常用AOP实现的主要有:AspectJ、AspectWerkz、JBoss4和Spring。
其中,AspectJ是最完善的AOP实现,它是一种Java语言的扩展,AOP特性是AspectJ最重视的功能。AspectJ提供了自己的编译器。AspectJ可以对任何方法调用、字段访问、对象构造、异常抛出进行增强。不论对象如何构造或者获取,增强一律有效,并且适用于任何类装载器。织入是在编译期进行的,不过AspectJ在设计时已经尽量避免依赖于特定的织入时机。横切代码被直接编译到增强的类之中。AspectJ拥有一些特有的功能可以改变类型继承体系(但存有一定限制),可以声明编译器错误和警告,也可以“软化”异常(让方法可以抛出未经声明的受控异常)。AspectJ主要具有以下优点:成熟、文档丰富、IDE支持日益充分,尤其是Eclipse、极具表现力,支持所有AOP结构、编译期织入更容易优化,运行时织入则相对困难。
AOP实现的关键就在于AOP框架自动创建的AOP代理,AOP代理则可分为静态代理和动态代理两大类,其中静态代理是指使用AOP框架提供的命令进行编译,从而在编译阶段就可生成AOP代理类,因此也称为编译时增强;而动态代理则在运行时借助于JDK动态代理、CGLIB等在内存中“临时”生成AOP动态代理类,因此也被称为运行时增强。其中,静态代理分为:编译时织入、类加载时织入。动态代理分为:JDK动态代理(基于接口实现)、CGLIB(基于类实现)。
实施例一
在本实施例中,结合附图1,对提供的应用程序运行监控方法进行详细叙述,其包括以下步骤:
S101在基于面向对象编程构造的所述应用程序的多个目标类中织入同一切面,以由该切面所映射的拦截代码接管所述多个目标类的共有代码的产生。
本实施例为基于面向对象编程构造的应用程序所作出的优化,其中,该面向对象的程序设计语言必须有描述对象及其相互之间关系的语言成分。这些程序设计语言可以归纳为以下几类:系统中一切事物皆为对象;对象是属性及其操作的封装体,对象可按其性质划分为类,对象成为类的实例;实例关系和继承关系是对象之间的静态关系;消息传递是对象之间动态联系的唯一形式,也是计算的唯一形式,方法是消息的序列。其中,面向对象具有以下主要特征:(1)对象唯一性,每个对象都有自身唯一的标识,通过这种标识,可找到相应的对象。在对象的整个生命期中,它的标识都不改变,不同的对象不能有相同的标识。(2)分类性,分类性是指将具有一致的数据结构(属性)和行为(操作)的对象抽象成类。一个类就是这样一种抽象,它反映了与应用有关的重要性质,而忽略其他一些无关内容。任何类的划分都是主观的,但必须与具体的应用相关。面向对象的类是封装良好的模块,类定义将其说明(用户可见的外部接口)与实现(用户不可见的内部实现)(3)继承性,继承性是子类自动共享父类数据结构的方法的机制,这是类之间的一种关系。在定义和实现一个类的时候,可以在一个已经存在的类的基础之上来进行,把这个已经存在的类所定义的内容作为自己的内容,并加入若干新的内容。(4)多态性,多态性是指相同的操作或函数、过程可作用于多种类型的对象上并获得不同的结果。不同的对象,收到同一消息可以产生不同的结果,这种现象称为多态性。基于上述面向对象的特性,其会存在软件重用性差、软件可维护性差、开发出的软件不能满足用户需求的问题,所谓重用性是指同一事物不经修改或稍加修改就可多次重复使用的性质;另,在软件工程中强调软件的可维护性,强调文档资料的重要性,规定最终的软件产品应该由完整、一致的配置成分组成。在软件开发过程中,始终强调软件的可读性、可修改性和可测试性是软件的重要的质量指标。且在实践中证明,用传统方法开发出来的软件,维护时其费用和成本仍然很高,其原因是可修改性差,维护困难,导致可维护性差。
基于使用面向对象编程的是封装类,在开发时,若需要对目标类进行监控,而目标类包括多个,则需要将同一段代码编写多次的问题。本实施例提供一种基于面向切面编程思想的应用程序运行监控方法。
其中,在基于面向对象编程构造的应用程序的多个目标类中织入同一切面的步骤为将该应用程序源代码与切面进行预编译。其中,预编译又称为预处理,是做些代码文本的替换工作。是整个编译过程的最先做的工作。此处具体为将拦截代码与应用程序源代码进行文本替换。
进一步地,在此步骤中,包括以下步骤S1011~1012:
S1011获取切面在应用程序源代码中的织入位置;
其中,织入位置为该应用程序提供给切面织入的连接点(Pointcut,表示一组Joint Point,这些Joint Point或是通过逻辑关系组合起来,或是通过通配、正则表达式等方式集中起来,即Joint Point的表达式,表达拦截哪些方法。一个Pointcut对应多个JointPoint),该连接点可根据新增的目标类给切面提供新的连接点。该连接点为根据切面每一切入源代码的位置所统领起的连接点,其至少包括一个切点(Joint Point,拦截点,如某个业务方法,表示在程序中明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行等等。它自身还可以嵌套其他Joint Point)。提供新的连接点为当增加目标类时,相应地会赋予切面对应的切点,此时连接点即会新增。
S1012根据织入位置将切面织入到应用程序源代码中。
此步骤中,切面所对应的拦截代码由于对应于多个目标类的调用,其将各个业务逻辑进行隔离,使得业务逻辑各个部分之间的耦合度降低。具体地,为将原来相对独立的封装目标类,通过拦截代码隔离后,清晰分出非逻辑部分代码(拦截代码)以及逻辑部分代码(相应目标类的业务),相当于在开发过程中,只需要考虑逻辑部分的代码如何进行构造,最后通过拦截代码的切入形成整体。
更进一步地,本步骤实施前还包括步骤S100:
S100获取该应用程序源代码,拦截监控的多个目标类,从多个目标类中获取切面。
在此步骤中,当获取到该应用程序的源代码后,通过应用程序的编译运行,知悉需要拦截监控的目标类,并将此作为拦截对象,从多个目标类中提取其中非逻辑部分代码(该部分的代码于每个独立封装的目标类中是一样的)。以下以表格形式清楚分析该步骤的关系:
独立封装的目标类 |
构成的代码 |
非逻辑部分代码 |
A |
D+a |
D |
B |
D+b |
D |
C |
D+c |
D |
表1
以上表1为独立封装目标类的构造,其中D即为提取出的拦截代码亦即切面。
进一步地,在织入同一切面的步骤中还包括步骤:
过滤多个目标类中的共有代码。
在此步骤中,主要针对应用程序为后续开发状态下的情况,若该应用程序一开始在开发状态下即使用面向切面思想,则不需要执行此步骤。具体地,过滤多个目标类中的共有代码为执行过滤冗余步骤,其中共有代码为表1中的非逻辑部分代码D。
优选地,织入同一切面的方法为面向切面编程方式的静态织入法。
其中,静态织入法有非常大的灵活性,可以突破程序语言的描述能力,突破OO设计模式,可以拦截所有的方法甚至构造函数或属性访问器,因为它是直接修改IL。还有,因为它在运行前修改原有程序集,也就基本不存在运行时的性能损失问题。
其中,拦截代码接管多个目标类的共有代码的产生的步骤中包括:
由拦截代码对多个目标类进行统一管理。
具体地,对多个目标类进行统一管理为对非逻辑部分代码进行统一管理,其利于后续对应用程序源代码的管理与修改。
步骤S101之后,执行步骤S102。
S102将切面相对应的拦截代码与该应用程序源代码一起进行编译,以重新生成该应用程序。
具体地,将切面相对应的拦截代码与应用程序源代码一起进行编译为将某一种程序设计语言写的程序翻译成等价的另一种语言的程序,亦即把高级语言变成计算机可以识别的二进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成二进制。编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;语义检查和中间代码生成;代码优化;目标代码生成。主要是进行词法分析和语法分析,又称为源程序分析,分析过程中发现有语法错误,给出提示信息。
S103在运行重新生成的应用程序后,该应用程序运行监控的结果信息均由其相应的切面相关的拦截代码的执行而确定。
具体地,结果信息与拦截代码一一对应,如拦截代码主要为拦截监控调用网络相关类的,则该结果信息为调用相关网络类的情况下,应用程序的网络数据。即在本实施例中,当需要进行对不同对象的目标类进行拦截时,只需要编写构造一段相应的拦截代码即可,不需要针对每个独立封装的需要进行监控的目标类进行重复的代码编写。
进一步地,运行重新生成的应用程序的步骤包括:
将该重新生成的应用程序安装至移动终端;
运行该重新生成的应用程序,输出相关结果信息。
当该应用程序在运行对目标类进行调用,则拦截代码会拦截调用前后应用程序的相关数据,得出拦截监控后的结果信息。
更进一步地,在运行重新生成的应用程序后,还包括步骤:
将该结果信息发送至云端服务器进行存储与分析。
本实施例提供的为应用程序运行监控的方法,当对该应用程序进行拦截监控获得结果信息后,其将通过相关设备将该结果信息发送至云端服务器进行数据的存储与分析,并最终以报表形式展示该结果信息。
更优地,多个目标类为对该应用程序运行时所需要监控的对象,其至少为多个调用的java类。
具体地,当调用的java类为网络相关类时,即实现对Android App网络流量进行监控收集时,网络相关类包括org.apache.http.HttpHost(其中,Apache是个非盈利组织,起产品一般都用org开头,正如公司的插件包都用com如com.pafa.xxx一样,只是作为标识使用,org标志这是个开源的包,任何人可以免费按照相应的授权协议如GPL使用,而不用考虑授权费用。其中HttpHost代表远程访问)、org.apache.http.HttpResponses(HttpResponses表示服务器响应一个HTTP请求)、org.apache.http.HttpRequest(HttpRequest表示来自某客户端的一个单独的HTTP请求)、org.apache.http.client.ResponseHondler(ResponseHondler用于处理HTTP响应)、org.apache.http.client.methods.HttpUriRequest(methods表示提交请求使用的HTTP方法)、org.apache.http.protocol.HttpContext(HttpContext主要作用是获取客户端向服务端提交的信息,HttpContext类封装有个别HTTP请求的所有HTTP特定信息,也叫上下文信息)、java.net.URLConnection(原生的API)、org.apache.http.client.HttpClient(HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。)中的至少一项。上述类为基于各用户使用类不一,而需要对基于不同Http协议下的类进行监控。相应地,该结果信息至少包括该应用程序运行时的数据字段。当需要监控的类为网络相关类时,其对应的结果信息包括访问的URL(url)、发送数据字节大小(sendBytes)、接收数据字节大小(receiveBytes)、触发具体时间(time)、连接时间(cest)、是否为WIFI状态(isWifi)、错误码(statusCode)至少其中一项。例如,当该应用程序在运行中对网络相关类进行调用,则拦截代码通过对网络相关类的拦截可得出相应数据,如:触发调用网络相关类的时间、调用时是否处于连接wifi状态。其中,发送数据字节大小以及接收数据字节大小为应用程序在调用网络相关类时,向外发送数据或接受数据时所使用的字节大小。
具体地,当调用的java类为耗电相关类时,即实现对Android App传感器数据进行监控收集时,耗电相关类包括全局定时器管理类(AlarmManager,是Android中常用的一种系统级别的提示服务,在特定的时刻为我们广播一个指定的Intent。简单的说就是我们设定一个时间,然后在该时间到来时,AlarmManager为我们广播一个我们设定的Intent,通常我们使用PendingIntent,PendingIntent可以理解为Intent的封装包,简单的说就是在Intent上在加个指定的动作。在使用Intent的时候,我们还需要在执行startActivity、startService或sendBroadcast才能使Intent有用。)、WIFI管理类(WIFIManager,是Android Wifi模块中主要功能类之一,android本身已经提供了包来处理Android环境下对Wifi的操作,位置是android.net.wifi下面。调用wifi操作需要在mainfest中添加对应权限。其中,主要功能类官方提供的大致可以分为四个主要的类:WifiManager、ScanResult、WifiConfiguration、WifiInfo此外还有WifiLock、MulticastLock等)、传感器管理类(SensorManager,Android设备中大多都内置了传感器,这些传感器有些是基于硬件的,有些是基于软件的。通过传感器,可以监控设备的三维运动、位置,可以推断用户的动作,如倾斜、震动、旋转等,可以监控设备周围环境的变化等。在Android平台中,我们可以通过SensorManager访问、监听传感器,并获取相应的信息,同时提供了一些传感器的常量,用于传感器的精确度、获取速率等。SensorManager中常用的方法有:1、SensorgetDefaultSensor(int type):获取指定类型的默认传感器。2、List<Sensor>getSensorList(int type):获取指定类型的所有传感器,如果要获取所有传感器,可传入Sensor.TYPE_ALL。3、RegisterListener(SensorEventListener)listensor,Sensorsensor,int rate):为传感器注册监听器。4、UnregisterListener(SensorEventListenerlistener,Sensor sensor):注销传感器的监听器。Sensor类代表了传感器,其内部包含了多个常量,用户指明传感器的类型,并提供了相应方法,用于获取传感器的各种属性值。)、位置定位管理类(LocationManager,Android中的LocationManager提供了一系列方法来解决地理位置相关问题,包括查询上一个已知位置;注册或注销某个来自LocationProvider的周期性的位置更新;以及注册或注销接近某个坐标时对一个已定义的Intent的触发等。)、电源管理类(PowerManager这个类主要是用来控制电源状态,通过使用该类提供的API可以控制电池的待机时间,一般情况下不使用。)中的至少一项。在本实施例中,上述列举的耗电相关类为应用程序在调用相关设备时较为耗电的相关设备对应的类,其不仅包括上述列举部分,本实施例在此不对所有类进行穷举,其不影响本领域相关技术人员对此进行理解。对应于上述耗电相关类其结果信息将根据其调用时传入的参数以及相关调用路径获得。通过在该应用程序运行时对其调用耗电相关类的监控,可获得该应用程序在调用耗电相关类所对应的对象设备时,其耗电情况。
在本实施例中,对网络相关类以及耗电相关类的情况进行列举,但本实施例所提供的应用程序运行监控的方法还适用于对其他目标类的监控。
实施例二
为了进一步对本发明的应用程序运行监控方法进行阐述,对其进行模块化说明,提供应用程序运行监控装置,参考附图2:
其包括织入模块21、编译模块22、运行模块23、发送单元231、获取模块20。
其中,织入模块21用于在基于面向对象编程构造的该应用程序的多个目标类中织入同一切面,以由该切面所映射的拦截代码接管多个目标类的共有代码的产生;其中,在基于面向对象编程构造的该应用程序的多个目标类中织入同一切面为将该应用程序源代码与该切面进行预编译。其中,预编译又称为预处理,是做些代码文本的替换工作。是整个编译过程的最先做的工作。此处具体为将拦截代码与应用程序源代码进行文本替换。
进一步地,此模块还用于获取该切面在该应用程序源代码中的织入位置;
其中,织入位置为该应用程序提供给切面织入的连接点,该连接点可根据新增的目标类给切面提供新的连接点。该连接点为根据切面每一切入该源代码的位置所统领起的连接点,其至少包括一个切点。提供新的连接点为当增加该目标类时,相应地会赋予切面对应的切点,此时连接点即会新增。
根据织入位置将切面织入到应用程序源代码中。
此中,切面所对应的拦截代码由于对应于多个目标类的调用,其将各个业务逻辑进行隔离,使得业务逻辑各个部分之间的耦合度降低。具体地,为将原来相对独立的封装目标类,通过拦截代码隔离后,清晰分出非逻辑部分代码(拦截代码)以及逻辑部分代码(相应目标类的业务),相当于在开发过程中,只需要考虑逻辑部分的代码如何进行构造,最后通过拦截代码的切入形成整体。
其中,获取模块20用于获取该应用程序源代码,拦截监控的多个目标类,从多个目标类中获取切面。
在此中,当获取到该应用程序的源代码后,通过应用程序的编译运行,知悉需要拦截监控的目标类,并将此作为拦截对象,从多个目标类中提取其中非逻辑部分代码(该部分的代码于每个独立封装的目标类中是一样的)。以下以表格形式清楚分析该关系:
独立封装的目标类 |
构成的代码 |
非逻辑部分代码 |
A |
D+a |
D |
B |
D+b |
D |
C |
D+c |
D |
表2
以上表2为独立封装目标类的构造,其中D即为提取出的拦截代码亦即切面。
进一步地,该织入模块21还用于过滤多个目标类中的共有代码。
其中,主要针对该应用程序为后续开发状态下的情况,若该应用程序一开始在开发状态下即使用面向切面思想,则不需要执行此步。具体地,过滤多个目标类中的共有代码为执行过滤冗余步骤,其中该共有代码为表2中的非逻辑部分代码D。
优选地,织入同一切面的方法为面向切面编程方式的静态织入法。
其中,静态织入法有非常大的灵活性,可以突破程序语言的描述能力,突破OO设计模式,可以拦截所有的方法甚至构造函数或属性访问器,因为它是直接修改IL。还有,因为它在运行前修改原有程序集,也就基本不存在运行时的性能损失问题。
其中,拦截代码接管多个目标类的共有代码的产生中为由该拦截代码对该多个目标类进行统一管理。
具体地,对多个目标类进行统一管理为对非逻辑部分代码进行统一管理,其利于后续对应用程序源代码的管理与修改。
其中,编译模块22用于将切面相对应的拦截代码与该应用程序源代码一起进行编译,以重新生成该应用程序。
具体地,将切面相对应的拦截代码与该应用程序源代码一起进行编译为将某一种程序设计语言写的程序翻译成等价的另一种语言的程序的程序,亦即把高级语言变成计算机可以识别的二进制语言,计算机只认识1和0,编译程序把人们熟悉的语言换成二进制。编译程序把一个源程序翻译成目标程序的工作过程分为五个阶段:词法分析;语法分析;语义检查和中间代码生成;代码优化;目标代码生成。主要是进行词法分析和语法分析,又称为源程序分析,分析过程中发现有语法错误,给出提示信息。
其中,运行模块23用于在运行重新生成的应用程序后,该应用程序运行监控的结果信息均由其相应的切面相关的拦截代码的执行而确定。
具体地,该结果信息与拦截代码一一对应,如拦截代码主要为拦截监控调用网络相关类的,则该结果信息为调用相关网络类的情况下,应用程序的网络数据。即在本实施例中,当需要进行对不同对象的目标类进行拦截时,只需要编写构造一段相应的拦截代码即可,不需要针对每个独立封装的需要进行监控的目标类进行重复的代码编写。
进一步地,运行模块23还用于将该重新生成的应用程序安装至移动终端;运行该重新生成的应用程序,输出相关结果信息。
当该应用程序在运行对目标类进行调用,则拦截代码会拦截调用前后应用程序的相关数据,得出拦截监控后的结果信息。
更进一步地,运行模块23包括发送单元231,其用于将该结果信息发送至云端服务器进行存储与分析。
本实施例提供的为应用程序运行监控的装置,当对该应用程序进行拦截监控获得结果信息后,其将通过相关设备将该结果信息发送至云端服务器进行数据的存储与分析,并最终以报表形式展示该结果信息。
更优地,多个目标类为对该应用程序运行时所需要监控的对象,其至少为多个调用的java类。
具体地,当该调用的java类为网络相关类时,即实现对Android App网络流量进行监控收集时,网络相关类包括org.apache.http.HttpHost(其中,Apache是个非盈利组织,起产品一般都用org开头,正如公司的插件包都用com如com.pafa.xxx一样,只是作为标识使用,org标志这是个开源的包,任何人可以免费按照相应的授权协议如GPL使用,而不用考虑授权费用。其中HttpHost代表远程访问)、org.apache.http.HttpResponses(HttpResponses表示服务器响应一个HTTP请求)、org.apache.http.HttpRequest(HttpRequest表示来自某客户端的一个单独的HTTP请求)、org.apache.http.client.ResponseHondler(ResponseHondler用于处理HTTP响应)、org.apache.http.client.methods.HttpUriRequest(methods表示提交请求使用的HTTP方法)、org.apache.http.protocol.HttpContext(HttpContext主要作用是获取客户端向服务端提交的信息,HttpContext类封装有个别HTTP请求的所有HTTP特定信息,也叫上下文信息)、java.net.URLConnection(原生的API)、org.apache.http.client.HttpClient(HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。)中的至少一项。上述类为基于各用户使用类不一,而需要对基于不同Http协议下的类进行监控。相应地,该结果信息至少包括该应用程序运行时的数据字段。当需要监控的类为网络相关类时,其对应的结果信息包括访问的URL(url)、发送数据字节大小(sendBytes)、接收数据字节大小(receiveBytes)、触发具体时间(time)、连接时间(cest)、是否为WIFI状态(isWifi)、错误码(statusCode)至少其中一项。例如,当该应用程序在运行中对网络相关类进行调用,则拦截代码通过对网络相关类的拦截可得出相应数据,如:触发调用网络相关类的时间、调用时是否处于连接wifi状态。其中,发送数据字节大小以及接收数据字节大小为应用程序在调用网络相关类时,向外发送数据或接受数据时所使用的字节大小。
具体地,当该调用的java类为耗电相关类时,即实现对Android App传感器数据进行监控收集时,耗电相关类包括全局定时器管理类(AlarmManager,是Android中常用的一种系统级别的提示服务,在特定的时刻为我们广播一个指定的Intent。简单的说就是我们设定一个时间,然后在该时间到来时,AlarmManager为我们广播一个我们设定的Intent,通常我们使用PendingIntent,PendingIntent可以理解为Intent的封装包,简单的说就是在Intent上在加个指定的动作。在使用Intent的时候,我们还需要在执行startActivity、startService或sendBroadcast才能使Intent有用。)、WIFI管理类(WIFIManager,是Android Wifi模块中主要功能类之一,android本身已经提供了包来处理Android环境下对Wifi的操作,位置是android.net.wifi下面。调用wifi操作需要在mainfest中添加对应权限。其中,主要功能类官方提供的大致可以分为四个主要的类:WifiManager、ScanResult、WifiConfiguration、WifiInfo此外还有WifiLock、MulticastLock等)、传感器管理类(SensorManager,Android设备中大多都内置了传感器,这些传感器有些是基于硬件的,有些是基于软件的。通过传感器,可以监控设备的三维运动、位置,可以推断用户的动作,如倾斜、震动、旋转等,可以监控设备周围环境的变化等。在Android平台中,我们可以通过SensorManager访问、监听传感器,并获取相应的信息,同时提供了一些传感器的常量,用于传感器的精确度、获取速率等。SensorManager中常用的方法有:1、SensorgetDefaultSensor(int type):获取指定类型的默认传感器。2、List<Sensor>getSensorList(int type):获取指定类型的所有传感器,如果要获取所有传感器,可传入Sensor.TYPE_ALL。3、RegisterListener(SensorEventListener)listensor,Sensorsensor,int rate):为传感器注册监听器。4、UnregisterListener(SensorEventListenerlistener,Sensor sensor):注销传感器的监听器。Sensor类代表了传感器,其内部包含了多个常量,用户指明传感器的类型,并提供了相应方法,用于获取传感器的各种属性值。)、位置定位管理类(LocationManager,Android中的LocationManager提供了一系列方法来解决地理位置相关问题,包括查询上一个已知位置;注册或注销某个来自LocationProvider的周期性的位置更新;以及注册或注销接近某个坐标时对一个已定义的Intent的触发等。)、电源管理类(PowerManager这个类主要是用来控制电源状态,通过使用该类提供的API可以控制电池的待机时间,一般情况下不使用。)中的至少一项。在本实施例中,上述列举的耗电相关类为应用程序在调用相关设备时较为耗电的相关设备对应的类,其不仅包括上述列举部分,本实施例在此不对所有类进行穷举,其不影响本领域相关技术人员对此进行理解。对应于上述耗电相关类其结果信息将根据其调用时传入的参数以及相关调用路径获得。通过在该应用程序运行时对其调用耗电相关类的监控,可获得该应用程序在调用耗电相关类所对应的对象设备时,其耗电情况。
在本实施例中,对网络相关类以及耗电相关类的情况进行列举,但本实施例所提供的应用程序运行监控的装置还适用于对其他目标类的监控。
实施例三
本实施例提供一种应用程序运行监控终端,其包括:触敏显示器;
一个或多个处理器;
存储器;
一个或多个应用程序,其中所述一个或多个应用程序被存储在所述存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个程序配置用于如实施例一所述的应用程序运行监控方法的步骤。
所属领域的技术人员可以清楚地了解到,为描述的方便和简洁,上述描述的系统,装置和单元的具体工作过程,可以参考前述方法实施例中的对应过程,在此不再赘述。
在本申请所提供的几个实施例中,应该理解到,所揭露的系统,装置和方法,可以通过其它的方式实现。例如,以上所描述的装置实施例仅仅是示意性的,例如,所述单元的划分,仅仅为一种逻辑功能划分,实际实现时可以有另外的划分方式,例如多个单元或组件可以结合或者可以集成到另一个系统,或一些特征可以忽略,或不执行。另一点,所显示或讨论的相互之间的耦合或直接耦合或通信连接可以是通过一些接口,装置或单元的间接耦合或通信连接,可以是电性,机械或其它的形式。
所述作为分离部件说明的单元可以是或者也可以不是物理上分开的,作为单元显示的部件可以是或者也可以不是物理单元,即可以位于一个地方,或者也可以分布到多个网络单元上。可以根据实际的需要选择其中的部分或者全部单元来实现本实施例方案的目的。
另外,在本发明各个实施例中的各功能单元可以集成在一个处理单元中,也可以是各个单元单独物理存在,也可以两个或两个以上单元集成在一个单元中。上述集成的单元既可以采用硬件的形式实现,也可以采用软件功能单元的形式实现。
本领域普通技术人员可以理解上述实施例的各种方法中的全部或部分步骤是可以通过程序来指令相关的硬件来完成,该程序可以存储于一计算机可读存储介质中,存储介质可以包括:只读存储器(ROM,Read Only Memory)、随机存取存储器(RAM,RandomAccess Memory)、磁盘或光盘等。
本领域普通技术人员可以理解实现上述实施例方法中的全部或部分步骤是可以通过程序来指令相关的硬件完成,所述的程序可以存储于一种计算机可读存储介质中,上述提到的存储介质可以是只读存储器,磁盘或光盘等。
概括地说,本发明提供的技术方案如下:
A1.一种应用程序运行监控方法,其包括如下步骤:
在基于面向对象编程构造的所述应用程序的多个目标类中织入同一切面,以由该切面所映射的拦截代码接管所述多个目标类的共有代码的产生;
将切面相对应的拦截代码与所述应用程序源代码一起进行编译,以重新生成所述应用程序;
在运行重新生成的应用程序后,所述应用程序运行监控的结果信息均由其相应的切面相关的拦截代码的执行而确定。
A2.根据权利要求A1所述的应用程序运行监控方法,还包括步骤:
获取所述应用程序源代码,拦截监控的多个目标类,从多个目标类中获取切面。
A3.根据权利要求A1所述的应用程序运行监控方法,所述在基于面向对象编程构造的所述应用程序的多个目标类中织入同一切面的步骤为将所述应用程序源代码与所述切面进行预编译。
A4.根据权利要求A1所述的应用程序运行监控方法,所述在基于面向对象编程构造的所述应用程序的多个目标类中织入同一切面的步骤包括:
获取所述切面在所述应用程序源代码中的织入位置;
根据所述织入位置将所述切面织入到所述应用程序源代码中。
A5.根据权利要求A4所述的应用程序运行监控方法,所述织入位置为所述应用程序提供给切面织入的连接点,所述连接点可根据新增的目标类给切面提供新的连接点。
A6.根据权利要求A1所述的应用程序运行监控方法,所述在基于面向对象编程构造的所述应用程序的多个目标类中织入同一切面的步骤还包括:
过滤所述多个目标类中的共有代码。
A7.根据权利要求A1所述的应用程序运行监控方法,所述织入同一切面的方法为面向切面编程方式的静态织入法。
A8.根据权利要求A1所述的应用程序运行监控方法,所述拦截代码接管所述多个目标类的共有代码的产生的步骤中包括:
由所述拦截代码对所述多个目标类进行统一管理。
A9.根据权利要求A1所述的应用程序运行监控方法,,所述运行重新生成的应用程序的步骤包括:
将所述重新生成的应用程序安装至移动终端;
运行所述重新生成的应用程序,输出相关结果信息。
A10.根据权利要求A9所述的应用程序运行监控方法,还包括步骤:将所述结果信息发送至云端服务器进行存储与分析。
A11.根据权利要求A1所述的应用程序运行监控方法,所述多个目标类为对所述应用程序运行时所需要监控的对象,其至少为多个调用的java类。
A12.根据权利要求A11所述的应用程序运行监控方法,所述调用的java类为网络相关类时,其包括org.apache.http.HttpHost、
org.apache.http.HttpResponses、org.apache.http.HttpRequest、
org.apache.http.client.ResponseHondler、
org.apache.http.client.methods.HttpUriRequest、
org.apache.http.protocol.HttpContext、java.net.URLConnection、
org.apache.http.client.HttpClient中的至少一项。
A13.根据权利要求A12所述的应用程序运行监控方法,所述多个目标类为网络相关类时,所述结果信息包括访问的URL、发送数据字节大小、接收数据字节大小、触发具体时间、连接时间、是否为WIFI状态、错误码至少其中一项。
A14.根据权利要求A11所述的应用程序运行监控方法,所述调用的java类为耗电相关类时,其包括全局定时器管理类、WIFI管理类、传感器管理类、位置定位管理类、电源管理类中的至少一项。
A15.根据权利要求A1所述的应用程序运行监控方法,所述结果信息至少包括所述应用程序运行时的数据字段。
B16.一种应用程序运行监控装置,其包括:
织入模块,用于在基于面向对象编程构造的所述应用程序的多个目标类中织入同一切面,以由该切面所映射的拦截代码接管所述多个目标类的共有代码的产生;
编译模块,用于将切面相对应的拦截代码与所述应用程序源代码一起进行编译,以重新生成所述应用程序;
运行模块,用于在运行重新生成的应用程序后,所述应用程序运行监控的结果信息均由其相应的切面相关的拦截代码的执行而确定。
B17.根据权利要求B16所述的应用程序运行监控装置,还包括:
获取模块,用于获取所述应用程序源代码,拦截监控的多个目标类,从多个目标类中获取切面。
B18.根据权利要求B16所述的应用程序运行监控装置,所述织入模块中在基于面向对象编程构造的所述应用程序的多个目标类中织入同一切面为将所述应用程序源代码与所述切面进行预编译。
B19.根据权利要求B16所述的应用程序运行监控装置,所述织入模块还用于:
获取所述切面在所述应用程序源代码中的织入位置;
根据所述织入位置将所述切面织入到所述应用程序源代码中。
B20.根据权利要求B19所述的应用程序运行监控装置,所述织入位置为所述应用程序提供给切面织入的连接点,所述连接点可根据新增的目标类给切面提供新的连接点。
B21.根据权利要求B16所述的应用程序运行监控装置,所述织入模块还用于过滤所述多个目标类中的共有代码。
B22.根据权利要求B16所述的应用程序运行监控装置,所述织入同一切面的方法为面向切面编程方式的静态织入法。
B23.根据权利要求B16所述的应用程序运行监控装置,所述拦截代码接管所述多个目标类的共有代码的产生中包括:
由所述拦截代码对所述多个目标类进行统一管理。
B24.根据权利要求B16所述的应用程序运行监控装置,所述运行模块,还用于:
将所述重新生成的应用程序安装至移动终端;
运行所述重新生成的应用程序,输出相关结果信息。
B25.根据权利要求B24所述的应用程序运行监控装置,所述运行模块包括发送单元,用于将所述结果信息发送至云端服务器进行存储与分析。
B26.根据权利要求B16所述的应用程序运行监控装置,所述多个目标类为对所述应用程序运行时所需要监控的对象,其至少为多个调用的java类。
B27.根据权利要求B26所述的应用程序运行监控装置,所述调用的java类为网络相关类时,其包括org.apache.http.HttpHost、
org.apache.http.HttpResponses、org.apache.http.HttpRequest、
org.apache.http.client.ResponseHondler、
org.apache.http.client.methods.HttpUriRequest、
org.apache.http.protocol.HttpContext、java.net.URLConnection、
org.apache.http.client.HttpClient中的至少一项。
B28.根据权利要求B27所述的应用程序运行监控装置,所述多个目标类为网络相关类时,所述结果信息包括访问的URL、发送数据字节大小、接收数据字节大小、触发具体时间、连接时间、是否为WIFI状态、错误码至少其中一项。
B29.根据权利要求B26所述的应用程序运行监控装置,所述调用的java类为耗电相关类时,其包括全局定时器管理类、WIFI管理类、传感器管理类、位置定位管理类、电源管理类中的至少一项。
B30.根据权利要求B16所述的应用程序运行监控装置,所述结果信息至少包括所述应用程序运行时的数据字段。
C31.一种应用程序运行监控终端,包括:
触敏显示器;
一个或多个处理器;
存储器;
一个或多个应用程序,其中所述一个或多个应用程序被存储在所述存储器中并被配置为由所述一个或多个处理器执行,所述一个或多个程序配置用于如权利要求A1至A15任意一项所述的应用程序运行监控方法的步骤。