ADB 调试

1、adb简介

adb的全称为Android Debug Bridge,就是起到调试桥的作用。通过adb我们可以在Eclipse中方面通过DDMS来调试Android程序,说白了就是debug工具。adb的工作方式比较特殊,采用监听Socket TCP 5554等端口的方式让IDE和Qemu通讯,默认情况下adb会daemon相关的网络端口,所以当我们运行Eclipse时adb进程就会自动运行。

借助adb工具,我们可以管理设备或手机模拟器的状态。还可以进行很多手机操作,如安装软件、系统升级、运行shell命令等等。其实简而言说,adb就是连接Android手机与PC端的桥梁,可以让用户在电脑上对手机进行全面的操作。
(1)快速更新设备或手机模拟器中的代码,如应用或Android系统升级;
(2)在设备上运行Shell命令;
(3)管理设备或手机模拟器上的预定端口;
(4)在设备或手机模拟器上复制或粘贴文件。

2、

步骤1:安装USB驱动

这个相关步骤其实笔者已经在Android前系列教程中介绍,故今天简要叙述一下过程。进入设置-应用程序-开发-USB调试,将第一个选项打钩选中。然后通过USB线连接电脑,提示安装驱动。如果是32位的系统选择x86文件夹安装驱动,如果是64位系统选择amd64文件夹。

步骤2:软件准备

https://pan.baidu.com/s/1mgGkNZM

压缩文件解压到如图

3、adb 版本和检测是否连接

4、

上一段是将手机屏幕截图保存在手机里

下一段是将手机里的截图,保存在电脑里

5、模拟按键事件

//这条命令相当于按了设备的Backkey键
adb shell input keyevent 4   


 //可以解锁屏幕

adb shell input keyevent  82 

 

//在屏幕上做划屏操作,前四个数为坐标点,后面是滑动的时间(单位毫秒)

adb shell input swipe 50 250 250 250 500 

 手机分辨率一般为1080*1920,其中左上角为(0,0),右下角为(1080*1920)

 

//在屏幕上点击坐标点x=50  y=250的位置。

adb shell input tap 50 250 

 

//输入字符abc

adb shell input text abc

 

每个数字与keycode对应表如下:
0 -->  "KEYCODE_UNKNOWN"
1 -->  "KEYCODE_MENU"
2 -->  "KEYCODE_SOFT_RIGHT"
3 -->  "KEYCODE_HOME"
4 -->  "KEYCODE_BACK"
5 -->  "KEYCODE_CALL"
6 -->  "KEYCODE_ENDCALL"
7 -->  "KEYCODE_0"
8 -->  "KEYCODE_1"
9 -->  "KEYCODE_2"
10 -->  "KEYCODE_3"
11 -->  "KEYCODE_4"
12 -->  "KEYCODE_5"
13 -->  "KEYCODE_6"
14 -->  "KEYCODE_7"
15 -->  "KEYCODE_8"
16 -->  "KEYCODE_9"
17 -->  "KEYCODE_STAR"
18 -->  "KEYCODE_POUND"
19 -->  "KEYCODE_DPAD_UP"
20 -->  "KEYCODE_DPAD_DOWN"
21 -->  "KEYCODE_DPAD_LEFT"
22 -->  "KEYCODE_DPAD_RIGHT"
23 -->  "KEYCODE_DPAD_CENTER"
24 -->  "KEYCODE_VOLUME_UP"
25 -->  "KEYCODE_VOLUME_DOWN"
26 -->  "KEYCODE_POWER"
27 -->  "KEYCODE_CAMERA"
28 -->  "KEYCODE_CLEAR"
29 -->  "KEYCODE_A"
30 -->  "KEYCODE_B"
31 -->  "KEYCODE_C"
32 -->  "KEYCODE_D"
33 -->  "KEYCODE_E"
34 -->  "KEYCODE_F"
35 -->  "KEYCODE_G"
36 -->  "KEYCODE_H"
37 -->  "KEYCODE_I"
38 -->  "KEYCODE_J"
39 -->  "KEYCODE_K"
40 -->  "KEYCODE_L"
41 -->  "KEYCODE_M"
42 -->  "KEYCODE_N"
43 -->  "KEYCODE_O"
44 -->  "KEYCODE_P"
45 -->  "KEYCODE_Q"
46 -->  "KEYCODE_R"
47 -->  "KEYCODE_S"
48 -->  "KEYCODE_T"
49 -->  "KEYCODE_U"
50 -->  "KEYCODE_V"
51 -->  "KEYCODE_W"
52 -->  "KEYCODE_X"
53 -->  "KEYCODE_Y"
54 -->  "KEYCODE_Z"
55 -->  "KEYCODE_COMMA"
56 -->  "KEYCODE_PERIOD"
57 -->  "KEYCODE_ALT_LEFT"
58 -->  "KEYCODE_ALT_RIGHT"
59 -->  "KEYCODE_SHIFT_LEFT"
60 -->  "KEYCODE_SHIFT_RIGHT"
61 -->  "KEYCODE_TAB"
62 -->  "KEYCODE_SPACE"
63 -->  "KEYCODE_SYM"
64 -->  "KEYCODE_EXPLORER"
65 -->  "KEYCODE_ENVELOPE"
66 -->  "KEYCODE_ENTER"
67 -->  "KEYCODE_DEL"
68 -->  "KEYCODE_GRAVE"
69 -->  "KEYCODE_MINUS"
70 -->  "KEYCODE_EQUALS"
71 -->  "KEYCODE_LEFT_BRACKET"
72 -->  "KEYCODE_RIGHT_BRACKET"
73 -->  "KEYCODE_BACKSLASH"
74 -->  "KEYCODE_SEMICOLON"
75 -->  "KEYCODE_APOSTROPHE"
76 -->  "KEYCODE_SLASH"
77 -->  "KEYCODE_AT"
78 -->  "KEYCODE_NUM"
79 -->  "KEYCODE_HEADSETHOOK"
80 -->  "KEYCODE_FOCUS"
81 -->  "KEYCODE_PLUS"
82 -->  "KEYCODE_MENU"
83 -->  "KEYCODE_NOTIFICATION"
84 -->  "KEYCODE_SEARCH"
85 -->  "TAG_LAST_KEYCODE"

