草庐IT

Android 常用 adb 命令总结

luzhuangzhi 2023-03-28 原文

Android 常用 adb 命令总结

adb ( 全称为Android Debug Bridge)是一个C/S 架构命令行工具,起到调试桥的作用,是连接Android手机与PC端的桥梁,方便我们在电脑上对手机进行操作。adb 命令可用于执行各种设备操作,如安装和调试应用。

点击下载adb工具

ADB和Fastboo最新Google官方下载地址:https://developer.android.com/studio/releases/platform-tools?hl=zh-cn,或点击下面对应链接下载

Windows:https://dl.google.com/android/repository/platform-tools-latest-windows.zip?hl=zh-cn

Mac:https://dl.google.com/android/repository/platform-tools-latest-darwin.zip?hl=zh-cn

Linux:https://dl.google.com/android/repository/platform-tools-latest-linux.zip?hl=zh-cn

针对移动端 Android 的测试, 熟练使用adb命令, 将会为给 Android 测试带来很大的便利,其中很多命令也会用于自动化测试的脚本当中。

下面主要介绍,adb 和 adb shell 命令、linux 命令只列出,不详解。以上三个部分:

adb 命令

在配好环境变量的前提下,在命令窗口当中输入 adb help 或者直接输入 adb ,将会列出所有的选项说明及子命令。

下面正式开始介绍 adb 命令、adb shell 命令 ~ 坐稳扶好 ~ 发车了 ~~~

在开发或者测试的过程中,我们可以通过 adb 来管理多台设备,其一般的格式为:

adb [-e | -d | -s <设备序列号>] <子命令>

  • adb devices , 获取设备列表及设备状态

C:\Users\mkcshwzx>adb devices

List of devices attached

47e965af device

  • adb get-state , 获取设备的状态

C:\Users\mkcshwzx>adb get-state
device

设备的状态有 3 钟,device , offline , unknown
device:设备正常连接
offline:连接出现异常,设备无响应
unknown:没有连接设备
  • adb kill-server , adb start-server , 结束 adb 服务, 启动 adb 服务,通常两个命令一起用

一般在连接出现异常,使用 adb devices 未正常列出设备, 设备状态异常时使用 kill-server,然后运行 start-server 进行重启服务

  • adb logcat , 打印 Android 的系统日志

adb logcat 

打印log至命令窗口,Ctrl + C停止打印log

adb logcat -c

 -c 清空所有的日志缓存信息

 adb logcat -g

-g 查看日志缓冲区信息 

adb logcat -t 

-t 输出最近的几行日志, 输出完退出, 不阻塞;

例如:adb logcat -t  5

adb logcat -s

设置输出日志的标签, 只显示该标签的日志;

例如:adb logcat -s System.out

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

-v 设置日志的输出格式, 注意只能设置一项

例如:日志保存到D:\Logcat\目录下

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

adb logcat | grep wifi

过滤固定字符串 : 只要命令行出现的日志都可以过滤, 不管是不是标签

例如:adb shell | findstr wifi

说明:

管道符“|”:可以把标准的输入流与标准的输出流进行合并,或者把某个命令的标准输出流作为另一个命令的标准输入流。

exit退出shell。

由于grep为linux命令,运行单条adb shell 时并没有进入linux

shell环境,并不能用grep等其他linux命令,只能用window cmd的命令。在这里可以用findstr来代替grep,使用方法为

findstr/grep [keyword]

  • adb bugreport , 打印dumpsys、dumpstate、logcat的输出,也是用于分析错误

输出比较多,建议重定向到一个文件中

例如:adb bugreport > d:\bugreport.log

  • adb install , 安装应用,

adb install test.apk

安装应用,这里的xx.apk是电脑上的路径,例如:adb shell instal E:/test.apk。

windows 下如果需要安装含有中文名的 apk ,需要对 adb 进行修改,百度可以找到做出修改的adb , 支持中文命令的 apk,请自行搜索

adb -s xxxxxxxx install xx.apk  

指定序列号的设备安装。注意:xxxx 就是上面提到adb devices 中device前面展示的手机序列号。

adb install -r test.apk

 -r 覆盖安装,保留存储数据

adb install -t test.apk

允许安装测试包

adb install -s test.apk

