一种自动回放Android程序的方法及系统与流程

文档序号:19976555发布日期:2020-02-21 18:58阅读:368来源:国知局
一种自动回放Android程序的方法及系统与流程

本发明涉及一种自动回放android程序的方法,该方法利用代码注入机制实现android程序的自动回放。本发明还涉及自动回放android程序的系统。



背景技术:

随着android系统被越来越广泛地使用,android程序的数量也在飞速增长。android程序多采用java开发,可以使用工具将android程序进行反编译,从而得到资源文件和smali语言的源文件,也可以使用工具将反编译得到的资源文件和smali语言的源文件再次编译生成android程序。

为了保证android程序的质量,开发者需要花费大量的时间用于测试。实现android程序的自动化测试主要由3个环节构成,即用户操作脚本的自动录制、操作脚本的自动回放、脚本录制期间的程序状态和自动回放期间的程序状态的对比。

现有技术为了实现“操作脚本的自动回放”,通常采用的是独立的自动回放程序,从而控制android程序达到自动回放功能。例如cn104407982a中公开的方案,其通过独立的自动化测试装置,将手机通过usb连接进行测试,达到简单对象类型完成复杂对象类型的测试。

但是采用独立的自动回放程序有以下不足:

1、自动回放过程中需要动态的(临时)搜索android程序的ui控件,导致运行效率不高;

2、通过当前页面的控件管理器获取控件集,再进行检索。而不同版本的android程序、不同类型的页面(系统页面、用户自定义页面)的页面控件管理器均可能不同。因此动态的(临时)搜索时,容易受到页面构造、显示状态(例如:页面超出显示屏幕的大小,导致某些ui控件显示在屏幕之外)等影响,可能无法搜索到指定的ui控件;

3、回放时受到自动回放程序的运行环境的约束。



技术实现要素:

为了解决现有技术中的上述不足,本发明提出了一种利用代码注入机制实现android程序的自动回放的方法及系统。

根据本发明实施例的实现android程序的自动回放的方法,包括以下步骤:

第一android程序反编译步骤,对所述android程序进行反编译,获得所述android程序的smali文件(s11);

smali文件修改步骤,基于具有自动回放功能的android程序修改所述android程序的smali文件,以便在所述android程序的smali文件中注入自动回放功能,并获得修改后的smali文件(s12);以及

编译步骤,对所述修改后的smali文件进行编译,获得编辑后的android程序(s13);

执行步骤,执行所述编辑后的android程序,实现自动回放(s14)。

根据本发明实施例的方法,对android程序进行改造,在其原有功能的基础上,增加了自动回放的功能。在本发明的方法中,ui控件的检索过程从回放运行时的动态检索调整为对smali代码静态分析时的检索,降低回放运行时的检索量,使得搜索ui控件的效率得以提高。同时,由于android程序的代码特点,每一行android源代码都可能包含若干个功能,经过反编译后,具有一个或多个功能的每一行android源代码都会被分解为多行、每行仅有单一指令的smali代码。通过对具有特定单一指令的smali代码检索,可以更容易地找出ui控件,而不会有现有技术中存在的受到页面构造、显示状态(例如:页面超出显示屏幕的大小,导致某些ui控件显示在屏幕之外)等影响的问题,从而提高搜索ui控件的准确性;并且最终生成的编辑后的android程序的运行环境没有变化,即能够直接在原先的android程序的实际运行环境中自动回放,从而克服了受到自动回放程序的运行环境的约束的缺陷。

在本发明的一些实施例中,该方法还包括在所述编译步骤之后执行对所述编辑后的android程序进行重签名的重签名步骤(s215)。

在本发明的一些实施例中,smali文件修改步骤包括以下步骤:

第二android程序反编译步骤,对所述具有自动回放功能的android程序进行反编译,获得所述具有自动回放功能的android程序的smali文件;

注入步骤,在所述android程序的smali文件中注入所述具有自动回放功能的android程序中执行自动回放功能的代码。

在本发明的一些实施例中,其中具有自动回放功能的android程序的smali文件包括执行以下功能的代码:

将ui控件对象存储在数组内(功能a)、读取回放脚本(功能b)、按脚本的定义从数组内取得ui控件(功能c)、执行控件的事件函数(功能d)、启动回放(功能e)。

另外,关于smali文件的注入,其可以通过反编译后的android程序内的配置文件取得程序主入口,并由该主入口进行功能扩展;也可以通过程序页面进行扩展。在本发明的一些实施例中,注入步骤具体包括以下步骤:

