〇. adb下载与安装

1 下载

adb驱动下载地址:https://download.csdn.net/download/lwl223442/12700027

解压后运行adb.exe文件

2安装

解压后运行adb.exe文件,出现如图一界面。

安装时候选择一个容易记住的路径,这个很重要,因为adb驱动没有自动配置环境变量,所以实验时候将adb安装在一个非常容易记住的路径,这里以E:\adb为例。如图一:

图一

安装完成后我们在CMD控制台输入adb是没有反应的,因为我们还没有配置好adb的环境变量,我们可以右键点击我的电脑,选择属性,点击高级系统设置,在高级中点击环境变量。

进入环境变量配置页面之后,在系统变量中找到Path,点击Path再点击编辑,然后将刚才安装adb的路径复制,这里我们是以E:\adb为例的,所以我们将这个路径加入进环境变量中,点击保存。这时候我们再次打开CMD控制台,输入adb,出现如下界面,即为配置成功。如图:

3、 手机与电脑相连

将安卓手机用USB与电脑相连接,在安卓手机上打开开发者模式,并开启USB调试模式,每种安卓手机开启的方法都不一样,这里需要小伙伴自己查询自己型号的手机如何开启开发者模式,以华为 荣耀8手机为例,在设置中找到手机版本号,连续点击5次即可开启开发者模式。如果以上操作没有任何错误,那么在CMD控制台,执行命令 adb devices可显示当前手机连接的端口号。

一.  adb 相关命令:

  1. 关闭adb服务:adb kill-server
  2. 启动adb服务  adb start-server
  3. 查询当前运行的所有设备  adb devices
  4. 可能在adb中存在多个虚拟设备运行 可以指定虚拟设备运行  -s 虚拟设备名称 
  5. 重启设备 adb reboot  --指定虚拟设备   adb -s 设备名称 reboot
  6. 查看日志  adb logcat  清除日志 adb logcat -c
  7. 进入linux shell下  adb shell 其中常用的linux命令  cd  cat 等等 输入su可以获取超级管理员名称了 要确定是否有哪些命令 进入 system/bin目录 就知道了
   8. 传入文件到设备中 adb push 本地文件 远程目录

  9. 从设备中拷贝文件到本地  adb -s emulator-5556 pull /data/config.ini d:/

  10. 显示当前运行的全部模拟器:
      adb devices

  11. 安装应用程序:
      adb install -r 123.apk

  12. 获取模拟器中的文件:
      adb pull <remote> <local>

  13. 向模拟器中写文件:
      adb push <local> <remote>

  14. 进入模拟器的shell模式:
      adb shell

  15. 卸载apk包:
        adb shell
        cd data/app
        rm 123.apk
       exit
        adb uninstall 123.apk
        adb install -r 123.apk

  16. 查看adb命令帮助信息:
        adb help
  17. 删除系统应用:
        adb remount (重新挂载系统分区,使系统分区重新可写)。
        adb shell
        cd system/app
        rm 123.apk

  18. 获取管理员权限:
        adb root

  19、复制文件: 
       复制一个文件或目录到设备: 
       adb push <source> <destination></destination></source> 
        如:adb push update.zip /sdcard/ 
       从设备上复制一个文件或目录: 
       adb pull <source> <destination></destination></source> 
       如:adb pull /sdcard/update.zip.

  20、取得当前运行设备的实例的列表及每个实例的状态: 
      adb devices

  21:adb shell input tap
      这条命令模拟Android手机在屏幕坐标(X,Y)处进行了点击操作。

  22:adb shell input swipe

  这条命令模拟Android手机从屏幕坐标(X1,Y1)滑动到坐标(X2,Y2)的操作。

  23、uiautomator dump   dump: creates an XML dump of current UI hierarchy 这个命令是用来成成当前界面的UI层次,并用XML格式进行展示 。这样就可以获取各个组件的位置了

  注:如果PC要想同时控制多台Android手机,必须在adb 后面添加-s

  例如:adb -s 13b6e4c4 shell input tap 400 400

  表示对13b6e4c4这台Android手机进行在屏幕上(400,400)坐标位置进行模拟的点击事件。

  24.   能看到设备信息就代表设备已经连接成功了,接下来的命令就是adb install 路径+包名.apk