6、adb shell 获得点击屏幕的位置坐标

(1)计算比例

获得event 体系里 宽(0035)和高(0036)

手机屏幕的分辨率是已知的,还以当前我使用的手机为例

手机屏幕分别率是1080p即:1080(宽) * 1920(高)

计算比例:

rateW = 1080(手机屏幕的宽) / 1080(event里0035的max) = 1

rateH = 1920(手机屏幕的高) / 1920(event里0036的max) =1

(2)第二步:点击屏幕计算点击位置的坐标

import random
import os
from PIL import Image
import math

def colorDiff(p1, p2):
    return math.sqrt((p1[0] - p2[0])**2 + (p1[1] - p2[1])**2 + (p1[2] - p2[2])**2)

def showPixel(x, y):
    for i in range(5):
        for j in range(5):
            img.putpixel((x - i, y - j), (0, 0, 0))

# 小人的底部颜色标识点
# 标识点选法:打开PS,->选择 ->色彩范围,容差设为0,使用吸管工具找底部连续同色区域
# 使用此法可以找到相对不动点,加固定偏移量可获得底部中心坐标
tokenC = (54, 60, 102)
def isToken(p):
    return colorDiff(p, tokenC) <= 1

imgDir = 'C:/Users/ning wang/Desktop/Python/wechat/123.jpg'
imgPath = random.choice(list(os.path.join(imgDir, name) for name in os.listdir(imgDir)))

img = Image.open(imgPath)


w, h = img.size


tokenX, tokenY = 0, 0
tokenXs = []

boardX, boardY = 0, 0
boardWidth = 0
widthCnt = 0

DIFF_THERESHOLD = 10

# 寻找小人
for i in range(h):
    if i < h/3:
        continue
    tokenL, tokenR = 0, 0
    # 左边界
    for j in range(w):
        p = img.getpixel((j, i))
        if isToken(p):
#             showPixel(j, i)
            tokenL = j
            tokenY = i
            break
    # 右边界
    if tokenL:
        for k in range(w):
            j = w - k - 1
            if j < tokenL:
                break
            p = img.getpixel((j, i))
            if isToken(p):
#                 showPixel(j, i)
                tokenR = j
                break
    # 中心点
    if tokenR:
        tokenXs.append((tokenL + tokenR)/2)
        
# 微调, 定位 token 的底座中心点
tokenX = sum(tokenXs)/len(tokenXs) + 5 
tokenY = tokenY - 15

showPixel(int(tokenX), tokenY)

# 寻找跳板
lastL, lastR = 0, 0

for i in range(h):
    if i < h/3:
        continue
    boardL, boardR = 0, 0
    base = img.getpixel((0, i))
    # 左边界
    for j in range(w): 
        # 跳过小人周围像素
        if abs(j - tokenX) < 45:
            continue
        p = img.getpixel((j, i)) 
        diff = colorDiff(p, base)
        if diff > DIFF_THERESHOLD:
            showPixel(j, i)
            boardL = j
            break
    #右边界
    if boardL:
        for k in range(w):
            j = w - k - 1
            # 跳过小人周围像素
            if abs(j - tokenX) < 45:
                continue
            if j < boardL:
                break
            p = img.getpixel((j, i)) 
            diff = colorDiff(p, base)
            if diff > DIFF_THERESHOLD:
                showPixel(j, i)
                boardR = j
                break
    if boardR:
        if not boardX:
            boardX = (boardR + boardL)/2
        width = boardR - boardL + 1
        if width > boardWidth:
            boardWidth = width
            widthCnt = 0
        else:
            boardY = i
            # 这里连续寻找多次边界,防止圆形跳台的局部宽度稳定
            widthCnt += 1
            if widthCnt == 15:
                break
                
# 减去多次边界寻找产生的溢出量
boardY = boardY - 15

showPixel(int(boardX), boardY)

  

 

 

posted on 2018-01-05 23:52  箬笠蓑衣  阅读(2202)  评论(0编辑  收藏  举报