adb 调试工具

一、adb的概念

adb工具即Android Debug Bridge(安卓调试桥) tools。它就是一个命令行窗口,用于通过电脑端与模拟器或者真实设备交互。

adb是androidsdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的andriod设备

它的主要功能有:

1、运行Android设备/模拟器的shell(命令行)。

2、管理 Android模拟器与计算机设备的端口映射。

3、计算机和 Android设备/Android模拟器 之间上传以及下载文件。

4、将计算机本地的 apk文件 安装至模拟器或Android设备

二、adb的构成和工作原理

adb 包含三个部分:

1. Daemon 守护进程:运行在调试设备中,手机或模拟器器,用来接收并执行 adb 命令;

2. Client端:运行在开发机器中,即你的开发电脑,用来发送 adb 命令;

3. Server端:同样运行在开发机器中,用来管理 Client 端和手机的 Daemon 之间的通信。

①adb 的运行原理是 PC 端的 adb server 与手机端的守护进程 adbd 建立连接;

安卓系统底层运行着一个adbd服务,用于响应和管理我们在电脑端的adb命令操作。adbd服务在启动时会根据当前设备/模拟器的配置监听USB连接或无线网络连接

配置的属性为:service.adb.tcp.port,也就是监听的网络端口:

  • 以上属性的值 > 0:adbd将监听网络对应的端口(一般为5555)
  • 以上属性的值 <=-1:adbd将监听USB 
②然后 PC 端的 adb client 通过 adb server 转发命令;
③adbd 接收命令后解析之后在安卓手机/模拟器上运行;

总结下就是adb工具可以在电脑通过终端命令操作安卓手机/模拟器。

三、adb下载安装

下载地址:https://adbshell.com/downloads

下载完成之后,进行解压,完成后配置环境adb变量,环境变量配置的地址为adb.exe所在目录。

完成后可在cmd界面检查是否成功,指令adb version,出现如下信息,说明安装完成。

四、adb命令基本使用

1、开启/关闭adb服务

(通过在adb遇到问题时,一起使用,先关闭再重新开启)

开启adb服务:(adb默认启动的端口号为5037)

adb start-server

指定端口启动adb服务:

adb -p <port> start-server

关闭adb服务:

adb kill-server

2、查看设备【获取连接设备】

adb devices
  • offline 表示设备没有连接成功或无响应
  • device 表示连接成功
  • no device 表示没有获取到连接设备

如果存在有多个设备/模拟器连接在电脑情况需要指定设备执行adb命令:

  • -d 指定通过USB连接的唯一设备为指定对象
  • -s<serialNumber> 指定相应手机设备序列号的设备为指令对象
  • -e 指定唯一的模拟器设备为指令对象

3、获取包名和界面名【应用】

  • 包名和界面名的概念:
  1.  包名(package):决定程序的唯一性(不是应用的名字)
  2.  界面名(activity):目前可以理解,一个界面名,对应着一个界面。【界面名可能会在和同事沟通交流或网站的文章中翻译为启动名】
  • 获取包名和界面名:
  1. 应用场景:自动化测试需要通过代码的形式告诉手机测试哪个应用程序的哪一个界面,所以需要通过这个命令进行获取。
  2. 使用步骤:1. 打开需要测试的应用程序;2. 输入 adb 命令
  • 命令格式:
  1. Mac/Linux:
    adb shell dumpsys window windows | grep mFocusedApp
  2. Windows:
    adb shell dumpsys window windows | findstr mFocusedApp 
  •  例如:获取设置程序的包名和界面名
  1. 先在模拟器器或手机中打开《设置》应用程序
  2. 输入对应平台即不同操作系统获取包名和界面名的命令
  3. 结果如下:
    mFocusedApp=AppWindowToken{53309da token=Token{2e2fa785
    ActivityRecord{2928d4fc u0 com.android.settings/.Settings t1127}}}
  4. 包名为: com.android.settings 
  5. 界面名为: .Settings 