将应用程序安装到sd卡上

adb install -d test.apk

允许降级覆盖安装,忽略版本号

  • adb uninstall , 卸载应用,后面跟的参数是应用的包名,请区别于 apk 文件名

adb uninstall com.baidu.BaiduMap

卸载应用

adb uninstall -k com.baidu.BaiduMap

'-k' means keep the data and cache directories , -k 选项,卸载时保存数据和缓存目录

  • adb pull , 将 Android 设备上的文件或者文件夹复制到本地

注意权限,复制系统权限的目录下的文件,需要 root ,并且一般的 Android 机 root 之后并不能使用命令去复制,而需要在手机上使用类似于 RE 的文件浏览器,先对系统的文件系统进行挂载为可读写后,才能在手机上复制移动系统文件。

adb pull sdcard/pull.txt D:\

复制 Sdcard 下的 pull.txt 文件到 D 盘:

adb pull sdcard/pull.txt D:\name.txt

如果需要重命名为 name.txt:

  • adb push , 推送本地文件至 Android 设备

adb push D:\push.txt sdcard/

推送 D 盘下的 push.txt 至 Sdcard:

  • adb root 、adb remount  只针对类似小米开发版的手机有用

可以直接已这两个命令获取 root 权限,并挂载系统文件系统为可读写状态

  • adb reboot  重启 Android 设备

adb reboot edl

重启设备,进入线刷模式。端口为9008

adb reboot bootloader 

bootloader , 重启设备,进入 fastboot 模式

adb reboot recovery 

recovery , 重启设备,进入 recovery 模式,经常刷机的同学比较熟悉这个模式

  • adb forward , 将 宿主机上的某个端口重定向到设备的某个端口

adb forward tcp:8080 tcp :8082

执行该命令后所有发往宿主机 8080 端口的消息、数据都会转发到 Android 设备的 8082 端口上,因此可以通过远程的方式控制 Android 设备。

  • adb connect 远程连接 Android 设备

手机、PC处于相同的网络下,手机 root ,安装应用 adbWireless ,启动应用后点击界面中间的按钮

接着运行 adb connect 192.168.28.92 , 即可通过无线的方式连接手机,缺点是速度比较慢

adb shell 命令

如何区分 adb 命令和 adb shell 命令 。简单点讲,adb 命令是 adb 这个程序自带的一些命令,而 adb shell 则是调用的 Android 系统中的命令。这些 Android 特有的命令都放在了 Android 设备的 system/bin 目录下,将整个 system/bin 目录复制了出来,然后一个一个的去试。

下面介绍一些常用的 adb shell 命令 (其中pm、am 命令比较庞大)

pm命令

pm全称Package Manager , 可以用pm命令获取到一些安装在 Android 设备上得应用信息,直接运行 adb shell pm 可以获取到该命令的帮助信息

  • pm list package 列出安装在设备上的应用

adb shell pm list package

不带任何选项:列出所有的应用的包名(不知道怎么找应用的包名的同学看这里)

adb shell pm list package -s

-s:列出系统应用

adb shell pm list package -3

-3:列出第三方应用

adb shell pm list package -f

-f:列出应用包名及对应的apk名及存放位置

adb shell pm list package -i

-i:列出应用包名及其安装来源,结果显示例子:

C:\Users\mkcshwzx>adb shell pm list package -i

package:com.sohu.inputmethod.sogou  installer=null

adb shell pm list package -f -3 -i baidu   命令最后增加 FILTER:过滤关键字,可以很快查找自己想要的应用

例如:查找三方应用中百度的包名、apk存放位置、安装来源:

C:\Users\mkcshwzx>adb shell pm list package -f -3 -i baidu
package:/product/preload/Baidusearch/Baidusearch.apk=com.baidu.searchbox installer=null
package:/product/preload/BaiduMap/BaiduMap.apk=com.baidu.BaiduMap installer=null

  • pm path 列出对应包名的 .apk 位置

adb shell pm path test.apk

例如:C:\Users\mkcshwzx>adb shell pm path com.baidu.searchbox

package:/product/preload/Baidusearch/Baidusearch.apk

  • pm list instrumentation  列出含有单元测试 case 的应用

后面可跟参数 -f (与 pm list package 中一样),以及 [TARGET-PACKAGE]

  • pm dump  后跟包名,列出指定应用的 dump 信息