例如我的安装包放在桌面,那么命令就是adb install C:\Users\hyh\Desktop\XXX.apk

*** adb shell uiautomator dump /mnt/sdcard/window_dump.xml 获得手机当前界面的UI信息,生成window_dump.xml
*** adb shell input text “123” 输入text

举例:

    1、打开cmd,进入到当前文件夹中,输入命令 adb devices 查看当前与电脑连接的设备(前提是,手机打开usb调试模式),可以查看已连接成功的手机。

    2、 若手机成功连接,输入命令 adb shell input tap 100 100 , 表示点击屏幕上坐标为(100,100)的点,如果不知道需要点击的点的具体位置的话可以在手机开发者模式中设置。

二. adb 模拟按键

1. 比如使用 adb shell input keyevent <keycode> 命令,不同的 keycode 能实现不同的功能,完整的 keycode 列表详见 KeyEvent,摘引部分我觉得有意思的如下:

keycode 含义
3 HOME 键
4 返回键
5 打开拨号应用
6 挂断电话
24 增加音量
25 降低音量
26 电源键
27 拍照(需要在相机应用里)
64 打开浏览器
82 菜单键
85 播放/暂停
86 停止播放
87 播放下一首
88 播放上一首
122 移动光标到行首或列表顶部
123 移动光标到行末或列表底部
126 恢复播放
127 暂停播放
164 静音
176 打开系统设置
187 切换应用
207 打开联系人
208 打开日历
209 打开音乐
210 打开计算器
220 降低屏幕亮度
221 提高屏幕亮度
223 系统休眠
224 点亮屏幕
231 打开语音助手
276 如果没有 wakelock 则让系统休眠

2. input 命令的一些用法举例

电源键

命令:

1

adb shell input keyevent 26

执行效果相当于按电源键。

菜单键

命令:

1

adb shell input keyevent 82

HOME 键
 命令:

1

adb shell input keyevent 3

返回键
命令:

1

adb shell input keyevent 4

音量控制
增加音量:

1

adb shell input keyevent 24

降低音量:

1

adb shell input keyevent 25

静音:

1

adb shell input keyevent 164

媒体控制

播放/暂停:

1

adb shell input keyevent 85

停止播放:

1

adb shell input keyevent 86

播放下一首:

1

adb shell input keyevent 87

播放上一首:

1

adb shell input keyevent 88

恢复播放:

1

adb shell input keyevent 126

暂停播放:

1

adb shell input keyevent 127

点亮/熄灭屏幕

可以通过上文讲述过的模拟电源键来切换点亮和熄灭屏幕,但如果明确地想要点亮或者熄灭屏幕,那可以使用如下方法。

点亮屏幕:

1

adb shell input keyevent 224

熄灭屏幕:

1

adb shell input keyevent 223

三、使用python脚本自动运行cmd 命令

本节请先参考https://blog.csdn.net/lwl223442/article/details/101169348完成平台搭建

在adb文件夹下建立一个python文件

1

2

import os

os.system('adb shell input tap 100 100');

运行脚本,发现与在命令行输入相同语句有同样的效果。

2、也可以使用subprocess.Popen,最简单使用方式如下,设置shell=True,就不会弹出cmd框

1

process = subprocess.Popen('adb shell input tap 14 1402',shell=True)

程序实例:

请先下载游戏部落冲突可直接观察效果,当然不下载也可以,只会看见手机屏幕会动不知道干了啥。

import os
import sys
import re
from os import *
from time import sleep

class traintroops:

