概述
adb:Android Debug Bridge,就是起到调试桥的作用,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具。
adb采用监听Socket TCP 5554等端口的方式让IDE和Emu通讯,默认情况下adb会daemon相关的网络端口,所以当我们运行Eclipse时adb进程就会自动运行。
adb是客户端-服务器端程序, 其中客户端是你用来操作的电脑, 服务器端是android设备
adb是android sdk里的一个工具, 用这个工具可以直接操作管理android模拟器或者真实的android设备 它的主要功能有:
* 运行设备的shell(命令行)
* 管理模拟器或设备的端口映射
* 计算机和设备之间上传/下载文件
* 将本地apk软件安装至模拟器或android设备
基本用法
adb [-d|-e|-s <serialNumber>] <command> |
如果只有一个设备/模拟器连接时,可以省略掉 [-d|-e|-s <serialNumber>] 这一部分,直接使用 adb <command>。如果有多个设备/模拟器连接,则需要为命令指定目标设备。
参数 | 含义 |
-d | 指定当前唯一通过 USB 连接的 Android 设备为命令目标 |
-e | 指定当前唯一运行的模拟器为命令目标 |
-s <serialNumber> | 指定相应 serialNumber 号的设备/模拟器为命令目标 |
常用命令
查看当前PC端连接有多少设备
adb devices |
返回内容:
offline----------表示设备未连接成功或无响应。
device ----------设备已连接。注意这个状态并不能标识 Android 系统已经完全启动和可操作,在设备启动过程中设备实例就可连接到 adb,但启动完毕后系统才处于可操作状态。
no device ----------没有设备/模拟器连接。
现在我也找了很多测试的朋友,做了一个分享技术的交流群,共享了很多我们收集的技术文档和视频教程。
如果你不想再体验自学时找不到资源,没人解答问题,坚持几天便放弃的感受
可以加入我们一起交流。而且还有很多在自动化,性能,安全,测试开发等等方面有一定建树的技术大牛
分享他们的经验,还会分享很多直播讲座和技术沙龙
可以免费学习!划重点!开源的!!!
qq群号:110685036
adb-server 的开启与关闭
adb kill-serveradb start-server |
查看adb的版本
adb version |
获取屏幕分辨率
adb shell wm size |
等待设备连接成功
adb wait-for-device |
给设备安装apk包
adb install D://shipin.apk |
参数 | 含义 |
-l | 将应用安装到保护目录 /mnt/asec |
-r | 允许覆盖安装 |
-t | 允许安装 AndroidManifest.xml 里 application 指定的android:testOnly="true" 的应用 |
-s | 将应用安装到 sdcard |
-d | 允许降级覆盖安装 |
-g | 授予所有运行时权限 |
常见安装失败输出代码、含义及可能的解决办法如下:
输出 | 含义 | 解决办法 |
INSTALL_FAILED_ALREADY_EXISTS | 应用已经存在,或卸载了但没卸载干净 | adb install 时使用 -r 参数,或者先 adb uninstall <packagename> 再安装 |
INSTALL_FAILED_INVALID_APK | 无效的 APK 文件 | |
INSTALL_FAILED_INVALID_URI | 无效的 APK 文件名 | 确保 APK 文件名里无中文 |
INSTALL_FAILED_INSUFFICIENT_STORAGE | 空间不足 | 清理空间 |
INSTALL_FAILED_DUPLICATE_PACKAGE | 已经存在同名程序 | |
INSTALL_FAILED_NO_SHARED_USER | 请求的共享用户不存在 | |
INSTALL_FAILED_UPDATE_INCOMPATIBLE | 以前安装过同名应用,但卸载时数据没有移除 | 先 adb uninstall <packagename> 再安装 |
INSTALL_FAILED_SHARED_USER_INCOMPATIBLE | 请求的共享用户存在但签名不一致 | |
INSTALL_FAILED_MISSING_SHARED_LIBRARY | 安装包使用了设备上不可用的共享库 | |
INSTALL_FAILED_REPLACE_COULDNT_DELETE | 替换时无法删除 | |
INSTALL_FAILED_DEXOPT | dex 优化验证失败或空间不足 | |
INSTALL_FAILED_OLDER_SDK | 设备系统版本低于应用要求 | |
INSTALL_FAILED_CONFLICTING_PROVIDER | 设备里已经存在与应用里同名的 content provider | |
INSTALL_FAILED_NEWER_SDK | 设备系统版本高于应用要求 | |
INSTALL_FAILED_TEST_ONLY | 应用是 test-only 的,但安装时没有指定 -t 参数 | |
INSTALL_FAILED_CPU_ABI_INCOMPATIBLE | 包含不兼容设备 CPU 应用程序二进制接口的 native code | |
INSTALL_FAILED_MISSING_FEATURE | 应用使用了设备不可用的功能 | |
INSTALL_FAILED_CONTAINER_ERROR | 1. sdcard 访问失败; 2. 应用签名与 ROM 签名一致,被当作内置应用 | 1. 确认 sdcard 可用,或者安装到内置存储; 2. 打包时不与 ROM 使用相同签名 |
INSTALL_FAILED_INVALID_INSTALL_LOCATION | 1. 不能安装到指定位置; 2. 应用签名与 ROM 签名一致,被当作内置应用 | 1. 切换安装位置,添加或删除 -s 参数; 2. 打包时不与 ROM 使用相同签名 |
INSTALL_FAILED_MEDIA_UNAVAILABLE | 安装位置不可用 | 一般为 sdcard,确认 sdcard 可用或安装到内置存储 |
INSTALL_FAILED_VERIFICATION_TIMEOUT | 验证安装包超时 | |
INSTALL_FAILED_VERIFICATION_FAILURE | 验证安装包失败 | |
INSTALL_FAILED_PACKAGE_CHANGED | 应用与调用程序期望的不一致 | |
INSTALL_FAILED_UID_CHANGED | 以前安装过该应用,与本次分配的 UID 不一致 | 清除以前安装过的残留文件 |
INSTALL_FAILED_VERSION_DOWNGRADE | 已经安装了该应用更高版本 | 使用 -d 参数 |
INSTALL_FAILED_PERMISSION_MODEL_DOWNGRADE | 已安装 target SDK 支持运行时权限的同名应用,要安装的版本不支持运行时权限 | |
INSTALL_PARSE_FAILED_NOT_APK | 指定路径不是文件,或不是以 .apk 结尾 | |
INSTALL_PARSE_FAILED_BAD_MANIFEST | 无法解析的 AndroidManifest.xml 文件 | |
INSTALL_PARSE_FAILED_UNEXPECTED_EXCEPTION | 解析器遇到异常 | |
INSTALL_PARSE_FAILED_NO_CERTIFICATES | 安装包没有签名 | |
INSTALL_PARSE_FAILED_INCONSISTENT_CERTIFICATES | 已安装该应用,且签名与 APK 文件不一致 | 先卸载设备上的该应用,再安装 |
INSTALL_PARSE_FAILED_CERTIFICATE_ENCODING | 解析 APK 文件时遇到 CertificateEncodingException | |
INSTALL_PARSE_FAILED_BAD_PACKAGE_NAME | manifest 文件里没有或者使用了无效的包名 | |
INSTALL_PARSE_FAILED_BAD_SHARED_USER_ID | manifest 文件里指定了无效的共享用户 ID | |
INSTALL_PARSE_FAILED_MANIFEST_MALFORMED | 解析 manifest 文件时遇到结构性错误 | |
INSTALL_PARSE_FAILED_MANIFEST_EMPTY | 在 manifest 文件里找不到找可操作标签(instrumentation 或 application) | |
INSTALL_FAILED_INTERNAL_ERROR | 因系统问题安装失败 | |
INSTALL_FAILED_USER_RESTRICTED | 用户被限制安装应用 | |
INSTALL_FAILED_DUPLICATE_PERMISSION | 应用尝试定义一个已经存在的权限名称 | |
INSTALL_FAILED_NO_MATCHING_ABIS | 应用包含设备的应用程序二进制接口不支持的 native code | |
INSTALL_CANCELED_BY_USER | 应用安装需要在设备上确认,但未操作设备或点了取消 | 在设备上同意安装 |
INSTALL_FAILED_ACWF_INCOMPATIBLE | 应用程序与设备不兼容 | |
does not contain AndroidManifest.xml | 无效的 APK 文件 | |
is not a valid zip file | 无效的 APK 文件 | |
Offline | 设备未连接成功 | 先将设备与 adb 连接成功 |
unauthorized | 设备未授权允许调试 | |
error: device not found | 没有连接成功的设备 | 先将设备与 adb 连接成功 |
protocol failure | 设备已断开连接 | 先将设备与 adb 连接成功 |
Unknown option: -s | Android 2.2 以下不支持安装到 sdcard | 不使用 -s 参数 |
No space left on devicerm | 空间不足 | 清理空间 |
Permission denied … sdcard … | sdcard 不可用 |
卸载设备中已经安装的软件
可选参数-k的作用为卸载软件但是保留配置和缓存文件
adb uninstall [-k] <packagename> |
-k的作用为卸载软件但是保留配置和缓存文件
adb uninstall cn.uc.test
cn.uc.test:包名
E:\soft\sdk\platform-tools>cd E:\soft\sdk\build-tools\28.0.3
E:\soft\sdk\build-tools\28.0.3>aapt dump badging e:\shipin.apk
package: name='com.wimx.videopaper' versionCode='110' versionName='1.1.0' platfo
rmBuildVersionName='7.1.1'
sdkVersion:'15'
targetSdkVersion:'22'
所以执行:
adb uninstall com.wimx.videopaper
将数据从设备复制到本地
adb pull /sdcard/stericson-ls D://caichang |
将数据从本地复制到设备中
adb push d://stericson-ls /sdcard/ |
将system分区重新挂在为可读写分区
此命令在操作系统目录时很重要
adb remount |
重启设备
adb reboot |
进入模拟器的shell模式
adb shell |
应用管理
查看应用列表
查看应用列表的基本命令格式是
adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER] |
即在 adb shell pm list packages 的基础上可以加一些参数进行过滤查看不同的列表,支持的过滤参数如下:
参数 | 显示列表 |
-f | 显示应用关联的 apk 文件 |
-d | 只显示 disabled 的应用 |
-e | 只显示 enabled 的应用 |
-s | 只显示系统应用 |
-3 | 只显示第三方应用 |
-i | 显示应用的 installer |
-u | 包含已卸载应用 |
<FILTER> | 包名包含 <FILTER> 字符串 |
所有应用
命令:
adb shell pm list packages |
输出示例:
package:com.android.smoketestpackage:com.example.android.livecubespackage:com.android.providers.telephonypackage:com.google.android.googlequicksearchboxpackage:com.android.providers.calendarpackage:com.android.providers.mediapackage:com.android.protipspackage:com.android.documentsuipackage:com.android.gallerypackage:com.android.externalstorage...// other packages here... |
包名包含某字符串的应用
adb shell pm list packages mazhuang |
当然也可以使用 grep 来过滤:
adb shell pm list packages | grep mazhuang |
强制停止应用
adb shell am force-stop <packagename> |
命令示例:
adb shell am force-stop com.qihoo360.mobilesafe |
表示停止 360 安全卫士的一切进程与服务。
Logcat日志
[adb] logcat [<option>] ... [<filter-spec>] ... |
按级别过滤日志
Android 的日志分为如下几个优先级(priority):
- V —— Verbose(最低,输出得最多)
- D —— Debug
- I —— Info
- W —— Warning
- E —— Error
- F —— Fatal
- S —— Silent(最高,啥也不输出)
按某级别过滤日志则会将该级别及以上的日志输出。
如下, 会将 Warning、Error、Fatal 和 Silent 日志输出:
adb logcat *:W |
(注:在 macOS 下需要给 *:W 这样以 * 作为 tag 的参数加双引号,如 adb logcat "*:W",不然会报错 no matches found: *:W。)
按 tag 和级别过滤日志
<filter-spec> 可以由多个 <tag>[:priority] 组成。
如下,表示输出 tag ActivityManager 的 Info 以上级别日志,输出 tag MyApp 的 Debug 以上级别日志,及其它 tag 的 Silent 级别日志(即屏蔽其它 tag 日志)。
adb logcat ActivityManager:I MyApp:D *:S |
日志格式
可以用 adb logcat -v <format> 选项指定日志输出格式。
日志支持按以下几种 <format>:
- brief,默认格式。格式为:
<priority>/<tag>(<pid>): <message> |
示例:
D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0 |
- process,格式为:
<priority>(<pid>) <message> |
示例:
D( 1785) Disconnected process message: 10, size: 0 (HeadsetStateMachine) |
- tag,格式为:
<priority>/<tag>: <message> |
示例:
D/HeadsetStateMachine: Disconnected process message: 10, size: 0 |
- raw,格式为:
<message> |
示例:
Disconnected process message: 10, size: 0 |
- time,格式为:
<datetime> <priority>/<tag>(<pid>): <message> |
示例:
08-28 22:39:39.974 D/HeadsetStateMachine( 1785): Disconnected process message: 10, size: 0 |
- threadtime,格式为:
<datetime> <pid> <tid> <priority> <tag>: <message> |
示例:
08-28 22:39:39.974 1785 1832 D HeadsetStateMachine: Disconnected process message: 10, size: 0 |
- long,格式为:
[ <datetime> <pid>:<tid> <priority>/<tag> ]<message> |
示例:
[ 08-28 22:39:39.974 1785: 1832 D/HeadsetStateMachine ]Disconnected process message: 10, size: 0 |
指定格式可与上面的过滤同时使用。比如:
adb logcat -v long ActivityManager:I *:S |
清空日志
adb logcat -c |
内核日志
adb shell dmesg |
输出示例:中括号里的 [14201.684016] 代表内核开始启动后的时间,单位为秒。通过内核日志我们可以做一些事情,比如衡量内核启动时间,在系统启动完毕后的内核日志里找到 Freeing init memory 那一行前面的时间就是
<6>[14201.684016] PM: noirq resume of devices complete after 0.982 msecs<6>[14201.685525] PM: early resume of devices complete after 0.838 msecs<6>[14201.753642] PM: resume of devices complete after 68.106 msecs<4>[14201.755954] Restarting tasks ... done.<6>[14201.771229] PM: suspend exit 2016-08-28 13:31:32.679217193 UTC<6>[14201.872373] PM: suspend entry 2016-08-28 13:31:32.780363596 UTC<6>[14201.872498] PM: Syncing filesystems ... done. |
屏幕截图
adb shell screencap -p /sdcard/sc.png |
adb pull /sdcard/sc.png |
可以使用 adb shell screencap -h 查看 screencap 命令的帮助信息,下面是两个有意义的参数及含义。如果指定文件名以 .png 结尾时可以省略 -p 参数;否则需要使用 -p 参数。如果不指定文件名,截图文件的内容将直接输出到 stdout。
参数 | 含义 |
-p | 指定保存文件为 png 格式 |
-d display-id | 指定截图的显示屏编号(有多显示屏的情况下) |
录制屏幕
录制屏幕以 mp4 格式保存到 /sdcard:需要停止时按 Ctrl-C,默认录制时间和最长录制时间都是 180 秒。
adb shell screenrecord /sdcard/filename.mp4 |
。
如果需要导出到电脑:
adb pull /sdcard/filename.mp4 |
可以使用 adb shell screenrecord --help 查看 screenrecord 命令的帮助信息,下面是常见参数及含义:
参数 | 含义 |
–size WIDTHxHEIGHT | 视频的尺寸,比如 1280x720,默认是屏幕分辨率 |
–bit-rate RATE | 视频的比特率,默认是 4Mbps |
–time-limit TIME | 录制时长,单位秒 |
–verbose | 输出更多信息 |
最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走!
软件测试面试文档
我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。