adb shell pm dump com.baidu.searchbox

显示太多,请自行输入命令查看

  • pm install  安装应用

adb shell pm install xx.apk

这里的xx.apk是Android设备内存中的路径,必须是绝对路径。一般建议放在/sdcard/下或/data/local/tmp/路径下。

其实adb install xx.apk = adb push E:\xx.apk /data/local/tmp + adb shell pm install /data/local/tmp/xx.apk

例如:

C:\Users\mkcshwzx>adb push E:\ftp.apk /data/local/tmp
E:\ftp.apk: 1 file pushed, 0 skipped. 21.9 MB/s (2769612 bytes in 0.121s)

C:\Users\mkcshwzx>adb shell pm install /data/local/tmp/ftp.apk
Success

adb shell pm install -r xx.apk

重新安装该程序,保存数据

adb shell pm install -t xx.apk   

允许测试包

adb shell pm install -d xx.apk   

允许降级覆盖安装

若 apk 存放于 PC 端,请使用 adb install 安装

若 apk 存放于 Android 设备上,请使用 pm install 安装

  • pm uninstall  卸载应用, 后面跟的参数都是应用的包名

adb shell pm uninstall xx.apk

例如卸载安装的AndFTP应用:C:\Users\mkcshwzx>adb shell pm uninstall lysesoft.andftpSuccess

  • pm clear  清除应用数据, 后面跟的参数都是应用的包名

例如清除AndFTP应用数据:C:\Users\mkcshwzx>adb shell pm clear lysesoft.andftp

Success

am命令

am全称Activity Manager,可以用am命去模拟各种系统的行为,直接运行 adb shell am 可以获取到该命令的帮助信息。

  • am start 启动一个 Activity,am start 后面跟的参数是应用的包名。

adb shell am start com.baidu.BaiduMap

以启动百度地图为例

adb shell am start -S com.baidu.BaiduMap

-S 先停止目标应用,再启动

adb shell am start -W com.baidu.BaiduMap

-W 等待应用完成启动

adb shell am start -a android.intent.action.VIEW -d https://www.cnblogs.com/luzhuangzhi/

启动默认浏览器打开一个网页

adb shell am start -a android.intent.action.CALL -d tel:10086

启动拨号器拨打 10086

  • am instrument  启动一个 instrumentation 

单元测试或者 Robotium 会用到

  • am monitor  监控 crash 与 ANR

 adb shell am monitor

 例如:C:\Users\mkcshwzx>adb shell ammonitor

Monitoring activity manager... available commands:

(q)uit: finish monitoring

** Activity starting: lysesoft.andftp

  • am force-stop  后跟包名,结束应用

例如:C:\Users\mkcshwzx>adb shell am force-stop lysesoft.andftp

  • am startservice  启动一个服务
  • am broadcast  发送一个广播

input命令

这个命令可以向 Android 设备发送按键事件

  • input text  发送文本内容,不能发送中文

adb shell input text test123456

前提先将键盘设置为英文键盘

  • input keyevent  发送按键事件

adb shell input keyevent KEYCODE_HOME

模拟按下 Home 键 ,源码里面有定义:

public static final int KEYCODE_HOME = 3;

因此可以将命令中的 KEYCODE_HOME 替换为 3

可自行百度 keyevent 常用键列表

官方文档:https://developer.android.com/reference/android/view/KeyEvent

  • input tap  对屏幕发送一个触摸事件

adb shell input tap 500 500

点击屏幕上坐标为 500 500 的位置

  • input swipe  滑动事件

adb shell input swipe 900 500 100 500

从右往左滑动屏幕

adb shell input swipe 500 500 501 501 2000

模拟长按事件

其实就是在小的距离内,在较长的持续时间内进行滑动,最后表现出来的结果就是长按动作

screencap截图命令

adb shell screencap -p /sdcard/DCIM/screenTest.png

截屏图片,保存至 /sdcard/DCIM/ 目录下

screenrecord屏幕录制命令

adb shell screenrecord sdcard/record.mp4

执行命令后操作手机,ctrl + c 结束录制,录制视频保存至 sdcard目录下

uiautomator命令

