技术难点1--- 第一步:
从PC端写数据到android系统驱动让android系统做出反应
2014年5月25日星期日 鏖战了大半天,终于迈出了第一步
实现步骤:
1、手机通过数据线连上PC
2、打开win7的cmd终端
3、在终端打开android调试工具 输入命令adb shell 效果如下:
4、获取手机(我自己的手机)的驱动文件的输出,在终端输入getevent,然后随便在手机上操作,会看到终端很多输出结果,
比如 我在我的手机主页上按了下微信图标,输出结果如下图所示:
我的手机屏幕截图如下:
终端输出的代码如下:
/dev/input/event4: 0001 014a 00000001
/dev/input/event4: 0003 0030 00000001
/dev/input/event4: 0003 0035 00000047
/dev/input/event4: 0003 0036 000001f5
/dev/input/event4: 0000 0002 00000000
/dev/input/event4: 0000 0000 00000000
/dev/input/event4: 0003 0030 00000001
/dev/input/event4: 0003 0035 00000046
/dev/input/event4: 0003 0036 000001f5
/dev/input/event4: 0000 0002 00000000
/dev/input/event4: 0000 0000 00000000
/dev/input/event4: 0003 0030 00000001
/dev/input/event4: 0003 0035 00000046
/dev/input/event4: 0003 0036 000001f4
/dev/input/event4: 0000 0002 00000000
/dev/input/event4: 0000 0000 00000000
/dev/input/event4: 0003 0030 00000001
/dev/input/event4: 0003 0035 00000046
/dev/input/event4: 0003 0036 000001f4
/dev/input/event4: 0000 0002 00000000
/dev/input/event4: 0000 0000 00000000
/dev/input/event4: 0001 014a 00000000
/dev/input/event4: 0000 0002 00000000
/dev/input/event4: 0000 0000 00000000
这些指令都同一个格式,device type code value,
设备号,一般是event0~9;type是指响应的事件类型,比如鼠标键盘事件;code是指事件的更细的分类,比如按钮触摸之类。value就是具体的值了,比如X坐标的值,Y坐标的值,或者键盘按下弹起的值。
这段代码的解释需要先把里面的十六进制转成10进制,我写了个小工具,java程序,
下载地址http://download.csdn.net/detail/diaoliangwang/7399627,不用资源分的,
可以直接将这种类型的输出结果中的十六进制转成十进制输出,关键是
转成十进制才能更好弄明白每一行的含义,而且从PC端注入代码到驱动程序的时候也要用十进制的,输出结果如下:
我写的java转换工具在每行结果前面都加了指令sendevent ,主要是为了重新注入方便,直接复制就可以了。
sendevent /dev/input/event4 0 0 0
sendevent /dev/input/event4 1 330 1
sendevent /dev/input/event4 3 48 1
sendevent /dev/input/event4 3 53 71
sendevent /dev/input/event4 3 54 501
sendevent /dev/input/event4 0 2 0
sendevent /dev/input/event4 0 0 0
sendevent /dev/input/event4 3 48 1
sendevent /dev/input/event4 3 53 70
sendevent /dev/input/event4 3 54 501
sendevent /dev/input/event4 0 2 0
sendevent /dev/input/event4 0 0 0
sendevent /dev/input/event4 3 48 1
sendevent /dev/input/event4 3 53 70
sendevent /dev/input/event4 3 54 500
sendevent /dev/input/event4 0 2 0
sendevent /dev/input/event4 0 0 0
sendevent /dev/input/event4 3 48 1
sendevent /dev/input/event4 3 53 70
sendevent /dev/input/event4 3 54 500
sendevent /dev/input/event4 0 2 0
sendevent /dev/input/event4 0 0 0
sendevent /dev/input/event4 1 330 0
sendevent /dev/input/event4 0 2 0
sendevent /dev/input/event4 0 0 0
好了 下面我就解释下这段代码的含义:
sendevent /dev/input/event4 0 0 0--------事件分割,避免和之前的事件冲突
sendevent /dev/input/event4 1 330 1------1在linux中代表EV_KEY 330即0x14a在linux中代表 BTN_TOUCH 1代表按下
sendevent /dev/input/event4 3 53 89------我手机上的X坐标 这个值可以变化 但是不要超出图标的点击范围
sendevent /dev/input/event4 3 54 899-----我手机上的Y坐标 这个值可以变化 但是不要超出图标的点击范围
sendevent /dev/input/event4 0 0 0--------事件分割
sendevent /dev/input/event4 1 330 0------EV_KEY BTN_TOUCH 0代表弹起
sendevent /dev/input/event4 0 0 0--------事件分割
sendevent /dev/input/event4 0 0 0--------事件分割
sendevent /dev/input/event4 3 48 1 没有用 删除不影响
sendevent /dev/input/event4 0 2 0 没有用 应该也是事件分割 其他人的手机上没有这一行输出 删除不影响
上述含义的发现,对我来讲是个很痛苦而且很有意义的过程,具体的发现过程我写在另一个博客里了,有兴趣可以看看。
链接如下:http://blog.csdn.net/diaoliangwang/article/details/26977603
这下基本就了解了上述代码的含义了,其实精简一下上述代码,如下
sendevent /dev/input/event4 0 0 0
sendevent /dev/input/event4 1 330 1
sendevent /dev/input/event4 3 53 71
sendevent /dev/input/event4 3 54 501
sendevent /dev/input/event4 0 0 0
sendevent /dev/input/event4 1 330 0
sendevent /dev/input/event4 0 0 0
就这几行,其他的代码是android系统自己加上去的,其实好好读读那几十行代码,发现有好几段是重复的,主要是在重复发送点击的坐标的x,y的值。
然后,再重新打开一个终端,然后输入adb shell, 然后把上面经过我的java工具转换的输出或者我上面精简过的输出,复制到终端里运行,
手机就会自动进行启动微信,前提是,手机当前显示的界面也要在主页。注意一个问题,上面的这些代码是我的手机的输出,放到其他手机上基本是不能用的,
我的手机是山寨智能机,但是基本测试没有问题,如果你要自己测试用,要用自己的手机测试输出。