def get_screen_size(*args):
    """Get size of window and return the size for swipe function
       args 作为可变参数 表示是否传入设备的ID
    """
    if not args:
        # 如果没有传入指定设备ID,执行以下ADB command,获取设备屏幕分辨率
        size_file = os.popen("adb shell dumpsys window displays").read()
    else:
        # 如果传入指定设备ID,执行以下ADB command,获取设备屏幕分辨率
        uid = args[0]
        size_file = os.popen("adb -s %s shell dumpsys window displays" % uid).read()
    if not size_file:
        # 获取设备分辨率失败
        print("Cannot get the resolution of screen, please check the ADB.")
        sys.exit()
    else:
        # 正则表达式匹配设备分辨率
        size_match = re.search(r"(\d+)x(\d+)", size_file)
        if not size_match:
            # 设备分辨率匹配失败
            print("Failed to match the screen size.")
            sys.exit()
        else:
            # 设备分辨率信息从字符串分割转换为二元元组
            size_screen = re.split(r"x", size_match.group())
            print(size_screen)
            # 字符串元素元组转换为整型元素列表
            size = [int(size_screen[0]), int(size_screen[1])]
            return size

def pointtrainhuangmao(*args, t=2500, n=1):
      """Swipe device screen up in t milliseconds and repeat the operation n times
       t=100 作为命名关键字参数 表示默认的滑动时间为100ms 可自寻设计滑动时间
       n=1 作为命名关键字参数 表示默认的滑动次数为1次 可自寻设计滑动次数
      """
      size = traintroops.get_screen_size(*args)
      print(size[0])
      x1 = size[0] * 0.187   #202/1080  注:这里的x,y和调试手机指针的x,y是反的
      y1 = size[1] * 0.351   #673/1920
      x2 = size[0] * 0.187
      y2 = size[1] * 0.351
      #t=2500    注   t 1000   4个兵
                #注   t 1500   14个兵
                #注   t 2000   32个兵
                #注   t 2500   53个兵
                #注   t 3000   86个兵
                #注   t 3500   137个兵
      for i in range(n):
          if not args:
              os.system("adb shell input swipe %f %f %f %f %d" % (x1, y1, x2, y2, t))
          else:
              uid = args[0]
              os.system("adb -s %s shell input swipe %f %f %f %f %d" % (uid, x1, y1, x2, y2, t))
      print("已训练黄毛")

def pointtrainjuren(*args, t=1500, n=1):
      """Swipe device screen up in t milliseconds and repeat the operation n times
       t=100 作为命名关键字参数 表示默认的滑动时间为100ms 可自寻设计滑动时间
       n=1 作为命名关键字参数 表示默认的滑动次数为1次 可自寻设计滑动次数
      """
      size = traintroops.get_screen_size(*args)
      print(size[0])
      x1 = size[0] * 0.37   #400/1080  注:这里的x,y和调试手机指针的x,y是反的
      y1 = size[1] * 0.351   #673/1920
      x2 = size[0] * 0.37
      y2 = size[1] * 0.351
      #t=1500    注   t 1000   4个兵
                #注   t 1500   14个兵
                #注   t 2000   32个兵
                #注   t 2500   53个兵
                #注   t 3000   86个兵
                #注   t 3500   137个兵
      for i in range(n):
          if not args:
              os.system("adb shell input swipe %f %f %f %f %d" % (x1, y1, x2, y2, t))
          else:
              uid = args[0]
              os.system("adb -s %s shell input swipe %f %f %f %f %d" % (uid, x1, y1, x2, y2, t))
      print("已训练巨人")

