adb工具

adb

adb 的相关介绍

Android 调试桥 (adb) 是一种功能多样的命令行工具,可让您与设备进行通信。adb 命令可用于执行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令)的访问权限。它是一种客户端-服务器程序,包括以下三个组件:

  • 客户端:用于发送命令。客户端在开发机器上运行。您可以通过发出 adb 命令从命令行终端调用客户端。
  • 守护程序 (adbd):用于在设备上运行命令。守护程序在每个设备上作为后台进程运行。
  • 服务器:用于管理客户端与守护程序之间的通信。服务器在开发机器上作为后台进程运行。

adb 包含在 Android SDK 平台工具软件包中。您可以使用 SDK 管理器下载此软件包,该管理器会将其安装在 android_sdk/platform-tools/ 下。或者,如果您需要独立的 Android SDK 平台工具软件包,也可以点击此处进行下载

adb基础

启用 adb 调试

usb连接时启动adb调试

如要在通过 USB 连接的设备上使用 adb,您必须在设备的系统设置中启用 USB 调试(位于开发者选项下)。如需在通过 WLAN 连接的设备上使用 adb,请参阅通过 WLAN 连接到设备

在搭载 Android 4.2 及更高版本的设备上,“开发者选项”屏幕默认情况下处于隐藏状态。如需将其显示出来,请依次转到设置 > 关于手机,然后点按版本号七次。返回上一屏幕,在底部可以找到开发者选项

在某些设备上,“开发者选项”屏幕所在的位置或名称可能有所不同。

现在,您已经可以通过 USB 连接设备。您可以通过从 android_sdk/platform-tools/ 目录执行 adb devices 验证设备是否已连接。如果已连接,您将看到设备名称以“设备”形式列出。

Wi-Fi 连接时启动adb调试

一般情况下,adb 通过 USB 与设备进行通信,但您也可以通过 Wi-Fi 使用 adb。如要连接到搭载 Android 10 或更低版本的设备,您必须通过 USB 执行一些初始步骤,如下所述:

  1. 将 Android 设备和 adb 主机连接到这两者都可以访问的同一 Wi-Fi 网络。请注意,并非所有接入点都适用;您可能需要使用防火墙已正确配置为支持 adb 的接入点。

  2. 使用 USB 线将设备连接到主机。

  3. 设置目标设备以监听端口 5555 上的 TCP/IP 连接。

    adb tcpip 5555
     
     
  4. 拔掉连接目标设备的 USB 线。

  5. 找到 Android 设备的 IP 地址。例如,对于 Nexus 设备,您可以在设置 > 关于平板电脑(或关于手机)> 状态 > IP 地址下找到 IP 地址。或者,对于 Wear OS 设备,您可以在设置 > WLAN 设置 > 高级 > IP 地址下找到 IP 地址。

  6. 通过 IP 地址连接到设备。

    adb connect device_ip_address:5555
     
     
  7. 确认主机已连接到目标设备:

    $ adb devices
    List of devices attached
    device_ip_address:5555 device
     
     

现在,您可以开始操作了!

如果 adb 连接断开:

  1. 确保主机仍与 Android 设备连接到同一个 WLAN 网络。

  2. 通过再次执行 adb connect 步骤重新连接。

  3. 如果上述操作未解决问题,重置 adb 主机:

    adb kill-server
     
     

    然后,从头开始操作。

查询设备

在发出 adb 命令之前,了解哪些设备实例已连接到 adb 服务器会很有帮助。您可以使用 devices 命令生成已连接设备的列表。

  adb devices -l
 
 

作为回应,adb 会针对每个设备输出以下状态信息:

  • 序列号:由 adb 创建的字符串,用于通过端口号唯一标识设备。 下面是一个序列号示例:emulator-5554
  • 状态:设备的连接状态可以是以下几项之一:
    • offline:设备未连接到 adb 或没有响应。
    • device:设备现已连接到 adb 服务器。请注意,此状态并不表示 Android 系统已完全启动并可正常运行,因为在设备连接到 adb 时系统仍在启动。不过,在启动后,这将是设备的正常运行状态。
    • no device:未连接任何设备。
  • 说明:如果您包含 -l 选项,devices 命令会告知您设备是什么。当您连接了多个设备时,此信息很有用,可帮助您将它们区分开来。

