模拟按键

上一篇 / 下一篇  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_SRC_FILES := $(call all-subdir-java-files)
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;
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);
                        }
                        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]);
                                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);
                        }
                        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]);
                                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
                                       .getService("window"))).injectPointerEvent(event, true);
                } catch (RemoteException e) {
                }
        }
        private static void sendKeySync(KeyEvent event) {
                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>");
    }
}
完成以上工作以后,就可以源码的主目录下输入如下命令:
. 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: 模拟按键

 

评分:0

我来说两句

我的栏目

日历

« 2024-04-16  
 123456
78910111213
14151617181920
21222324252627
282930    

数据统计

  • 访问量: 12723
  • 日志数: 3
  • 建立时间: 2012-10-11
  • 更新时间: 2013-03-04

RSS订阅

Open Toolbar