def pointtrainzhadanren(*args, t=1200, n=1):
      """Swipe device screen up in t milliseconds and repeat the operation n times
       t=100 作为命名关键字参数 表示默认的滑动时间为100ms 可自寻设计滑动时间
       n=1 作为命名关键字参数 表示默认的滑动次数为1次 可自寻设计滑动次数
      """
      size = traintroops.get_screen_size(*args)
      print(size[0])
      x1 = size[0] * 0.542   #585/1080  注:这里的x,y和调试手机指针的x,y是反的
      y1 = size[1] * 0.351   #673/1920
      x2 = size[0] * 0.542
      y2 = size[1] * 0.351
      #t=1200    注   t 1000   4个兵
                #注   t 1500   14个兵
                #注   t 2000   32个兵
                #注   t 2500   53个兵
                #注   t 3000   86个兵
                #注   t 3500   137个兵
      for i in range(n):
          if not args:
              os.system("adb shell input swipe %f %f %f %f %d" % (x1, y1, x2, y2, t))
          else:
              uid = args[0]
              os.system("adb -s %s shell input swipe %f %f %f %f %d" % (uid, x1, y1, x2, y2, t))
      print("已训练炸弹人")

def pointtraingongjianshou(*args, t=2500, n=1):
      """Swipe device screen up in t milliseconds and repeat the operation n times
       t=100 作为命名关键字参数 表示默认的滑动时间为100ms 可自寻设计滑动时间
       n=1 作为命名关键字参数 表示默认的滑动次数为1次 可自寻设计滑动次数
      """
      size = traintroops.get_screen_size(*args)
      print(size[0])
      x1 = size[0] *0.186    #201/1080  注:这里的x,y和调试手机指针的x,y是反的
      y1 = size[1] *0.447    #858/1920
      x2 = size[0] *0.186
      y2 = size[1] *0.447
      #t=2500    注   t 1000   4个兵
                #注   t 1500   14个兵
                #注   t 2000   32个兵
                #注   t 2500   53个兵
                #注   t 3000   86个兵
                #注   t 3500   137个兵
      for i in range(n):
          if not args:
              os.system("adb shell input swipe %f %f %f %f %d" % (x1, y1, x2, y2, t))
          else:
              uid = args[0]
              os.system("adb -s %s shell input swipe %f %f %f %f %d" % (uid, x1, y1, x2, y2, t))
      print("已训练弓箭手")

def pointtraingebulin(*args, t=2500, n=1):
      """Swipe device screen up in t milliseconds and repeat the operation n times
       t=100 作为命名关键字参数 表示默认的滑动时间为100ms 可自寻设计滑动时间
       n=1 作为命名关键字参数 表示默认的滑动次数为1次 可自寻设计滑动次数
      """
      size = traintroops.get_screen_size(*args)
      print(size[0])
      x1 = size[0] * 0.366   #397/1080  注:这里的x,y和调试手机指针的x,y是反的
      y1 = size[1] * 0.468   #898/1920
      x2 = size[0] * 0.366
      y2 = size[1] * 0.468
      #t=2500    注   t 1000   4个兵
                #注   t 1500   14个兵
                #注   t 2000   32个兵
                #注   t 2500   53个兵
                #注   t 3000   86个兵
                #注   t 3500   137个兵
      for i in range(n):
          if not args:
              os.system("adb shell input swipe %f %f %f %f %d" % (x1, y1, x2, y2, t))
          else:
              uid = args[0]
              os.system("adb -s %s shell input swipe %f %f %f %f %d" % (uid, x1, y1, x2, y2, t))
      print("已训练哥布林")
#########################################################################################################
#########################################################################################################
#########################################################################################################
class pointtrain:

# 获取的截图文件在手机中的保存位置(默认保存在内置存储根目录下)
        # ANDRIOD_PIC_PATH = "/storage/emulated/0/tmp/screenshot.png"
        ANDRIOD_PIC_PATH = "/storage/emulated/0/screenshot.png"  # /storage/emulated/0/dctp