将命令发送至特定设备

如果有多个设备在运行,您在发出 adb 命令时必须指定目标设备。为此,请使用 devices 命令获取目标设备的序列号。获得序列号后,请结合使用 -s 选项与 adb 命令来指定序列号。如果您要发出很多 adb 命令,可以将 $ANDROID_SERIAL 环境变量设为包含序列号。如果您同时使用 -s 和 $ANDROID_SERIAL-s 会替换 $ANDROID_SERIAL

在以下示例中,先获得了已连接设备的列表,然后使用其中一个设备的序列号在该设备上安装了 helloWorld.apk

$ adb devices
List of devices attached
emulator-5554 device
emulator-5555 device

$ adb -s emulator-5555 install helloWorld.apk
 
 

如果有多个可用设备,但只有一个是模拟器,请使用 -e 选项将命令发送至该模拟器。同样,如果有多个设备,但只连接了一个硬件设备,请使用 -d 选项将命令发送至该硬件设备。

安装应用

您可以使用 adb 的 install 命令在模拟器或连接的设备上安装 APK:

adb install path_to_apk
 
 

安装测试 APK 时,必须在 install 命令中使用 -t 选项。如需了解详情,请参阅 -t

将软件包(通过 path 指定)安装到系统。具体选项:

-r:重新安装现有应用,并保留其数据。

-t:允许安装测试 APK。仅当您运行或调试了应用或者使用了 Android Studio 的 Build > Build APK 命令时,Gradle 才会生成测试 APK。如果是使用开发者预览版 SDK(如果 targetSdkVersion 是字母,而非数字)构建的 APK,那么安装测试 APK 时必须在 install 命令中包含 -t 选项

  • -i installer_package_name:指定安装程序软件包名称。

  • --install-location location:使用以下某个值设置安装位置:

    • ​ 0:使用默认安装位置。
    • ​ 1:在内部设备存储上安装。
    • ​ 2:在外部介质上安装。
  • -f:在内部系统内存上安装软件包。

  • -d:允许版本代码降级。

  • -g:授予应用清单中列出的所有权限。

  • --fastdeploy:通过仅更新已更改的 APK 部分来快速更新安装的软件包。

  • --incremental:仅安装 APK 中启动应用所需的部分,同时在后台流式传输剩余数据。如要使用此功能,您必须为 APK 签名,创建一个 APK 签名方案 v4 文件,并将此文件放在 APK 所在的目录中。只有部分设备支持此功能。此选项会强制 adb 使用该功能,如果该功能不受支持,则会失败(并提供有关失败原因的详细信息)。附加 --wait 选项,可等到 APK 完全安装完毕后再授予对 APK 的访问权限。

  • --no-incremental 可阻止 adb 使用此功能。

将文件复制到设备/从设备复制文件

您可以使用 pull 和 push 命令将文件复制到设备或从设备复制文件。与 install 命令(仅将 APK 文件复制到特定位置)不同,使用 pull 和 push 命令可将任意目录和文件复制到设备中的任何位置。

如需从设备中复制某个文件或目录(及其子目录),请使用以下命令:

adb pull remote local
 
 

如需将某个文件或目录(及其子目录)复制到设备,请使用以下命令:

adb push local remote
 
 

将 local 和 remote 替换为开发机器(本地)和设备(远程)上的目标文件/目录的路径。例如:

adb push foo.txt /sdcard/foo.txt
 
 

停止 adb 服务器

在某些情况下,您可能需要终止 adb 服务器进程,然后重启以解决问题(例如,如果 adb 不响应命令)。

如需停止 adb 服务器,请使用 adb kill-server 命令。然后,您可以通过发出其他任何 adb 命令来重启服务器。

