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 mathdef 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) <= 1imgDir = '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.sizetokenX, tokenY = 0, 0
tokenXs = []boardX, boardY = 0, 0
boardWidth = 0
widthCnt = 0DIFF_THERESHOLD = 10# 寻找小人
for i in range(h):if i < h/3:continuetokenL, tokenR = 0, 0# 左边界for j in range(w):p = img.getpixel((j, i))if isToken(p):
#             showPixel(j, i)tokenL = jtokenY = ibreak# 右边界if tokenL:for k in range(w):j = w - k - 1if j < tokenL:breakp = img.getpixel((j, i))if isToken(p):
#                 showPixel(j, i)tokenR = jbreak# 中心点if tokenR:tokenXs.append((tokenL + tokenR)/2)# 微调, 定位 token 的底座中心点
tokenX = sum(tokenXs)/len(tokenXs) + 5 
tokenY = tokenY - 15showPixel(int(tokenX), tokenY)# 寻找跳板
lastL, lastR = 0, 0for i in range(h):if i < h/3:continueboardL, boardR = 0, 0base = img.getpixel((0, i))# 左边界for j in range(w): # 跳过小人周围像素if abs(j - tokenX) < 45:continuep = img.getpixel((j, i)) diff = colorDiff(p, base)if diff > DIFF_THERESHOLD:showPixel(j, i)boardL = jbreak#右边界if boardL:for k in range(w):j = w - k - 1# 跳过小人周围像素if abs(j - tokenX) < 45:continueif j < boardL:breakp = img.getpixel((j, i)) diff = colorDiff(p, base)if diff > DIFF_THERESHOLD:showPixel(j, i)boardR = jbreakif boardR:if not boardX:boardX = (boardR + boardL)/2width = boardR - boardL + 1if width > boardWidth:boardWidth = widthwidthCnt = 0else:boardY = i# 这里连续寻找多次边界,防止圆形跳台的局部宽度稳定widthCnt += 1if widthCnt == 15:break# 减去多次边界寻找产生的溢出量
boardY = boardY - 15showPixel(int(boardX), boardY)

  

 

 

转载于:https://www.cnblogs.com/ruo-li-suo-yi/p/8207311.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/368270.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 函数式编程尾递归优化 day16

函数编程的特征&#xff1a; 1不可变&#xff1a;不用变量保存状态&#xff0c;不修改变量 #非函数式 a 1 def incr_test1():global a#一旦更改全局变量后后面再调用a就容易乱a 1return a incr_test1() print(a) def bar():print(from bar) def foo():print(from foo)return …

java英文试题_Java试题及答案英文版

1&#xff0e;Which two demonstrate an “is a” relationship? (Choose Two)A. public interface Person { }public class Employee extends Person { }B. public interface Shape { }public class Employee extends Sha pe { }C. public interface Color { }public class E…

margin折叠-从子元素margin-top影响父元素引出的问题

正在做一个手机端电商项目&#xff0c;顶部导航栈的布局是一个div包含一个子div&#xff0c;如果给在正常文档流中的子div一个垂直margin-top&#xff0c;神奇的现象出现了&#xff0c;两父子元素的边距没变&#xff0c;但父div跟着一起往下走了&#xff01; html代码&#xff…

js时间转换