第一插入步骤,在所述android程序的显示程序页面的smali文件内插入执行所述启动回放(功能e)的代码(s205);

特征加载步骤,加载所有ui控件类型的smali代码行特征规则;

代码读取步骤,读取所述android程序的smali文件的所有代码行,根据所述特征规则查找所述android程序的ui控件(s207-s208);

第二插入步骤,在所述android程序的ui控件的smali代码行之后插入执行所述将ui控件对象存储在数组内(功能a)的代码(s209-s210);

复制步骤,将所述读取回放脚本(功能b)、所述按脚本的定义从数组内取得ui控件(功能c)、所述执行控件的事件函数(功能d)的代码复制到所述android程序的smali文件集内(s211、s212、s213)。

由于android程序由一个或多个页面组成,通过发送相应页面的消息启动相应的页面。假设有2个相关的android程序,android-a程序和android-b程序,用户启动第一个android-a程序时,系统会发送该程序的主入口页面的消息来启动首页面,并启动android-a程序的回放功能,当回放过程中,碰到由android-a程序启动android-b程序时,会发送android-b的页面的消息来首次启动android-b程序,由于程序逻辑的不同,首次启动android-b程序的页面消息不一定是android-b程序的主入口页面的消息,这样就可能导致android-b程序启动后但无法及时启动程序回放这个扩展功能。而根据本实施例的方法,通过对程序各页面注入扩展回放功能,能使得android程序能通过不同的页面启动后,都能启动回放功能。在本发明的一些实施例中,执行步骤进一步包括:

初始化步骤,逐一加载并初始化程序页面的各个ui控件(s32);

保存步骤,将各个ui控件对象保存在控件集合中并显示程序页面(s33-s34);

脚本读取步骤,读取回放脚本(s35-s36);

第一判断步骤判断是否有未执行的所述回放脚本,如果判断为是,则取得所述各个ui控件并执行ui控件的事件函数,如果判断为否,则结束回放(s37-s39);

第二判断步骤,判断是否有编辑后的页面要显示,如果判断为是,则返回所述初始化步骤,如果判断为否,则返回所述第一判断(s40)。

另外,本发明还提供了一种实现android程序的自动回放的系统。

发明效果

根据本发明的方法,能够至少获得以下一种技术效果:

1、提高搜索ui控件的效率;

2、提高搜索ui控件的准确性;

3、能够直接在android程序的实际运行环境中自动回放;

4、使得android程序能通过不同的页面启动后,都能启动回放功能。

附图说明

图1是根据本发明实施例的自动回放android程序的方法的流程图。

图2是根据本发明实施例的对android程序注入自动回放功能的流程图。

图3是根据本发明实施例的注入自动回放功能后编辑后的android程序执行流程图。

图4是根据本发明实施例的自动回放android程序的系统的框图。

具体实施方式

以下对照附图详细说明根据本发明的对android程序执行代码注入的方法的具体实施例。

图1是根据本发明实施例的自动回放android程序的方法的流程图。如图1所示,首先在步骤s11需要对android程序执行反编译,以获得smali文件。然后利用具有自动回放功能的android程序对获得的smali文件进行修改(步骤s12),从而在smali文件中注入自动回放功能,接着在步骤s13对修改后的编辑后的smali文件执行编译得到编辑后的android程序,最后执行编辑后的android程序,完成自动回放(步骤s14)。

以下参照图2描述根据本发明一个实施例的对android程序注入自动回放功能的流程图。

根据本发明实施例的对android程序注入自动回放功能的方法步骤如图2所示。首先执行步骤s201,对android程序进行反编译,从而获得android程序的smali文件集,然后对smali文件集中的smali文件进行判断,确认是否有未处理的smali文件,即步骤s202,如果判断为否,则执行下述的步骤s211,如果有,则执行步骤s203,读取一个smali文件并执行步骤s204,判断该smali文件是否是程序页面文件,如果判断为是,则进行步骤s205,在程序页面类smali文件中添加启动回放的smali代码,如果判断为否,则直接转到步骤s206;在步骤s206对其他的功能代码进行判断,确定是否有未处理的,如果判断为否,则流程返回到步骤s202,如果有,则进行步骤s207取出这一行的功能代码并且执行步骤s208,将该功能代码与所有ui控件的smali代码行特征进行对比,在如果在步骤s209中判断是匹配的,则在该功能代码之后插入将ui控件对象存储在数组内的smali代码,即步骤s210,并且程序返回步骤s206,如果判断不匹配,则直接返回步骤s206,继续寻找未处理的功能代码。