4、发送文件到手机

  • 应用场景:将手机需要的数据(数据库文件)在电脑上调整好,直接发送给手机
  • 命令格式:
    adb push 电脑的文件路径 手机的文件夹路径
  • 实例:将桌面的 a.txt 发送到手机的 sd 卡
    adb push C:\Users\hm\Desktop\a.txt /sdcard

5、从手机中拉取文件

  • 应用场景:将手机产生的文件(数据库文件,日志文件)拉取到电脑中
  • 命令格式:
    adb pull 手机的文件路径 电脑的文件夹路径
  • 实例:将手机的 sd 卡的 a.txt 拉取到桌面
    adb pull /sdcard/a.txt C:\Users\hm\Desktop 
  • 运行截图:

6、获取Android 应用启动时间

  • 应用场景:①如果企业对Android应用程序的启动速度有要求,则需要使用该命令进行测试;②测试标准:参照同类软件,启动时间不能超出一倍即可
  • 命令格式:
    adb shell am start -W 包名/启动名
  • 实例:启动 com.android.settings 程序并且进入主界面 ( .Settings )
    adb shell am start -W com.android.settings/.Settings
  • 解释:
    1. ThisTime :该界面 ( activity ) 启动耗时(毫秒)
    2. TotalTime :应用自身启动耗时 = ThisTime + 应用 application 等资源启动时间(毫秒)
    3. WaitTime :系统启动应用耗时 = TotalTime + 系统资源启动时间(毫秒)

7、获取手机日志【应用】

  • 应用场景:将bug的日志信息发送给开发人员,便于开发人员定位bug
  • 使用步骤:
  1. 打开需要测试的应用程序
  2. 找到触发bug的位置
  3. 使用查看日志命令
  4. 触发bug
  5. 获取日志信息
  • 命令格式:
    adb logcat

    # Linux操作系统查找指定app的运行日志
    adb logcat | grep(unix) 包名

    # Windows操作系统查找指定app的运行日志
    adb logcat | findstr(win) 包名
  • 示例:登录功能存在bug

    1. 安装bug.apk
    2. 打开《有bug的程序》应用程序
    3. 命令行中输入 adb logcat 命令并回车
    4. 点击登录按钮
    5. 获取日志信息

  • 结果如下:
    E/AndroidRuntime( 6593): FATAL EXCEPTION: main
    E/AndroidRuntime( 6593): Process: cn.itcast.myapplication, PID: 6593
    E/AndroidRuntime( 6593): java.lang.ArrayIndexOutOfBoundsException:
    length=5; index=8
    E/AndroidRuntime( 6593): at
    cn.itcast.myapplication.LoginActivity.attemptLogin(LoginActivity.java:149)
    E/AndroidRuntime( 6593): at
    cn.itcast.myapplication.LoginActivity.access$000(LoginActivity.java:40)
    E/AndroidRuntime( 6593): at
    cn.itcast.myapplication.LoginActivity$2.onClick(LoginActivity.java:89)
    E/AndroidRuntime( 6593): at
    android.view.View.performClick(View.java:4780)
    E/AndroidRuntime( 6593): at
    android.view.View$PerformClick.run(View.java:19866)
    E/AndroidRuntime( 6593): at
    android.os.Handler.handleCallback(Handler.java:739)
    E/AndroidRuntime( 6593): at
    android.os.Handler.dispatchMessage(Handler.java:95)
    E/AndroidRuntime( 6593): at android.os.Looper.loop(Looper.java:135)
    E/AndroidRuntime( 6593): at
    android.app.ActivityThread.main(ActivityThread.java:5254)
    E/AndroidRuntime( 6593): at java.lang.reflect.Method.invoke(Native
    Method)
    E/AndroidRuntime( 6593): at
    java.lang.reflect.Method.invoke(Method.java:372)
    E/AndroidRuntime( 6593): at
    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java
    :903)
    E/AndroidRuntime( 6593): at
    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)

8、其他命令

 9、查看屏幕的信息

①查看连接设备屏幕的分辨率:

adb shell wm size 

②查看屏幕密度,即屏幕密度是多少dpi:

adb shell wm density

 10、adb查看应用列表

