以下是常见的一些adb命令:
adb start-server 开启
adb kill-server 关闭
adb devices 查看设备连接情况
adb [-d|-e|-s ]
-d 指定当前唯一通过 USB 连接的 Android 设备为命令目标
-e 指定当前唯一运行的模拟器为命令目标
-s [seriaNumber] 指定相应seriaNumber号的设备为命令目标
adb -s NLMR480179 install xxx.apk 给NLMR480179安装xxx软件
adb root 让adb以root权限执行,命令提示符变成#
adb unroot 恢复adb为非root权限,命令提示符变成$
后面的命令都是在指定设备上操作,因此一般省略-s命令符:
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 -s 查看系统应用
adb shell pm list packages -3 查看第三方应用
adb shell pm list packages motorola 查看包名字符串含有motorola的应用
当然也可以使用 grep 来过滤:
adb shell “pm list packages | grep motorola”
adb install [-lrtsdg] <path_to_apk>
adb install 后面可以跟一些可选参数来控制安装 APK 的行为,可用参数及含义如下:
参数 含义
-l 将应用安装到保护目录 /mnt/asec
-r 允许覆盖安装
-t 允许安装 AndroidManifest.xml 里 application 指定 android:testOnly="true" 的应用
-s 将应用安装到 sdcard
-d 允许降级覆盖安装
-g 授予所有运行时权限
adb install 内部原理简介
adb install 实际是分三步完成:
push apk 文件到 /data/local/tmp。
调用 pm install 安装。
删除 /data/local/tmp 下的对应 apk 文件。
所以,必要的时候也可以根据这个步骤,手动分步执行安装过程。
强制停止应用:
adb shell am force-stop <packagename> 停止指定应用的一切进程与服务。
adb uninstall com.xxx.xxx 卸载指定包名的应用程序
adb shell pm clear <packagename> 清除应用数据与缓存,这条命令的效果相当于
在设置里的应用信息界面点击了「清除缓存」和「清除数据」。
查看正在运行的 Services:
adb shell dumpsys activity services [<packagename>]
adb shell dumpsys activity services com.mobivans.onestrokecharge
查看应用详细信息:
adb shell dumpsys package <packagename>
输出中包含很多信息,包括 Activity Resolver Table、Registered ContentProviders、包名、
userId、安装后的文件资源代码等路径、版本信息、权限信息和授予状态、签名版本信息等。
与应用交互:
注意:当组件没有intent-filter时exported 属性默认为false,此组件只能由本应用用户访问,配备了intent-filter后此值改变为true,允许外部调用。否则会遇到am命令会报权限拒绝错误
主要是使用 am <command> 命令,常用的 <command> 如下:
command 用途
start [options] <INTENT> 启动 <INTENT> 指定的 Activity
startservice [options] <INTENT> 启动 <INTENT> 指定的 Service
broadcast [options] <INTENT> 发送 <INTENT> 指定的广播
force-stop <packagename> 停止 <packagename> 相关的进程
<INTENT> 参数很灵活,和写 Android 程序时代码里的 Intent 相对应。
用于决定 intent 对象的选项如下:
参数 含义
-a <ACTION> 指定 action,比如 android.intent.action.VIEW
-c <CATEGORY> 指定 category,比如 android.intent.category.APP_CONTACTS
-n <COMPONENT> 指定完整 component 名,用于明确指定启动哪个 Activity,如 com.example.app/.ExampleActivity
<INTENT> 里还能带数据,就像写代码时的 Bundle 一样:
参数 含义
--esn <EXTRA_KEY> null 值(只有 key 名)
`-e –es <EXTRA_KEY> <EXTRA_STRING_VALUE>`
--ez <EXTRA_KEY> <EXTRA_BOOLEAN_VALUE> boolean 值
--ei <EXTRA_KEY> <EXTRA_INT_VALUE> integer 值
--el <EXTRA_KEY> <EXTRA_LONG_VALUE> long 值
--ef <EXTRA_KEY> <EXTRA_FLOAT_VALUE> float 值
--eu <EXTRA_KEY> <EXTRA_URI_VALUE> URI
--ecn <EXTRA_KEY> <EXTRA_COMPONENT_NAME_VALUE> component name
--eia <EXTRA_KEY> <EXTRA_INT_VALUE>[,<EXTRA_INT_VALUE...] integer 数组
--ela <EXTRA_KEY> <EXTRA_LONG_VALUE>[,<EXTRA_LONG_VALUE...] long 数组
调起 Activity:
命令格式:
adb shell am start [options] <INTENT>
例如:
表示调起微信主界面:adb shell am start -n com.tencent.mm/.ui.LauncherUI
表示调起 org.mazhuang.boottimemeasure/.MainActivity 并传给它 string 数据键值对 toast - hello, world:
adb shell am start -n org.mazhuang.boottimemeasure/.MainActivity --es "toast" "hello, world"
调起 Service:
命令格式:adb shell am startservice [options] <INTENT>
表示调起微信的某 Service:
adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService
发送广播:
命令格式:adb shell am broadcast [options] <INTENT>
例如,向所有组件广播 BOOT_COMPLETED:
adb shell am broadcast -a android.intent.action.BOOT_COMPLETED
如下是部分系统预定义广播及正常触发时机:
action 触发时机
android.net.conn.CONNECTIVITY_CHANGE 网络连接发生变化
android.intent.action.SCREEN_ON 屏幕点亮
android.intent.action.SCREEN_OFF 屏幕熄灭
android.intent.action.BATTERY_LOW 电量低,会弹出电量低提示框
android.intent.action.BATTERY_OKAY 电量恢复了
android.intent.action.BOOT_COMPLETED 设备启动完毕
android.intent.action.DEVICE_STORAGE_LOW 存储空间过低
android.intent.action.DEVICE_STORAGE_OK 存储空间恢复
android.intent.action.PACKAGE_ADDED 安装了新的应用
android.net.wifi.STATE_CHANGE WiFi 连接状态发生变化
android.net.wifi.WIFI_STATE_CHANGED WiFi 状态变为启用/关闭/正在启动/正在关闭/未知
android.intent.action.BATTERY_CHANGED 电池电量发生变化
android.intent.action.INPUT_METHOD_CHANGED 系统输入法发生变化
android.intent.action.ACTION_POWER_CONNECTED 外部电源连接
android.intent.action.ACTION_POWER_DISCONNECTED 外部电源断开连接
android.intent.action.DREAMING_STARTED 系统开始休眠
android.intent.action.DREAMING_STOPPED 系统停止休眠
android.intent.action.WALLPAPER_CHANGED 壁纸发生变化
android.intent.action.HEADSET_PLUG 插入耳机
android.intent.action.MEDIA_UNMOUNTED 卸载外部介质
android.intent.action.MEDIA_MOUNTED 挂载外部介质
android.os.action.POWER_SAVE_MODE_CHANGED 省电模式开启
查看设备信息:
查看手机型号:adb shell getprop ro.product.model
查看电池情况:adb shell dumpsys battery
查看屏幕分辨率:adb shell wm size
查看屏幕密度:adb shell wm density
显示屏参数:adb shell dumpsys window displays
等等。。。
CPU 信息:adb shell cat /proc/cpuinfo
内存信息:adb shell cat /proc/meminfo
更多硬件与系统属性:
属性名 含义
ro.build.version.sdk SDK 版本
ro.build.version.release Android 系统版本
ro.build.version.security_patch Android 安全补丁程序级别
ro.product.model 型号
ro.product.brand 品牌
ro.product.name 设备名
ro.product.board 处理器型号
ro.product.cpu.abilist CPU 支持的 abi 列表[节注一]
persist.sys.isUsbOtgEnabled 是否支持 OTG
dalvik.vm.heapsize 每个应用程序的内存上限
ro.sf.lcd_density 屏幕密度
然后也可以修改这些参数: 感觉挺好玩的= 。=
PS:修改设置之后,运行恢复命令有可能显示仍然不太正常,可以运行 adb reboot 重启设备,或手动重启。
修改设置的原理主要是通过 settings 命令修改 /data/data/com.android.providers.settings/databases/settings.db 里存放的设置值。
修改分辨率:adb shell wm size 720x1280 (x字母)
修改屏幕密度:adb shell wm density 160
修改显示区域:adb shell wm overscan 0,0,0,200
四个数字分别表示距离左、上、右、下边缘的留白像素,以上命令表示将屏幕底部 200px 留白。
这些修改都可执行相应的恢复操作,只需将命令相应的数值换成 reset 即可。
如恢复分辨率:adb shell wm size reset
一些常用的其他功能:
截图保存到电脑:adb exec-out screencap -p > img.png 一般是保存在电脑用户根目录
截图保存到设备里:adb shell screencap -p /sdcard/img.png
然后将图片导出到电脑:adb pull /sdcard/img.png 一般是保存在电脑用户根目录
参数 含义
-p 指定保存文件为 png 格式
-d display-id 指定截图的显示屏编号(有多显示屏的情况下)
录制屏幕: adb shell screenrecord /sdcard/filename.mp4
录制屏幕以 mp4 格式保存到 /sdcard,需要停止时按 Ctrl-C,默认录制时间和最长录制时间都是 180 秒。
导出到电脑跟之前导出图片一样:adb pull /sdcard/filename.mp4
可以使用 adb shell screenrecord –help 查看 screenrecord 命令的帮助信息,下面是常见参数及含义:
参数 含义
–size WIDTHxHEIGHT 视频的尺寸,比如 1280x720,默认是屏幕分辨率。
–bit-rate RATE 视频的比特率,默认是 4Mbps。
–time-limit TIME 录制时长,单位秒。
–verbose 输出更多信息。
使用 Monkey 进行压力测试:
Monkey 可以生成伪随机用户事件来模拟单击、触摸、手势等操作,可以对正在开发中的程序进行随机压力测试。
简单用法:adb shell monkey -p <packagename> -v 500
表示向 <packagename> 指定的应用程序发送 500 个伪随机事件。
Monkey 的详细用法参考 官方文档。
开启关闭wifi,需要root权限。
开启wifi: adb shell svc wifi enable
关闭wifi: adb shell svc wifi disable
刷机相关:
重启手机:adb reboot
重启到 Recovery 模式:adb reboot recovery
从 Recovery 重启到 Android:adb reboot
重启到 Fastboot 模式:adb reboot bootloader
启动 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 就没问题了。
另附上dumpsys相关知识:
http://gityuan.com/2016/05/14/dumpsys-command/
http://gityuan.com/2017/07/02/ams_dumpsys/