# 文件保存在电脑中的目录
        TRANS_PIC_PATH = "F:/screenshot.png"
        # 获取截图的adb命令
        SCREEN_CAP_CMD = "adb shell screencap -p "
        # 传输文件至电脑adb命令
        TRANS_FILE_CMD = "adb pull "
        # 获取Android手机分辨率命令
        GET_RESOLUTION_CMD = "adb shell dumpsys window displays"
        # 模拟点击命令
        POINT_SCREEN_CMD = "adb shell input tap"
        # 手机分辨率
        phoneResolution = []

def __init__(self, andriod="", trans=""):
            if andriod != "" and trans != "":
                # 判断是否为默认参数
                self.ANDRIOD_PIC_PATH = andriod
                self.TRANS_PIC_PATH = trans

def getPhoneScreen(self):
            # 获取屏幕截图
            command = self.SCREEN_CAP_CMD + self.ANDRIOD_PIC_PATH
            system(command)

def transPhoneScreen(self):
            # 将截图传输至电脑
            command = self.TRANS_FILE_CMD + self.ANDRIOD_PIC_PATH + " " + self.TRANS_PIC_PATH
            system(command)
            print("截图已获取")

# 模拟点击某一位置
        def pointOnPhone(self, x=0.0, y=0.0):
            strX = str(x)
            strY = str(y)
            command = self.POINT_SCREEN_CMD + " " + strX + " " + strY
            system(command)
            pass

# 获取屏幕分辨率
        def getPhoneResolution(self):
            # 获取命令行的打印值
            r = popen(self.GET_RESOLUTION_CMD)
            text = str(r.read())
            # 查找init=字符串,其后为手机分辨率情况
            beginC = text.find("init=")
            # 获取其后的10个字符
            line = text[beginC + 5:beginC + 15]
            resolution = line.split("x")
            self.phoneResolution.append(float(resolution[0]))
            self.phoneResolution.append(float(resolution[1]))
            print("weight =", self.phoneResolution[0], "\nheight =", self.phoneResolution[1])
            r.close()
            pass

# 点击进攻按钮
        def pointtrainBtn(self):
            # 保留两位小数
            x = 0.0344 * self.phoneResolution[1]
            y = 0.741 * self.phoneResolution[0]
            self.pointOnPhone(x, y)
            x = 0.3 * self.phoneResolution[1]
            y = 0.065 * self.phoneResolution[0]
            self.pointOnPhone(x, y)
            print("点击进行训练")

def pointexittrain(self):
            # 保留两位小数
            x = 0.936 * self.phoneResolution[1]       #1797/1920
            y = 0.0556 * self.phoneResolution[0]     #60/1080
            self.pointOnPhone(x, y)
            print("点击进行训练")

对上面程序的测试

from Train_Troops import traintroops
from Train_Troops import pointtrain

class a:
    pointtrain = pointtrain()
    def b(self):
        print("zjdkgnhoidgnoaigd")
    def train(self):
        # self.showAdvice()
        # 获取屏幕分辨率
        self.pointtrain.getPhoneResolution()
        print("点击训练")
        self.pointtrain.pointtrainBtn()
        print("点击训练黄毛")
        traintroops.pointtrainhuangmao()
        print("点击训练巨人")
        traintroops.pointtrainjuren()
        print("点击训练炸弹人")
        traintroops.pointtrainzhadanren()
        print("点击训练弓箭手")
        traintroops.pointtraingongjianshou()
        print("点击训练哥布林")
        traintroops.pointtraingebulin()
        print("点击推出训练")
        self.pointtrain.pointexittrain()

find = a()
find.train()


注:详细请参考https://github.com/mzlogin/awesome-adb/blob/master/README.md#usb-%E8%BF%9E%E6%8E%A5

结束