命令格式:

adb shell pm list packages [参数]

具体参数的信息以及说明:

 例如:

①显示所有应用信息 adb shell pm list packages

②显示系统应用    adb shell pm list packages -s

③显示三方应用    adb shell pm list packages -3

11、安装apk

命令格式:

# 普通安装
adb install [参数]

# 覆盖安装【将最新版本app安装在安卓设备上并覆盖之前的旧版本】
adb install -r [参数]

例如想把电脑上的apk文件直接安装到安卓设备上: 

adb install /Users/xxxxxx/Desktop/xxxx.apk(这个路径是apk在电脑上的路径)

 12、卸载应用

以360为例子

 卸载命令,不保留目录和缓存数据:

adb uninstall 应用包名(com.qihoo360.mobilesafe)

不卸载app,清除应用的数据和缓存: 

adb shell pm clear 应用包名(com.qihoo360.mobilesafe)

 卸载APP,但是保留目录和缓存数据:【-k 卸载APP,但是保留目录和缓存数据】

adb uninstall [-k] <packagename>

查看应用的安装路径:

adb shell pm path <packagename>

13、截取安卓设备屏幕

命令格式:

adb shell screencap -p /sdcard/sc.png
  • -p 指定文件保存为png格式
  • -d display-id 指定截屏的显示屏编号(多屏情况下)

14、录制安卓设备屏幕

命令格式:

adb shell screenrecord /sdcard/filename.mp4
  • -size WIDTHxHEIGHT 视频的尺寸,默认为屏幕的分辨率
  • -bite-rate RATE 视屏的比特率,默认是4Mbps
  • -time-limit TIME 录制时长,单位秒
  • -verbose 输出更多信息

15、当前app的CPU情况

第一种方法:

命令格式:

adb shell dumpsys cpuinfo | grep  <package_name>

第二种方法:

①进入adb环境(linux环境):

在命令行输入:

adb shell

② 在adb shell里输入:

dumpsys meminfo <package_name>

 # <package_name> 为软件包名,如:com.storm.yeelion。

显示结果如下:

参数含义:
dalvik : dalvik使用的内存
native : native堆上的内存,指C\C++堆的内存(android 3.0以后bitmap就是放在这儿)
other  : 除了dalvik和native的内存,包含C\C++非堆内存······
Pss    : 该内存指将共享内存按比例分配到使用了共享内存的进程
allocated : 已使用的内存
free      : 空闲的内存
private dirty : 非共享,又不能被换页出去的内存(比如linux系统中为了提高分配内存速度而缓冲的小对象,即使你的进程已经退出,该内存也不会被释放)
share dirty   : 共享,但有不能被换页出去的内存

16、查看Android手机CPU和内存占用情况

①进入adb环境(linux环境):

在命令行输入:

adb shell

②在adb环境输入:

top -m 10 -s cpu
  •  -m 10表示显示数量为10 
  • -s表示按指定行排序

 显示结果如下图:

参数含义:
PID  : progress identification,应用程序ID
S    : 进程的状态,其中S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值是负数
THR  : 程序当前所用的线程数
VSS  : Virtual Set Size虚拟耗用内存(包含共享库占用的内存)
RSS  : Resident Set Size实际使用物理内存(包含共享库占用的内存)
PCY  : 前台(fg)和后台(bg)进程
UID  : User Identification,用户身份ID
Name : 应用程序名称

③ 退出adb:ctrl + c

17、录制视频

可以使用 screenrecord[options] filename 命令来录制屏幕视频:

例如:

adb shell screenrecord /sdcard/demo.mp4

18、 启动服务

adb shell am startservice "com.zhy.aaa/com.zhy.aaa.MyService"

19、发送广播

adb shell am broadcast -a "broadcastactionfilter"

如果需要携带参数(携带一个Intent,key为name):

adb shell am broadcast -a "broadcastactionfilter" -e name zhy

五、adb命令思维导图

 

posted @ 2021-06-18 17:43  习久性成  阅读(2244)  评论(0编辑  收藏  举报