zoukankan      html  css  js  c++  java
  • android控制之 adb shell (已完成,不定期增加内容)

    第一步:首先,下载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 + "
    ");
    
                            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:WINDOWSSystem32下的adb.exe文件复制到C:WindowsSysWOW64下。
    2.将本机C:WINDOWSSystem32下的AdbWinApi.dll文件复制到C:WindowsSysWOW64下。

    然后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/
    $//' > screen.png
    执行adb shell 将
    转换
    , 因此需要用sed删除多余的
    
    
    如果直接当命令用还可以用 alias 包裝装起來:
    
    $ alias and-screencap="adb shell screencap -p | sed 's/
    $//'"
    $ 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

  • 相关阅读:
    局部人物磨皮(二)
    可选颜色--六中色调的调整(二)
    可选颜色--六中色调的调整(一)
    通道混合器
    系统提权
    在NSObject类中,和继承它的类中,弹出UIAlertcontroller和push、present到其它界面
    oc中代理的简单运用
    单击和双击手势冲突的解决,取消页面所有手势
    iOS中主题切换模拟
    iOS 中各种手势的用法
  • 原文地址:https://www.cnblogs.com/jokerjason/p/5828702.html
Copyright © 2011-2022 走看看