Android Debug Bridge:android调试桥,通常位于sdk的platform-toor文件夹下。
ADB架构
adb是一个C/S架构的应用程序,由三部分组成:
- 客户端,运行在开发者的pc端,使用adb命令调用。运行后会尝试定位主机上的adb服务器,如果没有则启动一个adb服务器。
- 服务器,运行在开发者pc端的一个后台进程,作用在于监测usb端口的感知设备的连接和拔出;管理客户端和守护进程之间的通信,将客户端的请求通过usb或者tcp的方式发送到设备端的守护进程(常驻进程)adbd中。
- adbd(adb demon),运行在每个设备端后台的一个守护进程(常驻进程),作用是用于连接adb服务器,当adbd与服务器连接后,客户端就可以想adb服务器发送服务请求了。
adb的工作原理
- 在pc端运行adb命令启动时,客户端先监测服务器进程是否运行,否则启动,服务器在启动后与本地 tcp的5037端口绑定,通过该端口监听客户端发出的命令,也可以通过
adb -P <port> start-server
指定固定端口。 - 服务器与设备端连接,服务器通过扫描5555到5585之间的奇数端口查找模拟器,服务器发现adbd(守护进程)后便于之连接。
note:每个模拟器都使用一对按顺序排列的端口,偶数端口连接控制台,奇数端口连接adb。
具体用法
指定目标设备
如果有多个设备时使用:
-d
指定当前唯一通过 USB 连接的 Android 设备为命令目标
-e
指定当前唯一运行的模拟器为命令目标
-s <serialNumber>
指定相应 serialNumber 号的设备/模拟器为命令目标
查看应用列表
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> 字符串
安装APK
adb install
后面可以跟一些可选参数来控制安装 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
sdcard 访问失败; 应用签名与 ROM 签名一致,被当作内置应用。确认 sdcard 可用,或者安装到内置存储; 打包时不与 ROM 使用相同签名。
INSTALL_FAILED_INVALID_INSTALL_LOCATION
不能安装到指定位置;应用签名与 ROM 签名一致,被当作内置应用。切换安装位置,添加或删除 -s 参数;打包时不与 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 device
空间不足;清理空间
Permission denied ... sdcard ...
sdcard 不可用
signatures do not match the previously installed version; ignoring!
已安装该应用且签名不一致;先卸载设备上的该应用,再安装
adb install 内部原理简介
adb install 实际是分三步完成:
- push apk 文件到 /data/local/tmp。
- 调用 pm install 安装。
- 删除 /data/local/tmp 下的对应 apk 文件。
所以,必要的时候也可以根据这个步骤,手动分步执行安装过程。
清除应用数据与缓存
adb shell pm clear <packagename>
<packagename> 表示应用名包,这条命令的效果相当于在设置里的应用信息界面点击了「清除缓存」和「清除数据」。
实例:
adb shell pm clear com.qihoo360.mobilesafe
查看前台 Activity
adb shell dumpsys activity activities | grep mFocusedActivity
查看正在运行的 Services
adb shell dumpsys activity services [<packagename>]
<packagename>
参数不是必须的,指定<packagename>
表示查看与某个包名相关的 Services,不指定表示查看所有 Services,<packagename>
不一定要给出完整的包名
查看应用详细信息
adb shell dumpsys package <packagename>
输出中包含很多信息,包括 Activity Resolver Table、Registered ContentProviders、包名、userId、安装后的文件资源代码等路径、版本信息、权限信息和授予状态、签名版本信息等。
与应用交互
主要是使用am <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
强制停止应用
adb shell am force-stop <packagename>
文件管理
adb pull <设备里的目录> <电脑上的文件路径>
adb push <电脑上的文件路径> <设备里的目录>
按键模拟/输入
input
这是一个非常有意思的命令
命令adb shell input [<source>] <command> [<arg>...]
最常用的<source>
主要是keyevent
和text
keyevent
的常用code如下:
内核日志
adb shell dmesg
IP 地址
每次想知道设备的 IP 地址的时候都得「设置」-「关于手机」-「状态信息」-「IP地址」很烦对不对?通过 adb 可以方便地查看。
adb shell ifconfig | grep Mask
内存信息
adb shell cat /proc/meminfo
关闭 USB 调试模式
adb shell settings put global adb_enabled 0
实用功能
屏幕截图
adb exec-out screencap -p > sc.png
保存截图到电脑
adb shell screencap -p /sdcard/sc.png
保存截图到设备
adb shell screenrecord /sdcard/filename.mp4
录屏保存到设备,默认时长180秒
重新挂载 system 分区为可写
需要root权限
先用mount
命令找到system所在行的路径,然后使用
mount -o remount,rw -t yaffs2 /dev/block/platform/msm_sdcc.1/by-name/system /system
这里的 /dev/block/platform/msm_sdcc.1/by-name/system 就是我们从上一步的输出里得到的文件路径。
查看连接过的 WiFi 密码
cat /data/misc/wifi/*.conf
开启/关闭 WiFi
adb shell svc wifi enable
adb shell svc wifi disable
查看实时资源占用情况
adb shell top