第一步:首先,下載adb1.0.32.zip,里面有如下圖的內容:
第二步:解壓縮,復制Adb.exe,和fastboot.exe到System32,注意AdbWinUsbApi.dll,AdbWinApi.dll這兩個復制到System文件夾,不然打不開!
第三步:打開adb,必須使用cmd,不然閃退;使用cmd直接輸入adb即可;如圖
第四步:pc安裝android手機驅動
(我跳過該步驟,直接打算wifi連接真機)
安卓手機root,(使用root大師),安裝adb wareless,給予root權限;
第五步:編寫java代碼 操作Adb
import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.IOException; import java.io.InputStreamReader; import java.io.OutputStreamWriter; public class t1 { public static void main(String[] args){try { Process process = Runtime.getRuntime().exec("adb shell"); //adb shell final BufferedWriter outputStream = new BufferedWriter(new OutputStreamWriter(process.getOutputStream())); final BufferedReader inputStream = new BufferedReader(new InputStreamReader(process.getInputStream())); //這里一定要注意錯誤流的讀取,不然很容易阻塞,得不到你想要的結果, final BufferedReader errorReader = new BufferedReader(new InputStreamReader(process.getErrorStream())); new Thread(new Runnable() { String line; public void run() { System.out.println("listener started"); try { while((line=inputStream.readLine()) != null) { System.out.println(line); } } catch (IOException e) { //e.printStackTrace(); } } }).start(); new Thread(new Runnable() { final BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); public void run() { 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
說明已經成功開始執行!
但是這里出現問題: daemon not running.starting it now on port 5037
嘗試解決,連接android USB線,adb shell依然顯示
具體情況:5037端口未被占用
完美解決方案:1.將本機C:\WINDOWS\System32下的adb.exe文件復制到C:\Windows\SysWOW64下。
2.將本機C:\WINDOWS\System32下的AdbWinApi.dll文件復制到C:\Windows\SysWOW64下。
然后adb shell, 搞定!出現$,可以執行命令了!
下面,編寫截屏指令:
注意: 如果文件名以.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
很不理解,后來發現了一個很棒的總結:
關於-/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
於是我便去交叉編譯器所在目錄/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下的動態庫中尋找)
(2)最“2”最笨的方法:把/usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib下的所有動態庫都拷貝到根文件系統的lib目錄下;(但是這種方法在嵌入式開發里面無意增加了成本,拷貝了一些不必要的動態庫文件,增大了根文件系統的體積)
(上述問題依然正在解決)
模擬事件全部是通過input命令來實現的,首先看一下input命令的使用:
usage: input ...
input text <string>
input keyevent <key code number or name>
input tap <x> <y>
input swipe <x1> <y1> <x2> <y2>
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