第一步:首先,下载adb1.0.32.zip,里面有如下图的内容:

f5031ff0149bceaaa43e0d44106d8812.png

第二步:解压缩,复制Adb.exe,和fastboot.exe到System32,注意AdbWinUsbApi.dll,AdbWinApi.dll这两个复制到System文件夹,不然打不开!

第三步:打开adb,必须使用cmd,不然闪退;使用cmd直接输入adb即可;如图

546ba43af78e2bd5b0e27473053554ef.png

第四步:pc安装android手机驱动

(我跳过该步骤,直接打算wifi连接真机)

安卓手机root,(使用root大师),安装adb wareless,给予root权限;

第五步:编写java代码 操作Adb

importjava.io.BufferedReader;importjava.io.BufferedWriter;importjava.io.IOException;importjava.io.InputStreamReader;importjava.io.OutputStreamWriter;public classt1 {public static void main(String[] args){try{

Process process= Runtime.getRuntime().exec("adb shell"); //adb shell

final BufferedWriter outputStream = new BufferedWriter(newOutputStreamWriter(process.getOutputStream()));final BufferedReader inputStream = new BufferedReader(newInputStreamReader(process.getInputStream()));//这里一定要注意错误流的读取,不然很容易阻塞,得不到你想要的结果,

final BufferedReader errorReader = new BufferedReader(newInputStreamReader(process.getErrorStream()));new Thread(newRunnable() {

String line;public voidrun() {

System.out.println("listener started");try{while((line=inputStream.readLine()) != null) {

System.out.println(line);

}

}catch(IOException e) {//e.printStackTrace();

}

}

}).start();new Thread(newRunnable() {final BufferedReader br = new BufferedReader(newInputStreamReader(System.in));public voidrun() {

System.out.println("writer started");

String line;try{while ((line =br.readLine()) != null) {

outputStream.write(line+ "\r\n");

outputStream.flush();

}

}catch(IOException e) {//e.printStackTrace();

}

}

}).start();int i =process.waitFor();

System.out.println("i=" +i);

}catch(Exception e) {

e.printStackTrace();

}

}

}

运行结果:console

4da1737f77d0acdd141fd295481b459f.png

说明已经成功开始执行!

但是这里出现问题: daemon not running.starting it now on port 5037

尝试解决,连接android USB线,adb shell依然显示

99e03ad701b4a94798d528a4c0779732.png

具体情况:5037端口未被占用

完美解决方案:1.将本机C:\WINDOWS\System32下的adb.exe文件复制到C:\Windows\SysWOW64下。

2.将本机C:\WINDOWS\System32下的AdbWinApi.dll文件复制到C:\Windows\SysWOW64下。

然后adb shell, 搞定!出现$,可以执行命令了!

5bf85ec2dbbf24caaf3188553b532998.png

下面,编写截屏指令:

注意:

如果文件名以.png结尾时,它将保存为png文件

如果文件名没有给出,则结果被会被输出到stdout

截图保存到SD卡里再导出

$ adb shell screencap-p /sdcard/screen.png

$ adb pull/sdcard/screen.png

$ adb shell rm/sdcard/screen.png

这种方法比较麻烦,需要3步:1. 截图保存到sdcard 2.将图片导出 3.删除sdcard中的图片

截图直接保存到电脑

$ adb shell screencap-p | sed 's/\r$//' >screen.png

执行adb shell 将\n转换\r\n, 因此需要用sed删除多余的\r

如果直接当命令用还可以用 alias 包裝装起來:

$ alias and-screencap="adb shell screencap -p | sed 's/\r$//'"$ and-screencap >screen.png

以后就可以方便的用and-screencap > 直接将截图保存到电脑上了

今天执行screencap /sdcard/1.png后,成功在sdcard找到文件;但是执行pull /sdcard/1.png出现:/system/bin/sh: pull :not found

4a9f2b5cc30b346ba48da61086d2cebd.png

很不理解,后来发现了一个很棒的总结:

关于-/bin/sh:xx(命令) not found  的几种原因:

1./bin/目录下没有这个命令;

2.bin/目录有这个命令,只是执行权限不够,或者程序执行权限不够;

3.程序需要的静态库或者动态库没有;

解决办法:

原因一的解决方法:安装busy box将busy box支持的命令安装到文件系统的bin目录下;(只要安装了busy box它会自动加载命令到bin目录下,这个你懂的,若不懂请看我的博文《根文件系统的制作》)

原因二的解决方法:在/bin/目录下找到对应的命令,修改其权限为777;具体操作: chmod   777  xx(命令)  【附加:在编写执行脚本文件时不能运行也大多是没有修改脚本权限的问题(命令其实就是一个特殊的脚本)】

原因三的解决方法:

(1)最“高效”的解决方法:用命令:arm-linux-readelf   -d   xxx(目标文件/命令)    查看xxx使用的动态库

如图:我的iwlist命令使用的动态库是libiw.so.29 、libm.so.6 和libc.so.6

1333339909_9272.PNG

于是我便去交叉编译器所在目录/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib下的动态库中寻找所需的上面三个库libiw.so.29 、libm.so.6 和libc.so.6  ,并复制到根文件系统的lib目录下:

(注意:这里我使用交叉编译器的版本为4.3.2的版本所以目录4.3.2有所不同即到/usr/local/arm/(编译器版本)/arm-none-linux-gnueabi/libc/armv4t/lib下的动态库中寻找)

1333340340_4844.PNG

(2)最“2”最笨的方法:把/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib下的所有动态库都拷贝到根文件系统的lib目录下;(但是这种方法在嵌入式开发里面无意增加了成本,拷贝了一些不必要的动态库文件,增大了根文件系统的体积)

(上述问题依然正在解决)

下面,进行adb 模拟滑动,点击等事件:

模拟事件全部是通过input命令来实现的,首先看一下input命令的使用:

usage: input ...

input text

input keyevent

input tap

input swipe

1. keyevent指的是Android对应的keycode,比如home键的keycode=3,back键的keycode=4.

KEYCODE_UNKNOWN=0;

KEYCODE_SOFT_LEFT=1;

KEYCODE_SOFT_RIGHT=2;

KEYCODE_HOME=3;

KEYCODE_BACK=4;

KEYCODE_CALL=5;

KEYCODE_ENDCALL=6;

KEYCODE_0=7;

KEYCODE_1=8;

KEYCODE_2=9;

KEYCODE_3=10;

KEYCODE_4=11;

KEYCODE_5=12;

KEYCODE_6=13;

KEYCODE_7=14;

KEYCODE_8=15;

KEYCODE_9=16;

KEYCODE_STAR=17;

KEYCODE_POUND=18;

KEYCODE_DPAD_UP=19;

KEYCODE_DPAD_DOWN=20;

KEYCODE_DPAD_LEFT=21;

KEYCODE_DPAD_RIGHT=22;

KEYCODE_DPAD_CENTER=23;

KEYCODE_VOLUME_UP=24;

KEYCODE_VOLUME_DOWN=25;

KEYCODE_POWER=26;

KEYCODE_CAMERA=27;

KEYCODE_CLEAR=28;

KEYCODE_A=29;

KEYCODE_B=30;

KEYCODE_C=31;

KEYCODE_D=32;

KEYCODE_E=33;

KEYCODE_F=34;

KEYCODE_G=35;

KEYCODE_H=36;

KEYCODE_I=37;

KEYCODE_J=38;

KEYCODE_K=39;

KEYCODE_L=40;

KEYCODE_M=41;

KEYCODE_N=42;

KEYCODE_O=43;

KEYCODE_P=44;

KEYCODE_Q=45;

KEYCODE_R=46;

KEYCODE_S=47;

KEYCODE_T=48;

KEYCODE_U=49;

KEYCODE_V=50;

KEYCODE_W=51;

KEYCODE_X=52;

KEYCODE_Y=53;

KEYCODE_Z=54;

KEYCODE_COMMA=55;

KEYCODE_PERIOD=56;

KEYCODE_ALT_LEFT=57;

KEYCODE_ALT_RIGHT=58;

KEYCODE_SHIFT_LEFT=59;

KEYCODE_SHIFT_RIGHT=60;

KEYCODE_TAB=61;

KEYCODE_SPACE=62;

KEYCODE_SYM=63;

KEYCODE_EXPLORER=64;

KEYCODE_ENVELOPE=65;

KEYCODE_ENTER=66;

KEYCODE_DEL=67;

KEYCODE_GRAVE=68;

KEYCODE_MINUS=69;

KEYCODE_EQUALS=70;

KEYCODE_LEFT_BRACKET=71;

KEYCODE_RIGHT_BRACKET=72;

KEYCODE_BACKSLASH=73;

KEYCODE_SEMICOLON=74;

KEYCODE_APOSTROPHE=75;

KEYCODE_SLASH=76;

KEYCODE_AT=77;

KEYCODE_NUM=78;

KEYCODE_HEADSETHOOK=79;

KEYCODE_FOCUS=80;//*Camera*focus

KEYCODE_PLUS=81;

KEYCODE_MENU=82;

KEYCODE_NOTIFICATION=83;

KEYCODE_SEARCH=84;

KEYCODE_MEDIA_PLAY_PAUSE=85;

KEYCODE_MEDIA_STOP=86;

KEYCODE_MEDIA_NEXT=87;

KEYCODE_MEDIA_PREVIOUS=88;

KEYCODE_MEDIA_REWIND=89;

KEYCODE_MEDIA_FAST_FORWARD=90;

KEYCODE_MUTE=91;

然后使用的话比较简单,比如想模拟home按键:

adb shell input keyevent 3

请查阅上述文章,根据具体keycode编辑即可。

2. 关于tap的话,他模拟的是touch屏幕的事件,只需给出x、y坐标即可。

此x、y坐标对应的是真实的屏幕分辨率,所以要根据具体手机具体看,比如你想点击屏幕(x, y) = (250, 250)位置:

adb shell input tap 250 250

3. 关于swipe同tap是一样的,只是他是模拟滑动的事件,给出起点和终点的坐标即可。例如从屏幕(250, 250), 到屏幕(300, 300)即

adb shell input swipe 250 250 300 300

参考文献:

http://blog.csdn.net/xishuluoye/article/details/17880663

http://blog.csdn.net/yx_l128125/article/details/7418882

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