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)