2-appium之adb介绍

提醒:为保障学习效果,开始本节课前,请:
(1)搭建好测试环境;
(2)开启mumu模拟器;

1、adb的概念

adb(Android Debug Bridge)是一个针对Android的调试桥,是一个命令行工具,允许你与模拟器或者真机进行通信。方便开发者(测试人员)与设备进行交互。

2、adb的工作原理

启动一个adb客户端时,此客户端首先检查是否有已允许的adb服务器进程。如果没有,它会自动启动一个服务器进程。当服务器启动时,它默认与本地TCP端口5037绑定,并且侦听从adb客户端(Dos窗口或者脚本)发送的命令。所有adb客户端均使用端口5037与adb服务器进行通信。

打开Dos窗口,第一次输入如下命令:

adb devices

观察控制台输出,如下:

C:\Users\duzil>adb devices
* daemon not running; starting now at tcp:5037
* daemon started successfully
List of devices attached

翻译:
第一行,守护进程没有运行,将在5037端口启动
第二行,守护进程启动成功
第三行,附件设备清单
第四行,如果有设备的话,会列出设备信息。(我们明明已经开启了mumu模拟器,为什么找不到呢?后面解释)

这几行信息也印证了上面的介绍——“当启动客户端时,此客户端首先检查是否有已允许的adb服务器进程。如果没有,它会自动启动一个服务器进程。当服务器启动时,它默认与本地TCP端口5037绑定”

好,我们再次输入“adb devices”命令,看下打印结果:

C:\Users\duzil>adb devices
List of devices attached


C:\Users\duzil>

你可以看到,因为adb已经启动并绑定5037端口,因此这里没有再次启动,也就没有再次打印这些信息:

* daemon not running; starting now at tcp:5037
* daemon started successfully

3、adb常用命令

接下来,咱们开始学习adb的常用命令:
adb是一个非常强大的命令,你可以直接在Dos中执行一个adb命令,它会显示adb所有的命令。
这里我粘贴一部分命令,供大家了解:

C:\Users\duzil>adb
Android Debug Bridge version 1.0.41
Version 30.0.4-6686687
Installed as C:\Users\duzil\AppData\Local\Android\Sdk\platform-tools\adb.exe

global options:
 -a         listen on all network interfaces, not just localhost
 -d         use USB device (error if multiple devices connected)
 -e         use TCP/IP device (error if multiple TCP/IP devices available)
 -s SERIAL  use device with given serial (overrides $ANDROID_SERIAL)
 -t ID      use device with given transport id
 -H         name of adb server host [default=localhost]
 -P         port of adb server [default=5037]
 -L SOCKET  listen on given socket for adb server [default=tcp:localhost:5037]

general commands:
 devices [-l]             list connected devices (-l for long output)
 help                     show this help message
 version                  show version num

networking:
 connect HOST[:PORT]      connect to a device via TCP/IP [default port=5555]
 disconnect [HOST[:PORT]]
     disconnect from given TCP/IP device [default port=5555], or all
 pair HOST[:PORT] [PAIRING CODE]
     pair with a device for secure TCP/IP communication
 forward --list           list all forward socket connections
 forward [--no-rebind] LOCAL REMOTE
     forward socket connection using:

好,来开始常用命令的学习

(1)adb connect IP:端口

前面我们讲过,adb启动默认监听5037端口。在第一节课,我们说过mumu模拟器默认启动端口为7555。所以,adb devices是无法找到模拟器的。因此我们先来学第一个命令:adb connect IP:端口,这个命令的作用是将设定adb监听的IP地址及对应的端口。
命令如下:

C:\Users\duzil>adb connect 127.0.0.1:7555
connected to 127.0.0.1:7555

C:\Users\duzil>

可以看到端口监听成功

(2)adb devices

adb devices,用来打印监听端口的设备信息。
命令如下:

C:\Users\duzil>adb devices
List of devices attached
127.0.0.1:7555  device


C:\Users\duzil>

