android控制之 adb shell (已完成,不按期增長內容)

第一步:首先,下載adb1.0.32.zip,裏面有以下圖的內容:java

第二步:解壓縮,複製Adb.exe,和fastboot.exe到System32,注意AdbWinUsbApi.dll,AdbWinApi.dll這兩個複製到System文件夾,否則打不開!linux

第三步:打開adb,必須使用cmd,否則閃退;使用cmd直接輸入adb便可;如圖android

第四步:pc安裝android手機驅動shell

(我跳過該步驟,直接打算wifi鏈接真機)less

安卓手機root,(使用root大師),安裝adb wareless,給予root權限;ui

 

第五步:編寫java代碼 操做Adbspa

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.net

說明已經成功開始執行!3d

 可是這裏出現問題: daemon not running.starting it now on port 5037code

       嘗試解決,鏈接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目錄下;(可是這種方法在嵌入式開發裏面無心增長了成本,拷貝了一些沒必要要的動態庫文件,增大了根文件系統的體積)

 (上述問題依然正在解決)

 

下面,進行adb 模擬滑動,點擊等事件:

模擬事件所有是經過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

相關文章
相關標籤/搜索