张 天,耿庆田,高琦坤
(长春师范大学计算机科学与技术学院,吉林长春 130032)
随着“互联网+”和大数据应用的不断深入,移动互联终端在各个行业中的应用越来越普及,移动终端的应用程序也越来越多,尤其一些专业领域,需要特殊定制行业移动应用。由于Android的免费特性,很多移动终端都以其作为运行平台来开发相应的行业应用。在编制过程中,程序员经常需要调用相关行业专用硬件信息来获取数据,而在编制应用程序过程中未必具备某些专用硬件,或者应用程序编制者不能熟悉使用这些专用硬件,而从专用硬件中得到数据才能保证应用程序的测试运行,此时可以利用Android程序的运行机制进行程序替换,以获取和设定上层应用程序需要的特定数据进行测试。
Android应用程序采取了MVC的设计模式,程序界面与程序运行代码是分离的。我们每设计一个窗口程序界面,需要同时完成两项工作:一是应用程序的界面设计;一是用户在界面操作时的响应代码。程序界面在项目工程中以布局文件形式存在,而界面响应代码则以JAVA类的形式存在。在Android中将这两项统一称作Activity(活动)。在Android Studio中创建活动如图1所示,从中可看出活动的组成。
图1 Android Studio创建活动
在Android的项目中,会有一个活动作为主活动,当程序第一次运行时最先显示给用户,然后通过这个活动进行其它活动的调用执行。为了使Android平台可以自动启动主活动,在每个项目中有一个配置文件,文件名为AndroidManifest.xml,在这个文件中定义了我们所建立的每一个活动的属性与关联。代码如下:
android:name=".MainActivity" android:label="@string/app_name" android:theme="@style/AppTheme.NoActionBar">
Android通过intent-filter标签中action属性值来确定哪一个活动会作为主活动启动,从上述代码中可以看到,action值为“android.intent.action.MAIN”时,Android平台将调用对应的活动作为应用程序的第一个窗口呈现在用户眼前。通过使action取不同的值,可以启动不同的活动,其中包括一些系统活动和用户所设定的活动。
在Android系统中,要启动某一个活动,需要发送Intent对象给Android平台,Android平台通过Intent中包含的action名称来决定启动哪一个Activity。可以通过这种方式来对一些现有应用程序中的运行活动进行替代,向应用程序发送模拟数据,对应用程序进行运行测试。
以替代Android相机程序为例,假设程序员在编制程序过程中,需要调用相机获取图像之后才能继续进行程序调试,但是每次打开相机获取图像时操作过于缓慢。我们可以创建一个测试应用项目,通过修改Intent调用机制,使应用程序每次只调用我们编写的测试应用,而不启动Android平台中的相机应用,在测试应用中,可以直接为调用者提供他们所需要的已经拍照好的图像,这样就可以节省大量程序调试时间,同时为程序调试提供特定数据。
首先,明确在我们所使用的Android平台中需要替换的应用程序的完整包名和调用此应用程序所指定的Intent的属性值内容。为获取以上两方面信息,可以借助网络上的APK反编译工具对所要替代程序的安装包进行反编译,本文推荐比较常用的APK反编译工具APK Editor Pro,图形化界面易操作。之后在反编译好的文件夹中找到该程序的AndroidManifest.xml文件,在该文件中查找到此程序的完整包名和调用该程序所发出的intent值并记录。
图2 Android对相同Intent请求调用示意图
然后,在建立测试应用项目时对该项目空间命名,采用刚刚查找到的包名信息进行命名,在测试项目的AndroidManifest.xml文件中对Activity进行定义时,intent-filter标签中的action属性值设成我们记录的intent值。以这种方式进行设置后,如果将测试程序安装到现有Android平台后,在平台当中就会出现两个同名包的应用程序,那么当启动该名称的程序时,Android系统会调用最后安装的应用程序,这样就实现了原有启动程序的替换。此方案详细替换过程如图2所示,经过替换后,由测试程序向主程序提供调用返回数据。
最后,可以在测试程序中按照预先设定,为主程序提供所需的测试数据,在提供数据之前,也可以在测试程序中对测试数据进行加工处理,以适应主程序要求。
本文中提供的方法可以用作替换现有第三方应用程序被自开发的程序调用,针对不便修改的第三方程序也可以调用其它活动进行替换,从而为第三方程序提供我们想提供给它的数据内容,但在这方面应用时,需要注意相关的版权问题及相关的法律法规。