可以看到已经能监测到mumu模拟器了。简单解释一下:
127.0.0.1:7555——是IP地址和端口号
device——是设备名称,如果你使用真机的话,会显示具体设备名。

(3)adb shell

Android是基于Linux内核开发的。Linux系统的字符交互界面是shell。所以Android也可以使用shell命令。
我们通过adb shell就可以进入Android的设备底层系统。命令

C:\Users\duzil>adb shell
root@x86_64:/ # pwd
/
root@x86_64:/

可以看到,我们输入adb shell后,进入了Linux窗口命令行,#代表root权限。然后我们执行了一条Linux命令pwd,用来打印当前所在目录,回显是个“/”,代表根目录。

如果你的PC同时连接了多台设备,你想进入特定设备的shell,请使用下面的命令:

adb -s 127.0.0.1:7555 shell

使用-s参数,加上IP+端口,就可以进入指定设备。

如果想退出shell,可以使用exit命令,如下所示:

root@x86_64:/ # exit

C:\Users\duzil>a

(4)adb install xxx.apk

我们可以使用adb install安装Android应用(apk文件)

APK(全称:Android application package,Android应用程序包)是Android操作系统使用的一种应用程序包文件格式,用于分发和安装移动应用及中间件。一个Android应用程序的代码想要在Android设备上运行,必须先进行编译,然后被打包成为一个被Android系统所能识别的文件才可以被运行,而这种能被Android系统识别并运行的文件格式便是“APK”。 一个APK文件内包含被编译的代码文件(.dex 文件),文件资源(resources), 原生资源文件(assets),证书(certificates),和清单文件(manifest file)

这里我准备了一个应用宝的apk,放到了C盘AAA目录下面,接下来,使用命令安装一下:

c:\AAA>adb install yingyongbao.apk
Performing Push Install
yingyongbao.apk: 1 file pushed, 0 ski... 0.4 MB/s (11333794 bytes in 30.532s)
        pkg: /data/local/tmp/yingyongbao.apk
Success

c:\AAA>

安装成功后,就可以在mumu模拟器看到该应用。

注意:如果想覆盖安装的话,需要增加-r参数,请参考:

c:\AAA>adb install -r yingyongbao.apk
Performing Push Install
yingyongbao.apk: 1 file pushed, 0 ski... 0.5 MB/s (11333794 bytes in 23.512s)
        pkg: /data/local/tmp/yingyongbao.apk
Success

c:\AAA>

否则就会报错,提示应用已安装,如下:

c:\AAA>adb install c:\AAA\yingyongbao.apk
Performing Push Install
c:\AAA\yingyongbao.apk: 1 file pushed... 0.9 MB/s (11333794 bytes in 11.701s)
        pkg: /data/local/tmp/yingyongbao.apk
Failure [INSTALL_FAILED_ALREADY_EXISTS]

c:\AAA>

(5)adb uninstall

学习完安装应用,再来看下卸载应用。安装应用的时候直接使用apk的名称就可以了。但是卸载有所不同,需要使用“包名”。
那如何查看包名呢?
方法一:

c:\AAA>adb shell
root@x86_64:/ # cd /data/app
app-asec/    app-lib/     app-private/ app/
root@x86_64:/ # cd /data/app/
root@x86_64:/data/app # ls
com.ddnapalon.calculator.gp-1
com.mumu.acc-1
com.mumu.launcher-1
com.mumu.store-1
com.tencent.android.qqdownloader-2
io.appium.settings-1
io.appium.uiautomator2.server-1
io.appium.uiautomator2.server.test-1
root@x86_64:/data/app # cd /data/local/tmp/
root@x86_64:/data/local/tmp # ls
appium_cache
root@x86_64:
  • 先使用adb shell命令进入shell
  • 在通过cd命令切换到“/data/app/”目录下;固定目录
  • 然后通过“ls”命令查看当前目录有哪些报名;
    从文件名可以看到“com.tencent.android.qqdownloader-2”就是包名。