关于如何判断smali文件是否是程序页面文件,简单说明如下:程序页面主要由系统页面和继承自系统页面的用户自定义页面组成,系统页面类的类名是确定的,如:activity、listactivity等,在smali文件内,这些类名也是固定的,如:android/app/activity、android/app/listactivity。在每个smali文件内,对于自身类和所继承的父类都有定义,通过分析smali文件定义的类名和所继承的父类名,可以判断该smali文件是否是程序页面文件。

当步骤s202的判断为否时,表示所有的smali文件都检查或处理过,接下来依次执行步骤s211-213,分别将读取回放脚本的smali文件、按脚本的定义取得ui控件的smali文件以及执行ui控件的事件函数的smali文件复制到通过反编译android程序获得的smali文件集中,至此,获得注入了自动回放功能的android程序的编辑后的smali文件集。接下来,将编辑后的smali文件集重新编译为编辑后的android程序(步骤s214)并且对编辑后的android程序执行签名(s215),从而使得原先的android程序具有了自动回放功能。

使用的具有自动回放功能的android程序是预先编写的,其具有以下完成自动回放功能相关的函数:将ui控件对象存储在数组内(功能a)、读取回放脚本(功能b)、按脚本的定义从数组内取得ui控件(功能c)、执行控件的事件函数(功能d)、启动回放(功能e)。其中功能e的作用为:先调用功能b,然后依次并循环调用功能c、功能d。

图2所示的步骤是依次注入功能e、a、b、c、d,但是本发明的方法不局限于这样的顺序,注入各个功能的smali文件的顺序可以任意调整。

在对android程序注入自动回放功能的流程的图2中,并未显示对具有自动回放功能的android程序进行反编译的步骤,实际上对具有自动回放功能的android程序进行反编译从而获得执行上述功能的smali文件的步骤的顺序可以随意设置,只需要保证在注入过程中能够获取到这些执行自动回放功能的smali文件即可。

如上所述,本发明实施例的方法对android程序进行改造,在其原有功能的基础上,增加了自动回放的功能。在本发明的方法中,ui控件的检索过程从回放运行时的动态检索调整为对smali代码静态分析时的检索,降低回放运行时的检索量,使得搜索ui控件的效率得以提高。同时,由于android程序的代码特点,每一行android源代码都可能包含若干个功能,经过反编译后,具有一个或多个功能的每一行android源代码都会被分解为多行、每行仅有单一指令的smali代码。通过对具有特定单一指令的smali代码检索,可以更容易地找出ui控件,而不会有现有技术中存在的受到页面构造、显示状态(例如:页面超出显示屏幕的大小,导致某些ui控件显示在屏幕之外)等影响的问题,从而提高搜索ui控件的准确性;并且最终生成的编辑后的android程序的运行环境没有变化,即能够直接在原先的android程序的实际运行环境中自动回放,从而克服了受到自动回放程序的运行环境的约束的缺陷。通过对程序各页面注入扩展回放功能,能使得android程序能通过不同的页面启动后,都能启动回放功能。

以下,对关于如何通过smali代码检出ui控件进行简单说明。

通常来说,和ui控件操作相关的指令有以下几种类型:创建控件对象、将控件对象赋值给变量、对控件的属性、事件进行操作等。

虽然ui控件的类型不同,但是对于同一指令的smali代码都具有相同的代码行特征(以下简称“指令特征”),也就是由不变的字符串和可变的字符串构成。以“将控件对象赋值给变量”为例,该指令特征大致为:

赋值指令(不变字符串)+控件对象(可变字符串)+变量名(可变字符串)+ui控件类型(不变字符串)。

对android程序的所有smali代码行逐一与指令特征做对比,就能判定某一smali代码行是否是ui控件并且判断ui控件的类型和控件对象。通过对具有特定单一指令的smali代码检索,可以更容易地找出ui控件,提高搜索ui控件的准确性。

以下参照图3具体说明编辑后的android程序运行时执行自动回放的流程。