执行 UI automation tests , 获取当前界面的控件信息

  • runtest:执行UI自动化测试

runtest是执行测试的关键命令,用来执行jar包的测试用例。

  • dump:获取控件信息

adb shell uiautomator dump

不加 [file] 选项时,默认存放在 sdcard 下

ime命令

运行 adb shell ime 可以获取到该命令的帮助信息。

adb shell ime list -s

列出设备上的输入法

C:\Users\mkcshwzx>adb shell ime list -s
com.iflytek.inputmethod/.FlyIME
com.sohu.inputmethod.sogou/.SogouIME
com.android.inputmethod.latin/.LatinIME
com.android.inputmethod.pinyin/.PinyinIME

adb shell ime set com.iflytek.inputmethod/.FlyIME

选择输入法

wm命令

获取设置设备屏幕分辨率,运行 adb shell wm 可以获取到该命令的帮助信息。

  • wm size  查看和设置显示分辨率

adb shell wm size

获取设备分辨率 

adb shell wm size 720*1080

将设备分辨率设置为720*1080

adb shell wm size reset

重置分辨率

  • wm density  查看和设置显示密度

adb shell wm density

查看当前显示密度

adb shell wm density 320

将显示密度设置为320

adb shell wm density reset

重置显示密度

  • wm overscan  设置显示区域,依次为左、上、右、下

adb shell wm overscan 100,200,300,400

设置显示区域

adb shell wm overscan reset

重置显示区域

monkey 命令

请参考官方文档:https://developer.android.com/studio/test/other-testing-tools/monkey?hl=zh-cn

运行adb shell monkey -help 输出简单的使用指南。

再此补充一个引号的用途:
场景1、在 PC 端执行 monkey 命令,将信息保存至 D 盘 monkey.log,会这么写:

adb shell monkey -p com.android.settings 5000 > D:\monkey.log

场景2、在 PC 端执行 monkey 命令,将信息保存至手机的 Sdcard,需要这么写:

adb shell "monkey -p com.android.settings 5000 > sdcard/monkey.log"

如果不加上引号肯定会报错,因为不加引号是写向了 PC 端当前目录的 sdcard 目录下,而非写向手机的 Sdcard。

settings命令

在settings中,settings get用来获取信息,settings put用来写入信息,运行adb shell settings 可以获取到该命令的帮助信息。

adb shell settings get system screen_brightness_mode

获取亮度是否为自动获取

adb shell settings get system screen_brightness

获取当前亮度值

adb shell settings put system screen_brightness 200

更改亮度值(亮度值在0—255之间)

adb shell settings get system screen_off_timeout

获取屏幕休眠时间

adb shell settings put system screen_off_timeout 1800000

更改休眠时间,30分钟

adb shell settings get global auto_time

获取日期时间选项中通过网络获取时间的状态,1为允许、0为不允许

adb shell settings put global auto_time 0

更改日期状态,从1改为0

adb shell settings get global adb_enabled

获取USB调试状态,1为开启、0为关闭

adb shell settings put global adb_enabled 1

更改USB调试状态,从0改为1

adb shell settings get global wifi_on

获取Wi-Fi开关状态,1为开启、0为关闭

adb shell svc wifi enable

开启Wi-Fi

adb shell svc wifi disable

关闭Wi-Fi

adb shell settings get secure android_id

获取Android_id

dumpsys命令

  • dumpsys,默认打印出当前系统所有 service 信息

adb shell dumpsys | findstr DUMP

在dumpsys后面可加上具体的服务名需要列出当前运行的服务

adb shell dumpsys display | findstr DisplayDeviceInfo

获取设备分辨率

adb shell dumpsys battery

获取设备电池信息

adb shell dumpsys cpuinfo

获取 cpu 信息

  • dumpsys meminfo

adb shell dumpsys meminfo

获取内存信息

adb shell dumpsys meminfo com.baidu.BaiduMap

后面加上包名,获取具体应用的内存信息

  • dumpsys activity  

adb shell dumpsys activity

获取 Activity 信息,加上-h可以获取帮助信息

adb shell dumpsys activity top

获取当前界面的UI信息

adb shell dumpsys activity top | findstr ACTIVITY

获取当前界面的Activity

  • dumpsys package

adb shell dumpsys package

