ADB用法大全
转自:https://github.com/mzlogin/awesome-adb/blob/master/README.md ADB,即 Android Debug Bridge,它是 Android 开发/测试人员不可替代的强大工具,也是 Android 设备玩家的好玩具。 持续更新中,欢迎提 PR 和 Issue 补充指正,觉得有用的可以将 此 GitHub 仓库 Star 收藏备用。 注: 有部分命令的支持情况可能与 Android 系统版本及定制 ROM 的实现有关。 Table of Contents
基本用法命令语法adb 命令的基本语法如下: adb [-d|-e|-s <serialNumber>] <command>
如果只有一个设备/模拟器连接时,可以省略掉 为命令指定目标设备如果有多个设备/模拟器连接,则需要为命令指定目标设备。
在多个设备/模拟器连接的情况下较常用的是 $ adb devices
List of devices attached
cf264b8f device
emulator-5554 device
10.129.164.6:5555 device
输出里的 比如这时想指定 adb -s cf264b8f shell wm size
又如想给 adb -s 10.129.164.6:5555 install test.apk
遇到多设备/模拟器的情况均使用这几个参数为命令指定目标设备,下文中为简化描述,不再重复。 启动/停止启动 adb server 命令: adb start-server
(一般无需手动执行此命令,在运行 adb 命令时若发现 adb server 没有启动会自动调起。) 停止 adb server 命令: adb kill-server
查看 adb 版本命令: adb version
示例输出: Android Debug Bridge version 1.0.36
Revision 8f855a3d9b35-android
以 root 权限运行 adbdadb 的运行原理是 PC 端的 adb server 与手机端的守护进程 adbd 建立连接,然后 PC 端的 adb client 通过 adb server 转发命令,adbd 接收命令后解析运行。 所以如果 adbd 以普通权限执行,有些需要 root 权限才能执行的命令无法直接用 命令: adb root 正常输出: restarting adbd as root
现在再运行 有些手机 root 后也无法通过 相应地,如果要恢复 adbd 为非 root 权限的话,可以使用 指定 adb server 的网络端口命令: adb -P <port> start-server
默认端口为 5037。 设备连接管理查询已连接设备/模拟器命令: adb devices 输出示例: List of devices attached
cf264b8f device
emulator-5554 device
10.129.164.6:5555 device
输出格式为
以上输出显示当前已经连接了三台设备/模拟器, 常见异常输出:
USB 连接通过 USB 连接来正常使用 adb 需要保证几点:
无线连接(需要借助 USB 线)除了可以通过 USB 连接设备与电脑来使用 adb,也可以通过无线连接——虽然连接过程中也有需要使用 USB 的步骤,但是连接成功之后你的设备就可以在一定范围内摆脱 USB 连接线的限制啦! 操作步骤:
如果连接不了,请确认 Android 设备与电脑是连接到了同一个 WiFi,然后再次执行 如果还是不行的话,通过 断开无线连接 命令: adb disconnect <device-ip-address>
无线连接(无需借助 USB 线)注:需要 root 权限。 上一节「无线连接(需要借助 USB 线)」是官方文档里介绍的方法,需要借助于 USB 数据线来实现无线连接。 既然我们想要实现无线连接,那能不能所有步骤下来都是无线的呢?答案是能的。
节注一: 有的设备,比如小米 5S + MIUI 8.0 + Android 6.0.1 MXB48T,可能在第 5 步之前需要重启 adbd 服务,在设备的终端模拟器上运行: restart adbd 如果 restart 无效,尝试以下命令: stop adbd
start adbd
应用管理查看应用列表查看应用列表的基本命令格式是 adb shell pm list packages [-f] [-d] [-e] [-s] [-3] [-i] [-u] [--user USER_ID] [FILTER]
即在
所有应用命令: adb shell pm list packages
输出示例: package:com.android.smoketest
package:com.example.android.livecubes
package:com.android.providers.telephony
package:com.google.android.googlequicksearchbox
package:com.android.providers.calendar
package:com.android.providers.media
package:com.android.protips
package:com.android.documentsui
package:com.android.gallery
package:com.android.externalstorage
...
// other packages here
...
系统应用命令: adb shell pm list packages -s
第三方应用命令: adb shell pm list packages -3
包名包含某字符串的应用比如要查看包名包含字符串 adb shell pm list packages mazhuang
当然也可以使用 grep 来过滤: adb shell pm list packages | grep mazhuang
安装 APK命令格式: adb install [-lrtsdg] <path_to_apk>
参数:
运行命令后如果见到类似如下输出(状态为 [100%] /data/local/tmp/1.apk
pkg: /data/local/tmp/1.apk
Success
上面是当前最新版 v1.0.36 的 adb 的输出,会显示 push apk 文件到手机的进度百分比。 使用旧版本 adb 的输出则是这样的: 12040 KB/s (22205609 bytes in 1.801s)
pkg: /data/local/tmp/SogouInput_android_v8.3_sweb.apk
Success
而如果状态为 [100%] /data/local/tmp/map-20160831.apk
pkg: /data/local/tmp/map-20160831.apk
Failure [INSTALL_FAILED_ALREADY_EXISTS]
常见安装失败输出代码、含义及可能的解决办法如下:
参考:PackageManager.java
所以,必要的时候也可以根据这个步骤,手动分步执行安装过程。 卸载应用命令: adb uninstall [-k] <packagename>
命令示例: adb uninstall com.qihoo360.mobilesafe
表示卸载 360 手机卫士。 清除应用数据与缓存命令: adb shell pm clear <packagename>
命令示例: adb shell pm clear com.qihoo360.mobilesafe
表示清除 360 手机卫士的数据和缓存。 查看前台 Activity命令: adb shell dumpsys activity activities | grep mFocusedActivity
输出示例: mFocusedActivity: ActivityRecord{8079d7e u0 com.cyanogenmod.trebuchet/com.android.launcher3.Launcher t42}
其中的 查看正在运行的 Services命令: adb shell dumpsys activity services [<packagename>]
查看应用详细信息命令: adb shell dumpsys package <packagename>
输出中包含很多信息,包括 Activity Resolver Table、Registered ContentProviders、包名、userId、安装后的文件资源代码等路径、版本信息、权限信息和授予状态、签名版本信息等。
输出示例: Activity Resolver Table:
Non-Data Actions:
android.intent.action.MAIN:
5b4cba8 org.mazhuang.guanggoo/.SplashActivity filter 5ec9dcc
Action: "android.intent.action.MAIN"
Category: "android.intent.category.LAUNCHER"
AutoVerify=false
Registered ContentProviders:
org.mazhuang.guanggoo/com.tencent.bugly.beta.utils.BuglyFileProvider:
Provider{7a3c394 org.mazhuang.guanggoo/com.tencent.bugly.beta.utils.BuglyFileProvider}
ContentProvider Authorities:
[org.mazhuang.guanggoo.fileProvider]:
Provider{7a3c394 org.mazhuang.guanggoo/com.tencent.bugly.beta.utils.BuglyFileProvider}
applicationInfo=ApplicationInfo{7754242 org.mazhuang.guanggoo}
Key Set Manager:
[org.mazhuang.guanggoo]
Signing KeySets: 501
Packages:
Package [org.mazhuang.guanggoo] (c1d7f):
userId=10394
pkg=Package{55f714c org.mazhuang.guanggoo}
codePath=/data/app/org.mazhuang.guanggoo-2
resourcePath=/data/app/org.mazhuang.guanggoo-2
legacyNativeLibraryDir=/data/app/org.mazhuang.guanggoo-2/lib
primaryCpuAbi=null
secondaryCpuAbi=null
versionCode=74 minSdk=15 targetSdk=25
versionName=1.1.74
splits=[base]
apkSigningVersion=2
applicationInfo=ApplicationInfo{7754242 org.mazhuang.guanggoo}
flags=[ HAS_CODE ALLOW_CLEAR_USER_DATA ALLOW_BACKUP ]
privateFlags=[ RESIZEABLE_ACTIVITIES ]
dataDir=/data/user/0/org.mazhuang.guanggoo
supportsScreens=[small,medium,large,xlarge,resizeable,anyDensity]
timeStamp=2017-10-22 23:50:53
firstInstallTime=2017-10-22 23:50:25
lastUpdateTime=2017-10-22 23:50:55
installerPackageName=com.miui.packageinstaller
signatures=PackageSignatures{af09595 [53c7caa2]}
installPermissionsFixed=true installStatus=1
pkgFlags=[ HAS_CODE ALLOW_CLEAR_USER_DATA ALLOW_BACKUP ]
requested permissions:
android.permission.READ_PHONE_STATE
android.permission.INTERNET
android.permission.ACCESS_NETWORK_STATE
android.permission.ACCESS_WIFI_STATE
android.permission.READ_LOGS
android.permission.WRITE_EXTERNAL_STORAGE
android.permission.READ_EXTERNAL_STORAGE
install permissions:
android.permission.INTERNET: granted=true
android.permission.ACCESS_NETWORK_STATE: granted=true
android.permission.ACCESS_WIFI_STATE: granted=true
User 0: ceDataInode=1155675 installed=true hidden=false suspended=false stopped=true notLaunched=false enabled=0
gids=[3003]
runtime permissions:
android.permission.READ_EXTERNAL_STORAGE: granted=true
android.permission.READ_PHONE_STATE: granted=true
android.permission.WRITE_EXTERNAL_STORAGE: granted=true
User 999: ceDataInode=0 installed=false hidden=false suspended=false stopped=true notLaunched=true enabled=0
gids=[3003]
runtime permissions:
Dexopt state:
[org.mazhuang.guanggoo]
Instruction Set: arm64
path: /data/app/org.mazhuang.guanggoo-2/base.apk
status: /data/app/org.mazhuang.guanggoo-2/oat/arm64/base.odex [compilation_filter=speed-profile,status=kOatUpToDa
te]
与应用交互主要是使用
用于决定 intent 对象的选项如下:
调起 Activity命令格式: adb shell am start [options] <INTENT>
例如: adb shell am start -n com.tencent.mm/.ui.LauncherUI
表示调起微信主界面。 adb shell am start -n org.mazhuang.boottimemeasure/.MainActivity --es "toast" "hello,world"
表示调起 调起 Service命令格式: adb shell am startservice [options] <INTENT>
例如: adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService
表示调起微信的某 Service。 发送广播命令格式: adb shell am broadcast [options] <INTENT>
可以向所有组件广播,也可以只向指定组件广播。 例如,向所有组件广播 adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
又例如,只向 adb shell am broadcast -a android.intent.action.BOOT_COMPLETED -n org.mazhuang.boottimemeasure/.BootCompletedReceiver
这类用法在测试的时候很实用,比如某个广播的场景很难制造,可以考虑通过这种方式来发送广播。 既能发送系统预定义的广播,也能发送自定义广播。如下是部分系统预定义广播及正常触发时机:
(以上广播均可使用 adb 触发) 强制停止应用命令: adb shell am force-stop <packagename>
命令示例: adb shell am force-stop com.qihoo360.mobilesafe
表示停止 360 安全卫士的一切进程与服务。 文件管理复制设备里的文件到电脑命令: adb pull <设备里的文件路径> [电脑上的目录]
其中 例: adb pull /sdcard/sr.mp4 ~/tmp/
小技巧:设备上的文件路径可能需要 root 权限才能访问,如果你的设备已经 root 过,可以先使用 复制电脑里的文件到设备命令: adb push <电脑上的文件路径> <设备里的目录>
例: adb push ~/sr.mp4 /sdcard/
小技巧:设备上的文件路径普通权限可能无法直接写入,如果你的设备已经 root 过,可以先 模拟按键/输入在
Usage: input [<source>] <command> [<arg>...]
The sources are:
mouse
keyboard
joystick
touchnavigation
touchpad
trackball
stylus
dpad
gesture
touchscreen
gamepad
The commands and default sources are:
text <string> (Default: touchscreen)
keyevent [--longpress] <key code number or name> ... (Default: keyboard)
tap <x> <y> (Default: touchscreen)
swipe <x1> <y1> <x2> <y2> [duration(ms)] (Default: touchscreen)
press (Default: trackball)
roll <dx> <dy> (Default: trackball)
比如使用
下面是 电源键命令: adb shell input keyevent 26
执行效果相当于按电源键。 菜单键命令: adb shell input keyevent 82
HOME 键命令: adb shell input keyevent 3
返回键命令: adb shell input keyevent 4
音量控制增加音量: adb shell input keyevent 24
降低音量: adb shell input keyevent 25
静音: adb shell input keyevent 164
媒体控制播放/暂停: adb shell input keyevent 85
停止播放: adb shell input keyevent 86
播放下一首: adb shell input keyevent 87
播放上一首: adb shell input keyevent 88
恢复播放: adb shell input keyevent 126
暂停播放: adb shell input keyevent 127
点亮/熄灭屏幕可以通过上文讲述过的模拟电源键来切换点亮和熄灭屏幕,但如果明确地想要点亮或者熄灭屏幕,那可以使用如下方法。 点亮屏幕: adb shell input keyevent 224
熄灭屏幕: adb shell input keyevent 223
滑动解锁如果锁屏没有密码,是通过滑动手势解锁,那么可以通过 命令(参数以机型 Nexus 5,向上滑动手势解锁举例): adb shell input swipe 300 1000 300 500
参数 输入文本在焦点处于某文本框时,可以通过 命令: adb shell input text hello
现在 查看日志Android 系统的日志分为两部分,底层的 Linux 内核日志输出到 /proc/kmsg,Android 的日志输出到 /dev/log。 Android 日志命令格式: [adb] logcat [<option>] ... [<filter-spec>] ...
常用用法列举如下: 按级别过滤日志Android 的日志分为如下几个优先级(priority):
按某级别过滤日志则会将该级别及以上的日志输出。 比如,命令: adb logcat *:W
会将 Warning、Error、Fatal 和 Silent 日志输出。 (注: 在 macOS 下需要给 按 tag 和级别过滤日志
比如,命令: adb logcat ActivityManager:I MyApp:D *:S
表示输出 tag 日志格式可以用 日志支持按以下几种
指定格式可与上面的过滤同时使用。比如: adb logcat -v long ActivityManager:I *:S
清空日志adb logcat -c
内核日志命令: adb shell dmesg
输出示例: <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 getprop ro.product.model
输出示例: Nexus 5 电池状况命令: adb shell dumpsys battery
输入示例: Current Battery Service state:
AC powered: false
USB powered: true
Wireless powered: false
status: 2
health: 2
present: true
level: 44
scale: 100
voltage: 3872
temperature: 280
technology: Li-poly
其中 屏幕分辨率命令: adb shell wm size
输出示例: Physical size: 1080x1920
该设备屏幕分辨率为 1080px * 1920px。 如果使用命令修改过,那输出可能是: Physical size: 1080x1920
Override size: 480x1024
表明设备的屏幕分辨率原本是 1080px * 1920px,当前被修改为 480px * 1024px。 屏幕密度命令: adb shell wm density
输出示例: Physical density: 420 该设备屏幕密度为 420dpi。 如果使用命令修改过,那输出可能是: Physical density: 480
Override density: 160
表明设备的屏幕密度原来是 480dpi,当前被修改为 160dpi。 显示屏参数命令: adb shell dumpsys window displays
输出示例: WINDOW MANAGER DISPLAY CONTENTS (dumpsys window displays)
Display: mDisplayId=0
init=1080x1920 420dpi cur=1080x1920 app=1080x1794 rng=1080x1017-1810x1731
deferred=false layoutNeeded=false
其中 android_id命令: adb shell settings get secure android_id
输出示例: 51b6be48bac8c569 IMEI在 Android 4.4 及以下版本可通过如下命令获取 IMEI: adb shell dumpsys iphonesubinfo
输出示例: Phone Subscriber Info: Phone Type = GSM Device ID = 860955027785041
其中的 而在 Android 5.0 及以上版本里这个命令输出为空,得通过其它方式获取了(需要 root 权限): adb shell
su
service call iphonesubinfo 1
输出示例: Result: Parcel(
0x00000000: 00000000 0000000f 00360038 00390030 '........8.6.0.9.'
0x00000010: 00350035 00320030 00370037 00350038 '5.5.0.2.7.7.8.5.'
0x00000020: 00340030 00000031 '0.4.1... ')
把里面的有效内容提取出来就是 IMEI 了,比如这里的是 参考:adb shell dumpsys iphonesubinfo not working since Android 5.0 Lollipop Android 系统版本命令: adb shell getprop ro.build.version.release
输出示例: 5.0.2 IP 地址每次想知道设备的 IP 地址的时候都得「设置」-「关于手机」-「状态信息」-「IP地址」很烦对不对?通过 adb 可以方便地查看。 命令: adb shell ifconfig | grep Mask
输出示例: inet addr:10.130.245.230 Mask:255.255.255.252
inet addr:127.0.0.1 Mask:255.0.0.0
那么 在有的设备上这个命令没有输出,如果设备连着 WiFi,可以使用如下命令来查看局域网 IP: adb shell ifconfig wlan0
输出示例: wlan0: ip 10.129.160.99 mask 255.255.240.0 flags [up broadcast running multicast]
或 wlan0 Link encap:UNSPEC
inet addr:10.129.168.57 Bcast:10.129.175.255 Mask:255.255.240.0
inet6 addr: fe80::66cc:2eff:fe68:b6b6/64 Scope: Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:496520 errors:0 dropped:0 overruns:0 frame:0
TX packets:68215 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:3000
RX bytes:116266821 TX bytes:8311736
如果以上命令仍然不能得到期望的信息,那可以试试以下命令(部分系统版本里可用): adb shell netcfg
输出示例: wlan0 UP 10.129.160.99/20 0x00001043 f8:a9:d0:17:42:4d
lo UP 127.0.0.1/8 0x00000049 00:00:00:00:00:00
p2p0 UP 0.0.0.0/0 0x00001003 fa:a9:d0:17:42:4d
sit0 DOWN 0.0.0.0/0 0x00000080 00:00:00:00:00:00
rmnet0 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
rmnet1 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
rmnet3 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
rmnet2 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
rmnet4 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
rmnet6 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
rmnet5 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
rmnet7 DOWN 0.0.0.0/0 0x00000000 00:00:00:00:00:00
rev_rmnet3 DOWN 0.0.0.0/0 0x00001002 4e:b7:e4:2e:17:58
rev_rmnet2 DOWN 0.0.0.0/0 0x00001002 4e:f0:c8:bf:7a:cf
rev_rmnet4 DOWN 0.0.0.0/0 0x00001002 a6:c0:3b:6b:c4:1f
rev_rmnet6 DOWN 0.0.0.0/0 0x00001002 66:bb:5d:64:2e:e9
rev_rmnet5 DOWN 0.0.0.0/0 0x00001002 0e:1b:eb:b9:23:a0
rev_rmnet7 DOWN 0.0.0.0/0 0x00001002 7a:d9:f6:81:40:5a
rev_rmnet8 DOWN 0.0.0.0/0 0x00001002 4e:e2:a9:bb:d0:1b
rev_rmnet0 DOWN 0.0.0.0/0 0x00001002 fe:65:d0:ca:82:a9
rev_rmnet1 DOWN 0.0.0.0/0 0x00001002 da:d8:e8:4f:2e:fe
可以看到网络连接名称、启用状态、IP 地址和 Mac 地址等信息。 Mac 地址命令: adb shell cat /sys/class/net/wlan0/address
输出示例: f8:a9:d0:17:42:4d
这查看的是局域网 Mac 地址,移动网络或其它连接的信息可以通过前面的小节「IP 地址」里提到的 CPU 信息命令: adb shell cat /proc/cpuinfo
输出示例: Processor : ARMv7 Processor rev 0 (v7l)
processor : 0
BogoMIPS : 38.40
processor : 1
BogoMIPS : 38.40
processor : 2
BogoMIPS : 38.40
processor : 3
BogoMIPS : 38.40
Features : swp half thumb fastmult vfp edsp neon vfpv3 tls vfpv4 idiva idivt
CPU implementer : 0x51
CPU architecture: 7
CPU variant : 0x2
CPU part : 0x06f
CPU revision : 0
Hardware : Qualcomm MSM 8974 HAMMERHEAD (Flattened Device Tree)
Revision : 000b
Serial : 0000000000000000
这是 Nexus 5 的 CPU 信息,我们从输出里可以看到使用的硬件是 内存信息命令: adb shell cat /proc/meminfo
输出示例: MemTotal: 1027424 kB
MemFree: 486564 kB
Buffers: 15224 kB
Cached: 72464 kB
SwapCached: 24152 kB
Active: 110572 kB
Inactive: 259060 kB
Active(anon): 79176 kB
Inactive(anon): 207736 kB
Active(file): 31396 kB
Inactive(file): 51324 kB
Unevictable: 3948 kB
Mlocked: 0 kB
HighTotal: 409600 kB
HighFree: 132612 kB
LowTotal: 617824 kB
LowFree: 353952 kB
SwapTotal: 262140 kB
SwapFree: 207572 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 265324 kB
Mapped: 47072 kB
Shmem: 1020 kB
Slab: 57372 kB
SReclaimable: 7692 kB
SUnreclaim: 49680 kB
KernelStack: 4512 kB
PageTables: 5912 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 775852 kB
Committed_AS: 13520632 kB
VmallocTotal: 385024 kB
VmallocUsed: 61004 kB
VmallocChunk: 209668 kB
其中, 更多硬件与系统属性设备的更多硬件与系统属性可以通过如下命令查看: adb shell cat /system/build.prop
这会输出很多信息,包括前面几个小节提到的「型号」和「Android 系统版本」等。 输出里还包括一些其它有用的信息,它们也可通过
节注一: 一些小厂定制的 ROM 可能修改过 CPU 支持的 abi 列表的属性名,如果用 adb shell cat /system/build.prop | grep ro.product.cpu.abi
示例输出: ro.product.cpu.abi=armeabi-v7a
ro.product.cpu.abi2=armeabi
修改设置注: 修改设置之后,运行恢复命令有可能显示仍然不太正常,可以运行 修改设置的原理主要是通过 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db 里存放的设置值。 分辨率命令: adb shell wm size 480x1024
表示将分辨率修改为 480px * 1024px。 恢复原分辨率命令: adb shell wm size reset
屏幕密度命令: adb shell wm density 160
表示将屏幕密度修改为 160dpi。 恢复原屏幕密度命令: adb shell wm density reset
显示区域命令: adb shell wm overscan 0,0,200
四个数字分别表示距离左、上、右、下边缘的留白像素,以上命令表示将屏幕底部 200px 留白。 恢复原显示区域命令: adb shell wm overscan reset
关闭 USB 调试模式命令: adb shell settings put global adb_enabled 0
恢复: 用命令恢复不了了,毕竟关闭了 USB 调试 adb 就连接不上 Android 设备了。 去设备上手动恢复吧:「设置」-「开发者选项」-「Android 调试」。 状态栏和导航栏的显示隐藏本节所说的相关设置对应 Cyanogenmod 里的「扩展桌面」。 命令: adb shell settings put global policy_control <key-values>
这些键对应的值可则如下值用逗号组合:
例如: adb shell settings put global policy_control immersive.full=*
表示设置在所有界面下都同时隐藏状态栏和导航栏。 adb shell settings put global policy_control immersive.status=com.package1,com.package2:immersive.navigation=apps,-com.package3
表示设置在包名为 实用功能屏幕截图截图保存到电脑: adb exec-out screencap -p > sc.png
如果 adb 版本较老,无法使用 先截图保存到设备里: adb shell screencap -p /sdcard/sc.png
然后将 png 文件导出到电脑: adb pull /sdcard/sc.png
可以使用
实测如果指定文件名以 另外一种一行命令截图并保存到电脑的方法: Linux 和 Windows adb shell screencap -p | sed "s/r$//" > sc.png
Mac OS X adb shell screencap -p | gsed "s/r$//" > sc.png
这个方法需要用到 gnu sed 命令,在 Linux 下直接就有,在 Windows 下 Git 安装目录的 bin 文件夹下也有。如果确实找不到该命令,可以下载 sed for Windows 并将 sed.exe 所在文件夹添加到 PATH 环境变量里。 而在 Mac 下使用系统自带的 sed 命令会报错: sed: RE error: illegal byte sequence
需要安装 gnu-sed,然后使用 gsed 命令: brew install gnu-sed
录制屏幕录制屏幕以 mp4 格式保存到 /sdcard: adb shell screenrecord /sdcard/filename.mp4
需要停止时按 Ctrl-C,默认录制时间和最长录制时间都是 180 秒。 如果需要导出到电脑: adb pull /sdcard/filename.mp4
可以使用
重新挂载 system 分区为可写注:需要 root 权限。 /system 分区默认挂载为只读,但有些操作比如给 Android 系统添加命令、删除自带应用等需要对 /system 进行写操作,所以需要重新挂载它为可读写。 步骤:
如果输出没有提示错误的话,操作就成功了,可以对 /system 下的文件为所欲为了。 查看连接过的 WiFi 密码注:需要 root 权限。 命令: adb shell
su
cat /data/misc/wifi/*.conf
输出示例: network={
ssid="TP-LINK_9DFC"
scan_ssid=1
psk="123456789"
key_mgmt=WPA-PSK
group=CCMP TKIP
auth_alg=OPEN
sim_num=1
priority=13893
}
network={
ssid="TP-LINK_F11E"
psk="987654321"
key_mgmt=WPA-PSK
sim_num=1
priority=17293
}
设置系统日期和时间注:需要 root 权限。 命令: adb shell
su
date -s 20160823.131500
表示将系统日期和时间更改为 2016 年 08 月 23 日 13 点 15 分 00 秒。 重启手机命令: adb reboot 检测设备是否已 root命令: adb shell
su
此时命令行提示符是 使用 Monkey 进行压力测试Monkey 可以生成伪随机用户事件来模拟单击、触摸、手势等操作,可以对正在开发中的程序进行随机压力测试。 简单用法: adb shell monkey -p <packagename> -v 500
表示向 Monkey 的详细用法参考 官方文档。 开启/关闭 WiFi注:需要 root 权限。 有时需要控制设备的 WiFi 状态,可以用以下指令完成。 开启 WiFi: adb root
adb shell svc wifi enable
关闭 WiFi: adb root
adb shell svc wifi disable
若执行成功,输出为空;若未取得 root 权限执行此命令,将执行失败,输出 刷机相关命令重启到 Recovery 模式命令: adb reboot recovery 从 Recovery 重启到 Android命令: adb reboot 重启到 Fastboot 模式命令: adb reboot bootloader 通过 sideload 更新系统如果我们下载了 Android 设备对应的系统更新包到电脑上,那么也可以通过 adb 来完成更新。 以 Recovery 模式下更新为例:
安全相关命令启用/禁用 SELinux启用 SELinux adb root
adb shell setenforce 1
禁用 SELinux adb root
adb shell setenforce 0
启用/禁用 dm_verity启用 dm_verity adb root
adb enable-verity
禁用 dm_verity adb root
adb disable-verity
更多 adb shell 命令Android 系统是基于 Linux 内核的,所以 Linux 里的很多命令在 Android 里也有相同或类似的实现,在 查看进程命令: adb shell ps
输出示例: USER PID PPID VSIZE RSS WCHAN PC NAME
root 1 0 8904 788 ffffffff 00000000 S /init
root 2 0 0 0 ffffffff 00000000 S kthreadd
...
u0_a71 7779 5926 1538748 48896 ffffffff 00000000 S com.sohu.inputmethod.sogou:classic
u0_a58 7963 5926 1561916 59568 ffffffff 00000000 S org.mazhuang.boottimemeasure
...
shell 8750 217 10640 740 00000000 b6f28340 R ps
各列含义:
查看实时资源占用情况命令: adb shell top
输出示例: User 0%,System 6%,IOW 0%,IRQ 0%
User 3 + Nice 0 + Sys 21 + Idle 280 + IOW 0 + IRQ 0 + SIRQ 3 = 307
PID PR CPU% S #THR VSS RSS PCY UID Name
8763 0 3% R 1 10640K 1064K fg shell top
131 0 3% S 1 0K 0K fg root dhd_dpc
6144 0 0% S 115 1682004K 115916K fg system system_server
132 0 0% S 1 0K 0K fg root dhd_rxf
1731 0 0% S 6 20288K 788K fg root /system/bin/mpdecision
217 0 0% S 6 18008K 356K fg shell /sbin/adbd
...
7779 2 0% S 19 1538748K 48896K bg u0_a71 com.sohu.inputmethod.sogou:classic
7963 0 0% S 18 1561916K 59568K fg u0_a58 org.mazhuang.boottimemeasure
...
各列含义:
Usage: top [ -m max_procs ] [ -n iterations ] [ -d delay ] [ -s sort_column ] [ -t ] [ -h ]
-m num 最多显示多少个进程 -n num 刷新多少次后退出 -d num 刷新时间间隔(单位秒,默认值 5) -s col 按某列排序(可用 col 值:cpu,vss,rss,thr) -t 显示线程信息 -h 显示帮助文档
查看进程 UID有两种方案:
其它如下是其它常用命令的简单描述,前文已经专门讲过的命令不再额外说明:
常见问题启动 adb server 失败出错提示 error: protocol fault (couldn't read status): No error
可能原因 adb server 进程想使用的 5037 端口被占用。 解决方案 找到占用 5037 端口的进程,然后终止它。以 Windows 下为例: netstat -ano | findstr LISTENING
...
TCP 0.0.0.0:5037 0.0.0.0:0 LISTENING 1548
...
这里 1548 即为进程 ID,用命令结束该进程: taskkill /PID 1548
然后再启动 adb 就没问题了。 com.android.ddmlib.AdbCommandRejectedException在 Android Studio 里新建一个模拟器,但是用 adb 一直连接不上,提示: com.android.ddmlib.AdbCommandRejectedException: device unauthorized.
This adb server's $ADB_VENDOR_KEYS is not set Try 'adb kill-server' if that seems wrong. Otherwise check for a confirmation dialog on your device.
在手机上安装一个终端然后执行 su 提示没有该命令,这不正常。 于是删除该模拟器后重新下载安装一次,这次就正常了。 adb 的非官方实现
致谢感谢朋友们无私的分享与补充(排名不分先后)。 zxning,linhua55,codeskyblue,seasonyuu,fan123199,zhEdward,0x8BADFOOD,keith666666,shawnlinboy。 参考链接
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |