PC 端的 adb server 与手机端的守护进程 adbd 建立连接,然后 PC 端的 adb client 通过 adb server 转发命令,adbd 接收命令后解析运行。
1 设备通过USB连接电脑并处于同一局域网或WIFI
2 让设备在5555端口监听TCP/IP连接,命令:adb tcpip 5555
3 断开USB并通过设备IP地址连接到设备,命令:adb connect
4 确认连接状态,命令:adb devices,正常输出::5555 device
PS:IP地址:设置 → 关于手机 → 状态信息 → IP地址(192…)
1 设备安装终端模拟器,链接:https://jackpal.github.io/Android-Terminal-Emulator/
2 设备通过USB连接电脑并处于同一局域网或WIFI
3 打开终端模拟器并输入命令:su → setprop service.adb.tcp.port 5555
4 连接设备,连接方法与确认状态同上
PS:部分设备连接成功后需重启adbd服务,在终端模拟器上运行一下命令
restart adbd 或 stop adbd → start adbd
断开无线连接,命令:adb disconnect
快捷键 | 作用 |
---|---|
Ctrl + C | 取消,可取消当前正在运行的adb命令 |
adb [-d|-e|-s ]
PS:只连接一个设备或模拟器时,“[]”内可省
-d 指定通过USB连接的设备
-e 指定运行的模拟器
-s 指定相应 serialNumber 号的设备/模拟器
TODO:如何指定无线连接的设备?
adb start-server adb kill-server
adb version
命令:adb root
正常输出:restarting adbd as root
PS:再执行命令:adb shell ,命令行提示符会变成“#”
恢复非root权限:adb unroot
adb -P start-server
adb devices
输出格式为 [serialNumber] [state]
offline,无响应或未连接;device,已连接,操作状态未知;no device,无设备
PS:设备系统启动中壳连接到ADB
基本命令格式:adb shell pm list packages [-f|-d|-e|-s|-3|-i|-u] [–user USER_ID] [FILTER]
无 所有应用
-f 显示应用关联的 apk 文件
-d 只显示 disabled 的应用
-e 只显示 enabled 的应用
-s 只显示系统应用
-3 只显示第三方应用
-i 显示应用的 installer
-u 包含已卸载应用
包名包含 字符串
adb install [-l|-r|-t|-s|-d|-g]
-l 将应用安装到保护目录 /mnt/asec
-r 允许覆盖安装
-t 允许安装 AndroidManifest.xml 里 application 指定 android:testOnly=“true” 的应用
-s 将应用安装到 sdcard
-d 允许降级覆盖安装
-g 授予所有运行时权限
adb install原理
1 push apk 文件到 /data/local/tmp。
2 调用 pm install 安装。
3 删除 /data/local/tmp 下的对应 apk 文件。
adb uninstall [-k]
-k 卸载应用但保留数据和缓存目录
adb shell pm clear
PS:相当于点击“清除缓存”和“清除数据”
adb shell dumpsys activity activities | grep mFocusedActivity
adb shell dumpsys activity services []
PS:上述命令行会列出packagename和其相关的services;packagename不指定,表示查看所有Services
adb shell dumpsys package
输出 含义 解决办法
INSTALL_FAILED_ALREADY_EXISTS 应用已经存在,或卸载了但没卸载干净 adb install 时使用 -r 参数,或者先 adb uninstall 再安装
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 再安装
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 访问失败; 1. 确认 sdcard 可用,或者安装到内置存储;
INSTALL_FAILED_INVALID_INSTALL_LOCATION 1. 不能安装到指定位置; 1. 切换安装位置,添加或删除 -s 参数;
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 device 空间不足清理空间
Permission denied … sdcard … sdcard 不可用
signatures do not match the previously installed version; ignoring! 已安装该应用且签名不一致,先卸载设备上的该应用,再安装复制文件到电脑
adb pull <设备里的文件路径> [电脑上的目录] 复制文件到设备
adb push <电脑上的文件路径> <设备里的目录> 模拟按键/输入
adb shell input [] […]
source:mouse,keyboard,joystick,touchnavigation,touchpad,trackball,stylus,dpad,gesture,touchscreen,gamepad
command:
text (Default: touchscreen)
keyevent [–longpress] … (Default: keyboard)
tap (Default: touchscreen)
swipe [duration(ms)] (Default: touchscreen)
press (Default: trackball)
roll (Default: trackball)
举例:adb shell input keyevent 、
keyevent:
3 HOME 键
4 返回键
5 打开拨号应用
6 挂断电话
24 增加音量
25 降低音量
27 拍照(需要在相机应用里)
64 打开浏览器
82 菜单键
85 播放/暂停
86 停止播放
87 播放下一首
88 播放上一首
122 移动光标到行首或列表顶部
123 移动光标到行末或列表底部
126 恢复播放
127 暂停播放
164 静音
176 打开系统设置
187 切换应用
207 打开联系人
208 打开日历
209 打开音乐
210 打开计算器
220 降低屏幕亮度
221 提高屏幕亮度
223 系统休眠
224 点亮屏幕
231 打开语音助手
276 如果没有 wakelock 则让系统休眠
adb shell input swipe 300 1000 300 500
PS:参数依次表示起始点x,y坐标 结束点x,y坐标
输入文本:adb shell input
[adb] logcat [] … [] …
级别:V Verbose(最低,输出得最多)
D Debug
I Info
W Warning
E Error
F Fatal
S Silent(最高,啥也不输出)
举例:adb logcat :W PS:macOS系统以作为tag的参数需加双引号
adb logcat ActivityManager:I MyApp:D *:S PS: 可以由多个 [:priority] 组成
表示:输出 tag ActivityManager 的 Info 以上级别日志,输出 tag MyApp 的 Debug 以上级别日志,及其它 tag 的 Silent 级别日志
指定日志格式:adb logcat -v
format:brief,process,tag,raw,time,threadtime,long
类型 输出格式
brief /(): (默认格式)
process ()
tag /:
raw
time /():
threadtime :
long [ : / ]
格式指定与过滤同时使用:adb logcat -v long ActivityManager:I *:S
清空日志:adb logcat -c
内核日志:adb shell dmesg
PS:"[]"内表示内核开始启动后的时间,单位为秒
"Freeing init memory"表示内核启动时间
型号:adb shell getprop ro.product.model
电池状况:adb shell dumpsys battery
屏幕分辨率:adb shell wm size
屏幕密度:adb shell wm density
显示屏参数:adb shell dumpsys window displays
android_id:adb shell settings get secure android_id
IMEI:adb shell dumpsys iphonesubinfo
Android 系统版本:adb shell getprop ro.build.version.release
IP 地址:adb shell ifconfig | grep Mask
局域网 IP:adb shell ifconfig wlan0
所有设备信息:adb shell netcfg
Mac 地址:adb shell cat /sys/class/net/wlan0/address
CPU 信息:adb shell cat /proc/cpuinfo
内存信息:adb shell cat /proc/meminfo
更多硬件与系统属性:adb shell cat /system/build.prop
分辨率:adb shell wm size 480x1024 恢复:adb shell wm size reset
屏幕密度:adb shell wm density 160 恢复:adb shell wm density reset
显示区域:adb shell wm overscan 0,0,0,20(左上右下) 恢复:adb shell wm overscan reset
关闭 USB 调试模式:adb shell settings put global adb_enabled 0 PS:命令行不能恢复
状态栏和导航栏的显示隐藏:adb shell settings put global policy_control
key 含义 value 含义
immersive.full 同时隐藏 apps 所有应用
immersive.status 隐藏状态栏 * 所有界面
immersive.navigation 隐藏导航栏 packagename 指定应用
immersive.preconfirms ? -packagename 排除指定应用
举例:adb shell settings put global policy_control immersive.full=*
屏幕截图:adb exec-out screencap -p > sc.png
录制屏幕:adb shell screenrecord /sdcard/filename.mp4 PS:停止快捷键:ctrl+c;默认时长180秒
查看screenrecord命令帮助:adb shell screenrecord --help
1 进入shell并切换到root用户权限,命令:adb shell → su
2 查看当前分区挂载情况,命令:mount
3 找到带/system的那一行,重新挂载:mount -o remount,rw -t yaffs2 <带/system的那一行>
adb shell → su → cat /data/misc/wifi/*.conf
adb shell → su → date -s 20160823.131500
adb reboot
adb shell → su
输入命令后,命令行提示符变成“$”,则表示无root权限,变成“#”,则表示已root
开启:adb shell monkey -p -v 500
关闭:adb shell → top | grep monkey(获取到进程id) → kill -9 进程id
检查进程是否关闭:top | grep monkey
开启 WiFi:adb root → adb shell svc wifi enable
关闭 WiFi:adb root → adb shell svc wifi disable
重启到 Recovery 模式:adb reboot recovery
从 Recovery 重启到 Android:adb reboot
重启到 Fastboot 模式:adb reboot bootloader
Recovery 模式刷机:
1 下载rom到电脑上
2 重启到 Recovery 模式,命令:adb reboot recovery
3 在设备的 Recovery 界面上操作进入 Apply update-Apply from ADB
4 通过 adb 上传和更新系统,命令:adb sideload
启用 SELinux adb root → adb shell setenforce 1
禁用 SELinux adb root → adb shell setenforce 0
启用 dm_verity adb root → adb enable-verity
禁用 dm_verity adb root → adb disable-verity
adb shell ps
PS:USER:所属用户,PID:进程ID,PPID:父进程 ID,NAME:进程名
adb shell top
PID 进程 ID
PR 优先级
CPU% 当前瞬间占用 CPU 百分比
S 进程状态(R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程)
#THR 线程数
VSS Virtual Set Size 虚拟耗用内存(包含共享库占用的内存)
RSS Resident Set Size 实际使用物理内存(包含共享库占用的内存)
PCY 调度策略优先级,SP_BACKGROUND/SPFOREGROUND
UID 进程所有者的用户 ID
NAME 进程名
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 显示帮助文档
方法1:adb shell dumpsys package | grep userId=
方法2:adb shell ps → adb shell cat /proc//status | grep Uid
cat 显示文件内容
cd 切换目录
chmod 改变文件的存取模式/访问权限
df 查看磁盘空间使用情况
grep 过滤输出
kill 杀死指定 PID 的进程
ls 列举目录内容
mount 挂载目录的查看和管理
mv 移动或重命名文件
ps 查看正在运行的进程
rm 删除文件
top 查看进程的资源占用情况
启动 adb server 失败,error: protocol fault (couldn’t read status): No error,adb server 进程想使用的 5037 端口被占用
找到占用 5037 端口的进程,然后终止它,命令:netstat -ano | findstr LISTENING → taskkill /PID → 重启adb
TODO:
主要是使用 am 命令,常用的 如下:
command用途
start [options] 启动 指定的 Activity
startservice [options] 启动 指定的 Service
broadcast [options] 发送 指定的广播
force-stop 停止 相关的进程
参数很灵活,和写 Android 程序时代码里的 Intent 相对应。
用于决定 intent 对象的选项如下:
参数 含义
-a 指定 action,比如 android.intent.action.VIEW
-c 指定 category,比如 android.intent.category.APP_CONTACTS
-n 指定完整 component 名,用于明确指定启动哪个 Activity,如 com.example.app/.ExampleActivity
里还能带数据,就像写代码时的 Bundle 一样:
参数 含义 命令格式: adb shell am start [options] adb shell am start -n com.tencent.mm/.ui.LauncherUI adb shell am start -n org.mazhuang.boottimemeasure/.MainActivity --es “toast” “hello, world” 命令格式:adb shell am startservice [options] 命令格式:adb shell am broadcast [options] 可以向所有组件广播,也可以只向指定组件广播。 例如,向所有组件广播 BOOT_COMPLETED: 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 既能发送系统预定义的广播,也能发送自定义广播。如下是部分系统预定义广播及正常触发时机: action触发时机 命令:adb shell am force-stop
–esn
-e --es
–ez
–ei
–el
–ef
–eu
–ecn
–eia 调起 Activity
例如:
表示调起微信主界面。
表示调起 org.mazhuang.boottimemeasure/.MainActivity 并传给它 string 数据键值对 toast - hello, world。调起Service
例如:adb shell am startservice -n com.tencent.mm/.plugin.accountsync.model.AccountAuthenticatorService
表示调起微信的某 Service。发送广播
又例如,只向 org.mazhuang.boottimemeasure/.BootCompletedReceiver 广播 BOOT_COMPLETED:
这类用法在测试的时候很实用,比如某个广播的场景很难制造,可以考虑通过这种方式来发送广播。
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 触发)强制停止应用
命令示例:adb shell am force-stop com.qihoo360.mobilesafe 表示停止 360 安全卫士的一切进程与服务。