获取 package 信息,加上-h可以获取帮助信息

adb shell dumpsys package com.baidu.BaiduMap

后面加上包名,获取某个包的信息

adb shell dumpsys notification

获取通知信息

adb shell dumpsys wifi

可以获取到当前连接的wifi名、搜索到的wifi列表、wifi强度等

adb shell dumpsys power

获取电源管理信息

adb shell dumpsys telephony.registry

获取电话信息

例如: mCallState值为0,表示待机状态、1表示来电未接听状态、2表示电话占线状态

mCallForwarding=false #是否启用呼叫转移

mDataConnectionState=2 #0:无数据连接 1:正在创建数据连接 2:已连接

mDataConnectionPossible=true #是否有数据连接

mDataConnectionApn= #APN名称 等

getprop命令

查看 Android 设备的参数信息,只运行 adb shell getprop,结果以 key : value 键值对的形式显示,如要获取某个 key 的值:

adb shell getprop ro.build.version.sdk

获取设备的 sdk 版本

adb shell getprop ro.product.model

查看设备型号

adb shell getprop ro.build.version.release

查看 Android 系统版本

adb -d shell getprop ro.product.brand

查看手机厂商名称

adb -d shell getprop ro.product.model

查看手机设备型号

adb shell getprop ro.build.version.incremental

查看版本号

其他命令

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

查看手机MAC地址

adb shell cat /proc/meminfo

查看手机内存信息

adb shell df

查看手机存储信息

adb shell tcpdump -i any -p -s 0 -w /data/123.pcap

抓取网络包

adb shell ip addr show wlan0

查看wlan0 (Wi-Fi) IP地址

Linux 命令

操作你的 Android 设备,常用到的命令,只列出,不详解!

cat、cd、chmod、cp、date、df、du、grep、kill、ln、ls、lsof、netstat、ping、ps、rm、rmdir、top、touch、重定向符号 ">" ">>"、管道 "|"

有些可能需要使用 busybox ,另外建议 windows 下 安装一个 Cygwin,百度百科 Cygwin

 