发出 adb 命令

您可以从开发机器上的命令行发出 adb 命令,也可以通过脚本发出。用法如下:

adb [-d | -e | -s serial_number] command
 
 

如果只有一个模拟器在运行或者只连接了一个设备,系统会默认将 adb 命令发送至该设备。如果有多个模拟器正在运行并且/或者连接了多个设备,您需要使用 -d-e 或 -s 选项指定应向其发送命令的目标设备。

您可以使用以下命令来查看所有支持的 adb 命令的详细列表:

adb --help
 
 

发出 shell 命令

您可以使用 shell 命令通过 adb 发出设备命令,也可以启动交互式 shell。如需发出单个命令,请使用 shell 命令,如下所示:

adb [-d |-e | -s serial_number] shell shell_command
 
 

要在设备上启动交互式 shell,请使用 shell 命令,如下所示:

adb [-d | -e | -s serial_number] shell
 
 

要退出交互式 shell,请按 Ctrl + D 键或输入 exit

Android 提供了大多数常见的 Unix 命令行工具。如需查看可用工具的列表,请使用以下命令:

shell ls /system/bin
 
 

对于大多数命令,都可通过 --help 参数获得命令帮助。许多 shell 命令都由 toybox 提供。对于所有 toybox 命令,都可通过 toybox --help 可获得命令的常规帮助。

另请参阅 Logcat 命令行工具,该工具对监控系统日志很有用。

常见的adb操作

安装包在android设备中

adb shell pm install apk在移动端的路径

卸载包

adb uninstall 包名

卸载软件但是保留配置和缓存文件:

adb uninstall -k 包名

如果机器上有多个模拟器或真机,需要使用-s命令行参数指定具体的模拟器或真机。例如,下面的命令分别在模拟器和真机上安装、重新安装和卸载应用程序。

在emulator-5554模拟器上安装ebook.apk

adb -s emulator-5554 install ebook.apk

在真机上安装ebook.apk

adb -s HT9BYL904399 install ebook.apk

在emulator-5554模拟器上重新安装ebook.apk

adb -s emulator-5554 install -r ebook.apk

在真机上重新安装ebook.apk

adb -s HT9BYL904399 install -r ebook.apk

在emulator-5554模拟器上卸载ebook.apk(不保留数据和缓冲目录)

adb -s emulator-5554 uninstall ebook包名

在真机上卸载ebook.apk(保留数据和缓冲目录)

adb -s HT9BYL904399 uninstall -k ebook包名

包管理,如何知道一个app包名呢

包名(Package name)在Android系统中是判断一个App的唯一标识,不同的App可以有同样的名字,但是它的包名不可以相同。

例如我们可以自己编译生成一个App也叫“微信”,但是我们的App的包名不能为com.tencent.mm

(微信的包名为这个),如果指定的包名和微信一致,那么手机上只允许安装这两个App中的其中一个。说到这很多人就会有疑问,如果有人恶意做了一个和微信内容一模一样的App,名字和包名都和微信一样,那怎么分辨呢?Android中为了防止这样的情况,还做了一个叫签名的东西,微信的签名一般我们是没有的,所以就可以通过签名来标识出这款App到底是谁的了。

  1. 看源代码。当有源代码的时候,可以到工程目录下的 “AndroidManifest.xml”文件下查看package这一项。

  2. adb命令查看列出手机装的所有 app 的包名:

    adb shell pm list packages

  3. 列出系统应用的所有包名:

    adb shell pm list packages -s

  4. 列出除了系统应用的第三方应用包名:

    adb shell pm list packages -3

  5. 推测一个包中可能带有的关键字:

    adb shell dumpsys activity | findstr mFocusedActivity

  6. 清除应用数据与缓存

    adb shell pm clear 应用包名

