android虚拟机触屏事件模拟(利用exec函数来实现)

        本文通过adb shell input keyevent 3这个实例来说明修改android源码来模拟触摸屏事件。(注:adb shell input keyevent 3该命令是返回主屏幕指令。)

        进入android虚拟机/system/bin/下我们发现很多指令,有screencap截取当前android屏幕指令,也有本文将要说的input指令。这些指令怎么来的?可不可以自己写一些指令,比如将adb shell input keyevent 3指令换成adb shell input_touch_simulater,input_touch_simulater这条指令就是我们加入的,后期可以通过这条指令来模拟更多input事件,甚至添加socket获取坐标来实现web端和android虚拟机同步事件。好了,闲话不聊,我正在实现web端和android虚拟机同步事件。先总结一下input_touch_simulater这条指令创建。

        我们可以看到screencap指令源代码在android/framework/base/cmds/screencap/下,有两个文件,screencap.cpp和Android.mk。因此该目录下应该就是创建命令目录,

执行:

cd android/framework/base/cmds/

mkdir input_touch_simulater

cd input_touch_simulater

gedit input_touch_simulater.cpp

这一步input_touch_simulater.cpp编写可以参照linux中exec命令使用来编辑:本文要实现adb shell input keyevent 3,直接贴出代码:

input_touch_simulater.cpp

#include 
#include 
#include 
#include 
#include 
 
int main() {

    const char *arg_keyevent[3] = { "input", "keyevent", "3"};//参数是可以更改的,比如实现swipe滑动,可以添加参数     
    if ( fork() == 0 ) {
      
      if ( execlp( "/system/bin/input", arg[0], arg[1], arg[2], NULL) < 0 ) {//命令路径是在/system/bin/input下
          perror( "execlp error " );
          exit(1);
      }
    }
   return EXIT_SUCCESS;
}
然后编辑Android.mk,

LOCAL_PATH:= $(call my-dir)
include $(CLEAR_VARS)

LOCAL_SRC_FILES:= \
    input_touch_simulater.cpp

LOCAL_SHARED_LIBRARIES := \
    libcutils \
    libutils \
    libbinder \
    libskia \
    libui \
    libgui

LOCAL_MODULE:= input_touch_simulater

LOCAL_MODULE_TAGS := optional

LOCAL_CFLAGS += -Wall -Werror -Wunused -Wunreachable-code

include $(BUILD_EXECUTABLE)

到现在直接编译android没用,因为编译规则没有把这个文件夹包括进去。需要在android/build/target/product/目录下修改core_tiny.mk和core_minimal.mk文件,都是
找到screencap\,在后面添加input_touch_simulater\

开始编译

source build/envsetup.sh

lunch 6

make -j8

编译成功后,启动虚拟机:emulator&

然后进入菜单页,然后执行adb shell input_touch_simulater指令可以发现,虚拟机返回主页面,说明自己创建指令成功。





你可能感兴趣的:(android)