adb 命令与手机控制(提供python测试)相关推荐

  1. adb命令打开手机设置页面

    adb命令打开手机设置页面 设置主页面 adb shell am start com.android.settings/com.android.settings.Settings 安全 adb she ...

  2. [获取手机信息]-通过 ADB 命令获取手机信息

    ################################################## 目录 通过 ADB 命令获取手机信息 ADB 常用查看命令 使用 -l 查看设备详细信息 查看机型 ...

  3. adb 命令让手机不进入休眠

    adb 命令让手机不进入休眠 svc power stayon true

  4. 使用adb命令从手机传文件到电脑

    使用adb命令从手机传文件到电脑,比如视频.apk.文档.压缩包等.举个例子:把视频文件test.flv发送到mac本/Users/lz目录下,并修改为good.flv ,具体命令如下: adb pu ...

  5. 使用adb命令对手机屏幕截图

    使用adb命令对手机屏幕截图 使用 screencap 命令,截图保存在 sdcard/01.png adb shell screencap -p /sdcard/01.png 导出 sdcard/0 ...

  6. adb查看手机cpu使用率_使用adb命令查看手机cpu/内存等信息

    使用adb命令查看手机cpu/内存等信息 前提 本地电脑Windows已安装ADB工具.夜神模拟器 连接手机 这里用的夜神模拟器连接的 使用adb命令连接手机:adb connect 127.0.0. ...

  7. 使用ADB命令连接手机、发送广播

    今天说一下ADB命令中的一些Android开发中常用的命令,如果不懂什么是ADB或者使用ADB命令后出现提示"不是内部命令"等问题的请百度一下.安装好环境后我们就开始吧! 首先我们 ...

  8. adb命令删除手机密码设置

    Sino16918 首先介绍一下什么叫ADB命令: ADB的全称为Android Debug Bridge,就是起到调试桥的作用.ADB是android sdk(Android专属的软件开发工具包)里 ...

  9. 删除苹果自带软件后果_使用adb命令删除手机软件(包括系统自带)

    好多人不知道怎么使用ADB命令来删除手机软件(包括系统自带软件),所以今天写篇文章教大家.如本文有出错或你有更好的方法,也可以评论区留言 提前准备: 1.准备好手机.电脑.数据线 2.下载安装相关软件 ...

最新文章

  1. 独家 | 手把手教你从有限的数据样本中发掘价值(附代码)
  2. windows 常用工具
  3. Windows如何查看端口占用
  4. 【BZOJ1797】[AHOI2009]最小割(网络流)
  5. 第二天matplotlib绘图
  6. log4j不生成日志文件的问题
  7. 案例研究 路由器到路由器EOMPLS---基于端口
  8. 恒生电子:收购Summit中国区业务
  9. Linux部署Web项目小记
  10. Palabos源码:computeEquilibrium(iPop, rhoBar, j, jSqr)的过程
  11. web文件上传思路(一句话muma)
  12. [bzoj4453]cys就是要拿英魂!
  13. VIVO应用市场APP上架总结
  14. 读科研经费陷“无底黑洞”有感
  15. Types of Data
  16. 【机器人基础】机器人阻抗控制概念
  17. 机器人门禁控制盒怎么接线方法_门禁系统接线方法
  18. Android开发者选项——GPU呈现模式分析
  19. 小猫爪:S32K3学习笔记04-S32K3之LCU
  20. android 手机内存64实际不到,为什么你的手机内存总是达不到64G?丢失的内存去哪了?详细解读...

热门文章

  1. [Unfinished] 28_α = β_Direct_Current_Non_Loop_Curren
  2. Java面向对象设计多态特征理解
  3. 关键字和关键字优化(转)
  4. 服务器空间不足的解决方法
  5. Android [USB]MTP的介绍?驱动如何安装?
  6. Java 开发在线客服系统源码,企业网站官网客服系统源码,网页版聊天咨询客服源码
  7. GridView 72般绝技 转自清清月儿
  8. a king读后感 love of the_英语阅读读后感
  9. Hadoop权威指南(第3版) 修订版(带目录书签) 中文PDF--高清晰
  10. 微软认证最新技术技巧