模拟按键
上一篇 / 下一篇 2012-10-11 14:26:32 / 个人分类:Android软件测试
模拟按键在android自动化测试中,可以说是不得不接触到的一个技术点了.在SDK1.6之前可以使用IWindowsManager这个接口来实现,在SDK1.6以后该接口被隐藏.如果一定要使用,只能在源码的环境下,去掉隐藏的标签,让该接口开放,然后编译SDK后才可以.
这里提到另外一种方式,也是要在源码的环境下编译,但是不用修改源代码,只需要有源码的编译环境就可以了.具体的实现方法如下:
1. 在源码的 framework/base/cmds/目录下建一个文件夹,比如AutoTest
然后在AutoTest目录下建立两个文件:Android.mk, AutoTest.java,两个文件的具体内容如下:
Android.mk:
# Copyright 2008 The Android Open Source Project
#
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
#
LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)
LOCAL_SRC_FILES := $(call all-subdir-java-files)
LOCAL_MODULE := autotest
include $(BUILD_JAVA_LIBRARY)
LOCAL_MODULE := autotest
include $(BUILD_JAVA_LIBRARY)
AutoTest.java:
import android.view.MotionEvent;
import android.view.KeyEvent;
import android.view.IWindowManager;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.RemoteException;
import android.util.Log;
import android.view.KeyEvent;
import android.view.IWindowManager;
import android.os.ServiceManager;
import android.os.SystemClock;
import android.os.RemoteException;
import android.util.Log;
public class AutoTest {
public static void main(String args[]) throws Exception {
String[] mArgs = args;
try {
String pt = mArgs[0];
if (opt.equals("touch")) {
float x = Float.valueOf(mArgs[1]);
float y = Float.valueOf(mArgs[2]);
MotionEvent e = MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, x,
y, 0);
sendPointerSync(e);
e = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock
.uptimeMillis(), MotionEvent.ACTION_UP, x, y, 0);
sendPointerSync(e);
}
String[] mArgs = args;
try {
String pt = mArgs[0];
if (opt.equals("touch")) {
float x = Float.valueOf(mArgs[1]);
float y = Float.valueOf(mArgs[2]);
MotionEvent e = MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, x,
y, 0);
sendPointerSync(e);
e = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock
.uptimeMillis(), MotionEvent.ACTION_UP, x, y, 0);
sendPointerSync(e);
}
else if (opt.equals("move")) {
float x = Float.valueOf(mArgs[1]);
float y = Float.valueOf(mArgs[2]);
float x2 = Float.valueOf(mArgs[3]);
float y2 = Float.valueOf(mArgs[4]);
float x = Float.valueOf(mArgs[1]);
float y = Float.valueOf(mArgs[2]);
float x2 = Float.valueOf(mArgs[3]);
float y2 = Float.valueOf(mArgs[4]);
MotionEvent e = MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, x,
y, 0);
sendPointerSync(e);
e = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock
.uptimeMillis(), MotionEvent.ACTION_MOVE, x, y, 0);
sendPointerSync(e);
e = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock
.uptimeMillis(), MotionEvent.ACTION_MOVE, x, y, 0);
sendPointerSync(e);
e = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock
.uptimeMillis(), MotionEvent.ACTION_MOVE, x2, y2, 0);
sendPointerSync(e);
e = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock
.uptimeMillis(), MotionEvent.ACTION_MOVE, x2, y2, 0);
sendPointerSync(e);
e = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock
.uptimeMillis(), MotionEvent.ACTION_UP, x2, y2, 0);
sendPointerSync(e);
}
SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, x,
y, 0);
sendPointerSync(e);
e = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock
.uptimeMillis(), MotionEvent.ACTION_MOVE, x, y, 0);
sendPointerSync(e);
e = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock
.uptimeMillis(), MotionEvent.ACTION_MOVE, x, y, 0);
sendPointerSync(e);
e = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock
.uptimeMillis(), MotionEvent.ACTION_MOVE, x2, y2, 0);
sendPointerSync(e);
e = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock
.uptimeMillis(), MotionEvent.ACTION_MOVE, x2, y2, 0);
sendPointerSync(e);
e = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock
.uptimeMillis(), MotionEvent.ACTION_UP, x2, y2, 0);
sendPointerSync(e);
}
else if (opt.equals("press")) {
int keycode = Integer.valueOf(mArgs[1]);
KeyEvent k = new KeyEvent(KeyEvent.ACTION_DOWN, keycode);
sendKeySync(k);
k = new KeyEvent(KeyEvent.ACTION_UP, keycode);
sendKeySync(k);
} else if (opt.equals("wait")) {
int millsecond = Integer.valueOf(mArgs[1]);
Thread.sleep(millsecond);
} else if (opt.equals("presshold")){
int keycode = Integer.valueOf(mArgs[1]);
KeyEvent k = new KeyEvent(KeyEvent.ACTION_DOWN, keycode);
sendKeySync(k);
k = new KeyEvent(KeyEvent.ACTION_UP, keycode);
sendKeySync(k);
} else if (opt.equals("wait")) {
int millsecond = Integer.valueOf(mArgs[1]);
Thread.sleep(millsecond);
} else if (opt.equals("presshold")){
int keycode = Integer.valueOf(mArgs[1]);
int millsecond = Integer.valueOf(mArgs[2]);
KeyEvent k = new KeyEvent(KeyEvent.ACTION_DOWN, keycode);
sendKeySync(k);
Thread.sleep(millsecond);
k = new KeyEvent(KeyEvent.ACTION_UP, keycode);
sendKeySync(k);
} else if (opt.equals("touchhold")) {
float x = Float.valueOf(mArgs[1]);
float y = Float.valueOf(mArgs[2]);
int millsecond = Integer.valueOf(mArgs[3]);
MotionEvent e = MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, x,
y, 0);
sendPointerSync(e);
Thread.sleep(millsecond);
e = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock
.uptimeMillis(), MotionEvent.ACTION_UP, x, y, 0);
sendPointerSync(e);
} else if(opt.equals("-help")){
showUsage();
}else
System.err.println("** Error: Unknown option: " + opt);
} catch (RuntimeException ex) {
}
Thread.sleep(2000);
}
int millsecond = Integer.valueOf(mArgs[2]);
KeyEvent k = new KeyEvent(KeyEvent.ACTION_DOWN, keycode);
sendKeySync(k);
Thread.sleep(millsecond);
k = new KeyEvent(KeyEvent.ACTION_UP, keycode);
sendKeySync(k);
} else if (opt.equals("touchhold")) {
float x = Float.valueOf(mArgs[1]);
float y = Float.valueOf(mArgs[2]);
int millsecond = Integer.valueOf(mArgs[3]);
MotionEvent e = MotionEvent.obtain(SystemClock.uptimeMillis(),
SystemClock.uptimeMillis(), MotionEvent.ACTION_DOWN, x,
y, 0);
sendPointerSync(e);
Thread.sleep(millsecond);
e = MotionEvent.obtain(SystemClock.uptimeMillis(), SystemClock
.uptimeMillis(), MotionEvent.ACTION_UP, x, y, 0);
sendPointerSync(e);
} else if(opt.equals("-help")){
showUsage();
}else
System.err.println("** Error: Unknown option: " + opt);
} catch (RuntimeException ex) {
}
Thread.sleep(2000);
}
private static void sendPointerSync(MotionEvent event) {
try {
(IWindowManager.Stub.asInterface(ServiceManager
try {
(IWindowManager.Stub.asInterface(ServiceManager
.getService("window"))).injectPointerEvent(event, true);
} catch (RemoteException e) {
}
}
} catch (RemoteException e) {
}
}
private static void sendKeySync(KeyEvent event) {
try {
(IWindowManager.Stub.asInterface(ServiceManager
.getService("window"))).injectKeyEvent(event, true);
} catch (RemoteException e) {
}
}
try {
(IWindowManager.Stub.asInterface(ServiceManager
.getService("window"))).injectKeyEvent(event, true);
} catch (RemoteException e) {
}
}
private static void showUsage() {
System.err.println("usage: autotest [press|presshold|move|touch|touchhold|wait]");
System.err.println(" autotest press <keycode>");
System.err.println(" autotest presshold <keycode, time>");
System.err.println(" autotest move <x,y,x2,y2>");
System.err.println(" autotest touch <x,y>");
System.err.println(" autotest touchhold <x,y,time>");
System.err.println(" autotest wait <time>");
}
}
完成以上工作以后,就可以源码的主目录下输入如下命令:
System.err.println("usage: autotest [press|presshold|move|touch|touchhold|wait]");
System.err.println(" autotest press <keycode>");
System.err.println(" autotest presshold <keycode, time>");
System.err.println(" autotest move <x,y,x2,y2>");
System.err.println(" autotest touch <x,y>");
System.err.println(" autotest touchhold <x,y,time>");
System.err.println(" autotest wait <time>");
}
}
完成以上工作以后,就可以源码的主目录下输入如下命令:
. build/envsetup.sh
然后返回你的工程目录,也就是AutoTest下输入mm就可以了,编译完成以后会生成一个autotest.jar文件,位于/out/target/product/generic/system/framework下.
2. 生成autotest.jar了以后,就完成了一半的工作,接下来只需要进行简单的整合就可以工作了.
首先建一个新文件命名为autotest,在该文件中输入如下代码
# Script. to start "monkey" on the device, which has a very rudimentary
# shell.
#
base=/system
export CLASSPATH=$base/framework/autotest.jar
exec app_process $base/bin AutoTest $*
然后将autotest放到终端的/system/bin目录下,并且将该文件的属性提高(chmod 777 /system/bin/autotest),然后将autotest.jar放到/system/framework下.
3. 完成上述两个,在串口或者adb shell下就可以使用我们自己的工具了.
使用 adb shell autotest -help 查看具体的用法吧.
TAG: 模拟按键