文件相关

  1. 接收电脑文件

    语法:adb push local remote

    案例:adb push d:/a.txt /sdcard/

    把电脑 D 盘下的 a.txt 文件推送到手机 sdcard 目录下

  2. 上传文件到电脑

    语法:adb pull remote local

    案例:adb pull /sdcard/a.txt d:/ 上传位于/sdcard/目录下的 a.txt 文件到电脑的 D 盘根目录下

截屏、录屏

  1. 截屏

    adb shell screencap /sdcard/a.png

    adb shell /system/bin/screencap -p /sdcard/a.png

  2. 使用adb进行屏幕录像

    adb shell screenrecord /sdcard/a.mp4

    通过ctrl+c停止录制,你可以在sdcard目录下查看。妈妈再也不担心我到处找录制视频的软件了。

shell

​ 进入shell adb shell

​ 退出shell

​ exit

手机信息收集

  1. 获取序列号

    adb get-serialno

  2. 获取 MAC 地址

    adb shell cat /sys/class/net/wlan0/address

  3. 查看设备型号

    adb shell getprop ro.product.model

  4. 查看 Android 系统版本

    adb shell getprop ro.build.version.release

  5. 查看屏幕分辨率

    adb shell wm size

  6. 查看屏幕密度

    adb shell wm density

  7. 查看permissions

    adb shell pm list permissions

  8. 查看系统的危险权限dangerous permissions

    adb shell pm list permissions -d -g

adb服务器杀死和启动

​ adb kill-server

​ adb start-server

​ 场景:比如希望移动adb文件夹,或者adb命令得不到想要的内容时

与进程相关:

​ 列出当前进程

​ adb shell ps | findstr 包名

​ 杀死某个包的进程

​ adb shell am force-stop 包名

与性能相关的一些内容

​ 获取内存:

​ adb shell dumpsys meminfo 包名

​ 获取cpu:

​ adb shell dumpsys cpuinfo | findstr 包名

​ adb shell top -n 1 | findstr 包名

​ 获取流畅度相关:

​ adb shell dumpsys gfxinfo 包名

app的启动停止

​ 如果想在模拟器或真机上运行已安装的应用程序,除了直接在模拟器或真机上操作外,还可以使用如下的命令直接运行程序。

​ 在emulator-5554模拟器上运行ebook.apk

​ adb -s emulator-5554 shell am start -n net.blogjava.mobile.ebook/net.blogjava.mobile.ebook.Main

​ 在真机上运行ebook.apk

​ adb -s HT9BYL904399 shell am start -n net.blogjava.mobile.ebook/net.blogjava.mobile.ebook.Main

​ 其中Main是ebook.apk的主Activity。相当于Windows应用程序的主窗体或Web应用程序的主页面。am是shell命令。

与Activity操作等相关

  1. 查看当前显示的activity adb shell dumpsys activity | findstr "mFocusedActivity"

    结果: mFocusedActivity: ActivityRecord{93a4f9 u0 com.youdao.note/.activity2.MainActivity t36}

    注意:我们只需要这一部分:com.youdao.note/.activity2.MainActivity即包名+activity

  2. 找到当前手机内的top Activity:

    adb shell dumpsys activity top | findstr ACTIVITY

  3. 启动某一个Activity: adb shell am start activity路径

    adb shell am start com.youdao.note/.activity2.MainActivity

sqlite

sqlite3 可启动用于检查 sqlite 数据库的 sqlite 命令行程序。它包含用于输出表格内容的 .dump 以及用于输出现有表格的 SQL CREATE 语句的 .schema 等命令。您也可以从命令行执行 SQLite 命令,如下所示。

$ adb -s emulator-5554 shell
$ sqlite3 /data/data/com.example.app/databases/rssitems.db
SQLite version 3.3.12
Enter ".help" for instructions

ls         //查看数据库文件有哪些
sqlite3    //进入sqlite3
.open media.db  //打开db结尾的数据库文件
.schema    //查看数据库、表结构等
.tables  //查看表名
.dump <表名> //查看表数据
 
 

查看8080端口是哪个应用占用

​ netstat -ano|findstr "8080"

adb logcat

在确定连上手机后(adb device,可以看到电脑连接的手机)

在cmd窗口中输入如下命令,就可以像Studio中的Logcat窗口中显示日志信息:

//格式1:打印默认日志数据
adb logcat 
//格式2:需要打印日志详细时间的简单数据
adb logcat -v time
//格式3:需要打印级别为Error的信息
adb logcat *:E
//格式4:需要打印时间和级别是Error的信息
adb logcat -v time *:E
//格式5:将日志保存到电脑固定的位置,比如D:\log.txt
adb logcat -v time >D:\log.txt
 

这时手机日志更新什么日志,cmd窗口也会同步更新数据。

但是这样没有过滤条件,如果Log日志很多,很难找到我们想要的信息,

当然也可以复制cmd中的数据到一个文本中慢慢处理的,就是效率不高。

下面介绍adb logcat中的详细参数命令以及如何才能高效的打印日志,或者把日志保存到我们指定的位置。

日志过滤:

adb logcat <tag>[:priority]

tag表示标签,priority输出的级别,日志默认级别是V,如果错误日志我们选择E就可以。

Android 的日志分为如下几个优先级(priority):
V —— Verbose(最低,输出得最多)
D —— Debug
I —— Info
W —— Warning
E —— Error
F —— Fatal
S —— Silent(最高,啥也不输出)
 
 

按某级别过滤日志则会将该级别及以上的日志输出。比如,命令:adb logcat *:W

其实*可以是某个tag,如果没有指明,就表示所有。

tag可以由多个 [:priority] 组成。比如,命令:

adb logcat ActivityManager:I MyApp:D *:S

表示输出 tag ActivityManager 的 Info 以上级别日志,输出 tag MyApp 的 Debug 以上级别日志,及其它 tag 的 Silent 级别日志(即屏蔽其它 tag 日志)。

adb logcat选项解析

--"-s"选项 : 设置输出日志*:s的标签, 只显示该标签的日志;
--"-f"选项 : 将日志输出到文件, 默认输出到标准输出流中, -f 参数执行不成功;
--"-r"选项 : 按照每千字节输出日志, 需要 -f 参数, 不过这个命令没有执行成功;
--"-n"选项 : 设置日志输出的最大数目, 需要 -r 参数, 这个执行 感觉 跟 adb logcat 效果一样;
--"-v"选项 : 设置日志的输出格式, 注意只能设置一项;
--"-c"选项 : 清空所有的日志缓存信息;
--"-d"选项 : 将缓存的日志输出到屏幕上, 并且不会阻塞;
--"-t"选项 : 输出最近的几行日志, 输出完退出, 不阻塞;
--"-g"选项 : 查看日志缓冲区信息;
--"-B"选项 : 以二进制形式输出日志;
 
 

把日志信息保存到电脑中

adb logcat最后添加” > 保存文件的地址,比如需要将的信息保存到电脑中使用下面的命令:

adb logcat -v time > D:\log.txt

思维导图-adb大全

a16a91100774feab117ca8c4f5e7f07

ADB 的 Python 实现,具有 shell 和 FileSync 功能。

安装

pip install adb-shell

示例用法

from adb_shell.adb_device import AdbDeviceTcp, AdbDeviceUsb
from adb_shell.auth.sign_pythonrsa import PythonRSASigner

# Connect
device1 = AdbDeviceTcp('192.168.10.190', 5555, default_transport_timeout_s=9.)
device1.connect(auth_timeout_s=0.1)

# # Connect via USB (package must be installed via `pip install adb-shell[usb])`
# device2 = AdbDeviceUsb()
# device2.connect(auth_timeout_s=0.1)

# Send a shell command
response1 = device1.shell('getprop ro.serialno')
print(response1)

# 输出
00500300000100601001842C8087F472

 

 

 

 

 

 


文章作者: shibuyu
版权声明: 本站所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 师不予的测试Blog
posted @ 2023-03-30 10:09  测试玩家勇哥  阅读(538)  评论(0编辑  收藏  举报