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 执行一些初始步骤,如下所述:
-
将 Android 设备和 adb 主机连接到这两者都可以访问的同一 Wi-Fi 网络。请注意,并非所有接入点都适用;您可能需要使用防火墙已正确配置为支持 adb 的接入点。
-
使用 USB 线将设备连接到主机。
-
设置目标设备以监听端口 5555 上的 TCP/IP 连接。
-
拔掉连接目标设备的 USB 线。
-
找到 Android 设备的 IP 地址。例如,对于 Nexus 设备,您可以在设置 > 关于平板电脑(或关于手机)> 状态 > IP 地址下找到 IP 地址。或者,对于 Wear OS 设备,您可以在设置 > WLAN 设置 > 高级 > IP 地址下找到 IP 地址。
-
通过 IP 地址连接到设备。
-
确认主机已连接到目标设备:
现在,您可以开始操作了!
如果 adb 连接断开:
-
确保主机仍与 Android 设备连接到同一个 WLAN 网络。
-
通过再次执行
adb connect
步骤重新连接。 -
如果上述操作未解决问题,重置 adb 主机:
然后,从头开始操作。
查询设备
在发出 adb 命令之前,了解哪些设备实例已连接到 adb 服务器会很有帮助。您可以使用 devices
命令生成已连接设备的列表。
作为回应,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
。
如果有多个可用设备,但只有一个是模拟器,请使用 -e
选项将命令发送至该模拟器。同样,如果有多个设备,但只连接了一个硬件设备,请使用 -d
选项将命令发送至该硬件设备。
安装应用
您可以使用 adb 的 install
命令在模拟器或连接的设备上安装 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
命令可将任意目录和文件复制到设备中的任何位置。
如需从设备中复制某个文件或目录(及其子目录),请使用以下命令:
如需将某个文件或目录(及其子目录)复制到设备,请使用以下命令:
将 local
和 remote
替换为开发机器(本地)和设备(远程)上的目标文件/目录的路径。例如:
停止 adb 服务器
在某些情况下,您可能需要终止 adb 服务器进程,然后重启以解决问题(例如,如果 adb 不响应命令)。
如需停止 adb 服务器,请使用 adb kill-server
命令。然后,您可以通过发出其他任何 adb 命令来重启服务器。
发出 adb 命令
您可以从开发机器上的命令行发出 adb 命令,也可以通过脚本发出。用法如下:
如果只有一个模拟器在运行或者只连接了一个设备,系统会默认将 adb 命令发送至该设备。如果有多个模拟器正在运行并且/或者连接了多个设备,您需要使用 -d
、-e
或 -s
选项指定应向其发送命令的目标设备。
您可以使用以下命令来查看所有支持的 adb 命令的详细列表:
发出 shell 命令
您可以使用 shell
命令通过 adb 发出设备命令,也可以启动交互式 shell。如需发出单个命令,请使用 shell
命令,如下所示:
要在设备上启动交互式 shell,请使用 shell
命令,如下所示:
要退出交互式 shell,请按 Ctrl + D 键或输入 exit
。
Android 提供了大多数常见的 Unix 命令行工具。如需查看可用工具的列表,请使用以下命令:
对于大多数命令,都可通过 --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到底是谁的了。
-
看源代码。当有源代码的时候,可以到工程目录下的 “AndroidManifest.xml”文件下查看package这一项。
-
adb命令查看列出手机装的所有 app 的包名:
adb shell pm list packages
-
列出系统应用的所有包名:
adb shell pm list packages -s
-
列出除了系统应用的第三方应用包名:
adb shell pm list packages -3
-
推测一个包中可能带有的关键字:
adb shell dumpsys activity | findstr mFocusedActivity
-
清除应用数据与缓存
adb shell pm clear 应用包名
文件相关
-
接收电脑文件
语法:
adb push local remote
案例:
adb push d:/a.txt /sdcard/
把电脑 D 盘下的 a.txt 文件推送到手机 sdcard 目录下
-
上传文件到电脑
语法:
adb pull remote local
案例:
adb pull /sdcard/a.txt d:/ 上传位于/sdcard/目录下的 a.txt 文件到电脑的 D 盘根目录下
截屏、录屏
-
截屏
adb shell screencap /sdcard/a.png
adb shell /system/bin/screencap -p /sdcard/a.png
-
使用adb进行屏幕录像
adb shell screenrecord /sdcard/a.mp4
通过ctrl+c停止录制,你可以在sdcard目录下查看。妈妈再也不担心我到处找录制视频的软件了。
shell
进入shell adb shell
退出shell
exit
手机信息收集
-
获取序列号
adb get-serialno
-
获取 MAC 地址
adb shell cat /sys/class/net/wlan0/address
-
查看设备型号
adb shell getprop ro.product.model
-
查看 Android 系统版本
adb shell getprop ro.build.version.release
-
查看屏幕分辨率
adb shell wm size
-
查看屏幕密度
adb shell wm density
-
查看permissions
adb shell pm list permissions
-
查看系统的危险权限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操作等相关
-
查看当前显示的activity
adb shell dumpsys activity | findstr "mFocusedActivity"
结果:
mFocusedActivity: ActivityRecord{93a4f9 u0 com.youdao.note/.activity2.MainActivity t36}
注意:我们只需要这一部分:
com.youdao.note/.activity2.MainActivity即包名+activity
-
找到当前手机内的top Activity:
adb shell dumpsys activity top | findstr ACTIVITY
-
启动某一个Activity:
adb shell am start activity路径
adb shell am start com.youdao.note/.activity2.MainActivity
sqlite
sqlite3
可启动用于检查 sqlite 数据库的 sqlite 命令行程序。它包含用于输出表格内容的 .dump
以及用于输出现有表格的 SQL CREATE
语句的 .schema
等命令。您也可以从命令行执行 SQLite 命令,如下所示。
查看8080端口是哪个应用占用
netstat -ano|findstr "8080"
adb logcat
在确定连上手机后(adb device,可以看到电脑连接的手机)
在cmd窗口中输入如下命令,就可以像Studio中的Logcat窗口中显示日志信息:
这时手机日志更新什么日志,cmd窗口也会同步更新数据。
但是这样没有过滤条件,如果Log日志很多,很难找到我们想要的信息,
当然也可以复制cmd中的数据到一个文本中慢慢处理的,就是效率不高。
下面介绍adb logcat中的详细参数命令以及如何才能高效的打印日志,或者把日志保存到我们指定的位置。
日志过滤:
adb logcat <tag>[:priority]
tag表示标签,priority输出的级别,日志默认级别是V,如果错误日志我们选择E就可以。
按某级别过滤日志则会将该级别及以上的日志输出。比如,命令:adb logcat *:W
其实*可以是某个tag,如果没有指明,就表示所有。
tag可以由多个 [:priority] 组成。比如,命令:
adb logcat ActivityManager:I MyApp:D *:S
表示输出 tag ActivityManager 的 Info 以上级别日志,输出 tag MyApp 的 Debug 以上级别日志,及其它 tag 的 Silent 级别日志(即屏蔽其它 tag 日志)。
adb logcat选项解析
把日志信息保存到电脑中
adb logcat最后添加” > 保存文件的地址,比如需要将的信息保存到电脑中使用下面的命令:
adb logcat -v time > D:\log.txt
思维导图-adb大全
ADB 的 Python 实现,具有 shell 和 FileSync 功能。
安装
pip install adb-shell
示例用法
本文来自博客园,作者:测试玩家勇哥,转载请注明原文链接:https://www.cnblogs.com/Nephalem-262667641/articles/17271569.html