接下来,我们使用exit命令退出shell。然后再使用adb uninstall卸载包
这里需要提醒的是,卸载的时候需要去掉每个报名末尾的“-2”,这些-数字是Android给加的标识符,具体意义不用关心。

c:\AAA>adb uninstall com.tencent.android.qqdownloader
Success

c:\AAA>

再去看看mumu模拟器,是不是已经卸载成功了。

(6)adb push

将本地文件推送到设备(模拟器)。
adb push 本地文件地址 远端目录
示例:

C:\Users\duzil>adb push c:\AAA\yingyongbao.apk /sdcard
c:\AAA\yingyongbao.apk: 1 file.../s (11333794 bytes in 22.985s)

C:\Users\duzil>

然后,可以进入到bash,进入到sdcard目录查看

C:\Users\duzil>adb shell
root@x86_64:/ # cd sdcard/
root@x86_64:/sdcard # ls
……此处省略部分内容……
yingyongbao.apk
root@x86_64:/sdcard #

(7)adb pull

将远端(模拟器)文件拉取到本地。
首先,我再sdcard目录,通过touch命令创建一个文本文件“a.txt”。(空文件,下载速度快,方便演示),命令如下:

root@x86_64:/sdcard # touch a.txt
root@x86_64:/sdcard # ls
……此处省略……
a.txt

然后使用pull命令,将该文件拉取到本地

C:\Users\duzil>adb pull /sdcard/a.txt  c:\AAA\
/sdcard/a.txt: 1 file pulled, 0 skipped.

C:\Users\duzil>

(8)adb shell pm list packages

查看设备所有包名,用法示例:

C:\Users\duzil>adb shell pm list packages
package:com.android.providers.telephony
此处有省略……
package:com.tencent.android.qqdownloader
此处有省略……

C:\Users\duzil>adb shell pm list packages

用该方法同样可查看到包名。

另外,我们还可以加“-3”参数,只获取第三方应用。(非系统本身应用),演示如下:

C:\Users\duzil>adb shell pm list packages -3
package:io.appium.settings
package:com.ddnapalon.calculator.gp
package:io.appium.uiautomator2.server
package:com.tencent.android.qqdownloader
package:io.appium.uiautomator2.server.test

C:\Users\duzil>

(9)adb shell dumpsys window|findstr mCurrentFocus

查看包名和activity。包名我们前面讲过,不再多说,什么是activity呢?你可以简单理解为处于当前活跃状态的APP(没有切换到后台)。
演示示例:

C:\Users\duzil>adb shell dumpsys window|findstr mCurrentFocus
  mCurrentFocus=Window{
     9e45e96 u0 com.tencent.android.qqdownloader/com.tencent.assistantv2.activity.MainActivity}

上面结果中

  • “com.tencent.android.qqdownloader”,这部分是包名。
  • “com.tencent.assistantv2.activity.MainActivity”,这部分是activity的值

(10)adb kill-server 或 adb start-server

启动、关闭adb服务

C:\Users\duzil>adb start-server

C:\Users\duzil>adb kill-server

C:\Users\duzil>adb start-server
* daemon not running; starting now at tcp:5037
* daemon started successfully

C:\Users\duzil>

4、知识点补充

查看端口,结束端口的占用进程。
比如7555端口被占用了。再尝试用7555去启动应用必然报错,你可以通过如下命令查看那个程序占用了7555端口。

C:\Users\duzil>netstat -ano|findstr 7555
  TCP    127.0.0.1:5097         127.0.0.1:7555         ESTABLISHED     29716
  TCP    127.0.0.1:7555         0.0.0.0:0              LISTENING       19348
  TCP    127.0.0.1:7555         127.0.0.1:5097         ESTABLISHED     19348

第一行中,第三列,7555端口被占用,本行最后一列,29716位PID,进程id(process ID)

然后使用下面的命令结束进程

C:\Users\duzil>taskkill -f -pid 29716
成功: 已终止 PID 为 29716 的进程。

C:\Users\duzil>

好,本节课先到这里。谢谢观看。

你可能感兴趣的:(移动端自动化——Appium)