如图3所示,在步骤s31,android程序启动的同时,自动回放功能启动(功能e),然后在步骤s32,android程序会逐一加载并初始化页面上的各个ui控件;接下来,将ui控件对象存储在数组(控件集合)中,即执行功能a(步骤s33),android程序的页面会在步骤s34进行显示,在步骤s35,判断是否已经读取了该页面的回放脚本,如果判断为是,则执行步骤s37,如果判断为否,则执行步骤s36,读取该回放脚本。

步骤s37是android程序对回放的脚本进行判断,确定是否有未执行的回放脚本,如果判断为否,则程序结束,如果判断为是,则转到步骤s38,按照脚本的定义从控件集合内取得各ui控件(执行功能c),并且在s39执行这些控件的事件函数(执行功能d)。在步骤s40,进行是否有新页面的显示的判断,如果有新页面,则转到步骤s32,程序循环,如果没有则返回步骤s37。如上所述,通过获取并执行所有页面中的ui控件的事件函数,编辑后的android程序实现了自动回放。

通过执行根据本发明实施例的注入后的带自动回放功能的android程序,实现了程序的自动回放。由于本发明的方法预先对smali代码进行静态分析检索,从而降低回放运行时的检索量,使得在回放时搜索ui控件的效率以及搜索ui控件的准确性得以提高;并且编辑后的android程序的运行环境与原先相比没有变化,不存在受运行环境约束的问题。

本发明还涉及一种自动回放android程序的系统,如图4所示,根据本发明实施例的系统包括第一android程序反编译模块,所述第一android程序反编译模块对所述android程序进行反编译,获得所述android程序的smali文件;smali文件修改模块,所述smali文件修改模块基于具有自动回放功能的android程序修改所述android程序的smali文件,以便在所述android程序的smali文件中插入自动回放功能,并获得修改后的smali文件;编译模块,所述编译模块对所述修改后的smali文件进行编译,获得编辑后的android程序;以及执行模块,所述执行模块执行所述编辑后的android程序,实现自动回放。

该系统还进一步包括重签名模块,所述重签名模块对所述编辑后的android程序进行重签名。

进一步的,smali文件修改模块包括:第二android程序反编译模块,所述第二android程序反编译模块对所述具有自动回放功能的android程序进行反编译,获得所述具有自动回放功能的android程序的smali文件;注入模块,所述注入模块在所述android程序的smali文件中插入所述具有自动回放功能的android程序中执行自动回放功能代码行。

其中,注入模块包括:第一插入模块,所述第一插入模块在所述android程序的程序页面类smali文件内插入所述具有自动回放功能的android程序的smali文件中执行启动回放功能的代码;特征加载模块,所述特征加载模块加载所有ui控件类型的smali代码行特征规则并初始化;代码读取模块,所述代码读取模块读取所述android程序的smali文件的所有代码行,根据所述特征规则查找所述android程序的ui控件;第二插入模块,所述第二插入模块在所述android程序的ui控件的smali代码行之后插入所述具有自动回放功能的android程序的smali文件中执行将ui控件对象存储在数组内的功能的代码;以及复制模块,所述复制模块将所述具有自动回放功能的android程序的smali文件中执行读取回放脚本功能、执行按脚本的定义从数组内取得ui控件功能、执行控件的事件函数功能的代码复制到所述android程序的smali文件集内。

其中执行模块包括:初始化模块,所述初始化模块逐一加载并初始化程序页面的各个ui控件;保存模块,所述保存模块将各个ui控件对象保存在控件集合中并显示程序页面;脚本读取模块,所述脚本读取模块读取回放脚本;第一判断模块,判断是否有未执行的所述回放脚本,如果判断为是,则取得所述ui控件并执行该ui控件的事件函数,如果判断为否,则结束回放;第二判断模块,判断是否有编辑后的页面要显示,如果判断为是,则由所述初始化模块加载并初始化所述编辑后的页面的ui控件,如果判断为否,则转至所述第一判断模块执行判断。

本发明所涉及的录制被测android程序的用户操作的系统可以通过计算机程序来指令相关的硬件来完成,所述的程序可存储于计算机可读取存储介质中,该程序在执行时,完成上述的方法流程。其中,所述的存储介质可为磁盘、光盘、只读存储器(read-onlymemory,rom)或随机存取存储器(randomaccessmemory,ram)等。

虽然本发明已以较佳实施例揭露如上,但并不是用来限定本发明,任何所属技术领域的技术人员,在不脱离本发明的精神和范围内,可以作少许的改动与润饰,因此本发明的保护范围以权利要求所界定的为准。

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