window.οnlοadfunction(){setInterval("mytime()",1000); } function mytime(){document.getElementById("time").innerHTML fmtDate(new Date()); } function fmtDate(obj){var date new Date(obj);var y 1900date.getYear();var m "0"(…

Lambdas:来到您附近的Java 8!

什么是Lambda&#xff1f; Lambda表达式是一种匿名函数&#xff0c;可以在方法中内联编写&#xff0c;并且可以在使用表达式的任何地方使用。 有时您可能会发现它们被称为闭包&#xff0c;尽管我在下面解释了对该参考的一些注意事项。 像普通的Java方法一样&#xff0c;它具有参…

CPU-内存-IO-网络调优

一、关于CPU 中央处理器调优 1、 CPU处理方式&#xff1a; 批处理&#xff0c;顺序处理请求。(切换次数少&#xff0c;吞吐量大)分时处理。(如同"独占"&#xff0c;吞吐量小)(时间片&#xff0c;把请求分为一个一个的时间片&#xff0c;一片一片的分给CPU处理)我们现…

spark抽取mysql数据到hive_使用spark将内存中的数据写入到hive表中

使用spark将内存中的数据写入到hive表中hive-site.xmlhive.metastore.uristhrift://master:9083Thrift URI for the remote metastore. Used by metastore client to connect to remote metastore.javax.jdo.option.ConnectionURLjdbc:mysql://master:3306/metastore?createDa…

使用Merge存储引擎实现MySQL分表

使用Merge存储引擎实现MySQL分表 学习了&#xff1a;https://www.cnblogs.com/try-better-tomorrow/p/4987620.html https://www.cnblogs.com/xbq8080/p/6628034.html http://blog.csdn.net/java_bruce/article/details/71077985 https://www.cnblogs.com/johnnyzhang/articles…

Flexible 弹性盒子模型之CSS flex-shrink 属性

实例 让第二个元素收缩到其他元素的三分之一&#xff1a; 效果预览 div:nth-of-type(2){flex-shrink:3;}浏览器支持 表格中的数字表示支持该属性的第一个浏览器的版本号。 紧跟在 -webkit-, -ms- 或 -moz- 后的数字为支持该前缀属性的第一个版本。 属性 flex-shrink29.021.…

使用Base64

为什么要使用Base64&#xff1f;在设计这个编码的时候&#xff0c;我想设计人员最主要考虑了3个问题&#xff1a; 1.是否加密&#xff1f; 2.加密算法复杂程度和效率 3.如何处理传输&#xff1f; 加密是肯定的&#xff0c;但是加密的目的不是让用户发送非常安全的Email。这…

idea 新建的java项目没发run_IntelliJ IDEA创建普通的Java 项目及创建 Java 文件并运行的教程...

最近突然看到这篇几年前随手记录的文章&#xff0c;居然浏览量那么高。看来很多小伙伴也开始从 Eclipse 转到 IDEA&#xff0c;这里为了让大家更好的掌握 IDEA 的使用&#xff0c;我建议大家可以看看下面这个 IDEA 教程。首先&#xff0c;确保 IDEA 软件正确安装完成&#xff0…

如何在Maven中运行Ant目标?

maven-antrun-plugin允许我们在各种maven构建阶段中运行ant目标。 我将专门为具有开发环境的开发人员解释maven-antrun-plugin的非常实际的用法。 通常&#xff0c;使用maven build&#xff0c;您会将项目捆绑到war文件或ear文件中。 您可以使用maven-antrun-plugin直接将此w…

PHP基本知识

php为服务端的脚本语言&#xff0c;它的使用需要打开WAMP的开发环境&#xff0c;php也可以用制作网页的DW制作&#xff0c;文件需保存在wamp文件夹内的www文件夹里面。 嵌入php代码所使用的标签&#xff1a;<?php ?>&#xff1b; 运行php条件&#xff1a; 1.电脑上需…

java semaphore 等待_Java并发编程系列之Semaphore详解

简单介绍我们以饭店为例&#xff0c;假设饭店只有三个座位&#xff0c;一开始三个座位都是空的。这时如果同时来了三个客人&#xff0c;服务员人允许他们进去用餐&#xff0c;然后对外说暂无座位。后来的客人必须在门口等待&#xff0c;直到有客人离开。这时&#xff0c;如果有…

BZOJ1191: [HNOI2006]超级英雄Hero(二分图匹配)

Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 5860 Solved: 2617[Submit][Status][Discuss]Description 现在电视台有一种节目叫做超级英雄,大概的流程就是每位选手到台上回答主持人的几个问题,然后根据回答问题的多少获得不同数目的奖品或奖金。主持人问题准备了若干道题…

bzoj 2137: submultiple

Time Limit: 10 Sec Memory Limit: 259 MBSubmit: 239 Solved: 113[Submit][Status][Discuss]Description 设函数g(N)表示N的约数个数。现在给出一个数M&#xff0c;求出所有M的约数x的g(x)的K次方和。 Input 第一行输入N&#xff0c;K。N表示M由前N小的素数组成。接下来N行&…

Java垃圾收集蒸馏

串行&#xff0c;并行&#xff0c;并发&#xff0c;CMS&#xff0c;G1&#xff0c;Young Gen&#xff0c;New Gen&#xff0c;Old Gen&#xff0c;Perm Gen&#xff0c;Eden&#xff0c;Tenured&#xff0c;Survivor Spaces&#xff0c;Safepoints和数百个JVM启动标志。 在尝试…

设计模式(二)模板方法模式

1.模版方法模式简介 模版方法模式介绍 在软件开发中&#xff0c;有时会遇到类似的情况&#xff0c;某个方法的实现需要多个步骤&#xff0c;其中有些步骤是固定的&#xff0c;而有些步骤并不固定&#xff0c;存在可变性。为了提高代码的复用性和系统的灵活性&#xff0c;可以…

命令行程序

1 package com.jdk7.chapter1;2 3 /**4 * 命令行程序5 * author celineluo6 *7 */8 public class CommandArgs {9 /** 10 * 调用系统错误方法打印错误信息 11 * 调用exit()关闭java虚拟机&#xff0c;0表示正常退出应用程序&#xff0c;其他值表示异常退出应…

题解 P2598 【[ZJOI2009]狼和羊的故事】

P2598 [ZJOI2009]狼和羊的故事 题目描述 “狼爱上羊啊爱的疯狂&#xff0c;谁让他们真爱了一场&#xff1b;狼爱上羊啊并不荒唐&#xff0c;他们说有爱就有方向&#xff0e;&#xff0e;&#xff0e;&#xff0e;&#xff0e;&#xff0e;” Orez听到这首歌&#xff0c;心想&am…