拜拜ヾ(•ω•`)o

有关Android 常用 adb 命令总结的更多相关文章

  1. ruby-on-rails - Rails 常用字符串(用于通知和错误信息等) - 2

    大约一年前,我决定确保每个包含非唯一文本的Flash通知都将从模块中的方法中获取文本。我这样做的最初原因是为了避免一遍又一遍地输入相同的字符串。如果我想更改措辞,我可以在一个地方轻松完成,而且一遍又一遍地重复同一件事而出现拼写错误的可能性也会降低。我最终得到的是这样的:moduleMessagesdefformat_error_messages(errors)errors.map{|attribute,message|"Error:#{attribute.to_s.titleize}#{message}."}enddeferror_message_could_not_find(obje

  2. ruby - 在 Ruby 中编写命令行实用程序 - 2

    我想用ruby​​编写一个小的命令行实用程序并将其作为gem分发。我知道安装后,Guard、Sass和Thor等某些gem可以从命令行自行运行。为了让gem像二进制文件一样可用,我需要在我的gemspec中指定什么。 最佳答案 Gem::Specification.newdo|s|...s.executable='name_of_executable'...endhttp://docs.rubygems.org/read/chapter/20 关于ruby-在Ruby中编写命令行实用程序

  3. ruby-on-rails - rbenv:从 RVM 移动到 rbenv 后,在 Jenkins 执行 shell 中找不到命令 - 2

    我从Ubuntu服务器上的RVM转移到rbenv。当我使用RVM时,使用bundle没有问题。转移到rbenv后,我在Jenkins的执行shell中收到“找不到命令”错误。我内爆并删除了RVM,并从~/.bashrc'中删除了所有与RVM相关的行。使用后我仍然收到此错误:rvmimploderm~/.rvm-rfrm~/.rvmrcgeminstallbundlerecho'exportPATH="$HOME/.rbenv/bin:$PATH"'>>~/.bashrcecho'eval"$(rbenvinit-)"'>>~/.bashrc.~/.bashrcrbenvversions

  4. SPI接收数据异常问题总结 - 2

    SPI接收数据左移一位问题目录SPI接收数据左移一位问题一、问题描述二、问题分析三、探究原理四、经验总结最近在工作在学习调试SPI的过程中遇到一个问题——接收数据整体向左移了一位(1bit)。SPI数据收发是数据交换,因此接收数据时从第二个字节开始才是有效数据,也就是数据整体向右移一个字节(1byte)。请教前辈之后也没有得到解决,通过在网上查阅前人经验终于解决问题,所以写一个避坑经验总结。实际背景:MCU与一款芯片使用spi通信,MCU作为主机,芯片作为从机。这款芯片采用的是它规定的六线SPI,多了两根线:RDY和INT,这样从机就可以主动请求主机给主机发送数据了。一、问题描述根据从机芯片手

  5. 安卓apk修改(Android反编译apk) - 2

    最近因为项目需要,需要将Android手机系统自带的某个系统软件反编译并更改里面某个资源,并重新打包,签名生成新的自定义的apk,下面我来介绍一下我的实现过程。APK修改,分为以下几步:反编译解包,修改,重打包,修改签名等步骤。安卓apk修改准备工作1.系统配置好JavaJDK环境变量2.需要root权限的手机(针对系统自带apk,其他软件免root)3.Auto-Sign签名工具4.apktool工具安卓apk修改开始反编译本文拿Android系统里面的Settings.apk做demo,具体如何将apk获取出来在此就不过多介绍了,直接进入主题:按键win+R输入cmd,打开命令窗口,并将路

  6. ruby - 从 Ruby : capturing the output while displaying the output? 运行 shell 命令 - 2

    我有一个问题。我想从另一个ruby​​脚本运行一个ruby​​脚本并捕获它的输出信息,同时让它也输出到屏幕。亚军#!/usr/bin/envrubyprint"Enteryourpassword:"password=gets.chompputs"Hereisyourpassword:#{password}"我运行的脚本文件:开始.rboutput=`runner`putsoutput.match(/Hereisyour(password:.*)/).captures[0].to_s正如您在此处看到的那样,存在问题。在start.rb的第一行,屏幕是空的。我在运行程序中看不到“输入您的密

  7. ruby - 是否有将图像文件转换为 ASCII 艺术的命令行程序或库? - 2

    有这样的事吗?我想在Ruby程序中使用它。 最佳答案 试试这个http://csl.sublevel3.org/jp2a/此外,Imagemagick可能还有一些东西 关于ruby-是否有将图像文件转换为ASCII艺术的命令行程序或库?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/6510445/

  8. ruby - 在 Ruby 的 if 语句中检查 bash 命令 - 2

    如何在Ruby的if语句中检查bash命令的返回值(true/false)。我想要这样的东西,if("/usr/bin/fswscell>/dev/null2>&1")has_afs="true"elsehas_afs="false"end它会提示以下错误含义,它总是返回true。(irb):5:warning:stringliteralincondition正确的语法是什么?更新:/usr/bin/fswscell寻找afs安装和运行状态。它会抛出这样的字符串,Thisworkstationbelongstocell如果afs没有运行,命令以状态1退出 最

  9. ruby - 可以正常中断的来自 Rake 的长时间运行的 shell 命令? - 2

    在几个项目中,我希望有一个类似rakeserver的rake任务,它将通过任何需要的方式开始为该应用程序提供服务。这是一个示例:task:serverdo%x{bundleexecrackup-p1234}end这行得通,但是当我准备停止它时,按Ctrl+c并没有正常关闭;它中断了Rake任务本身,它说rakeaborted!并给出堆栈跟踪。在某些情况下,我必须执行Ctrl+c两次。我可能可以用Signal.trap写一些东西来更优雅地中断它。有没有更简单的方法? 最佳答案 trap('SIGINT'){puts"Yourmessa

  10. ruby - Capistrano 中的执行、测试和捕获命令有什么区别? - 2

    关于SSHkit-Github它说:Allbackendssupporttheexecute(*args),test(*args)&capture(*args)来自SSHkit-Rubydoc,我明白execute实际上是test的别名?test之间有什么区别?,execute,capture在Capistrano/SSHKit中我应该什么时候使用? 最佳答案 执行只是执行命令。使用非0退出引发错误。测试方法的行为与execute完全相同,但是它返回bool值(true如果命令以0退出,而false否则)。它通常用于控制任务中的流程

随机推荐