adb命令用法整理

Android Debug Bridge:android调试桥,通常位于sdk的platform-toor文件夹下。

ADB架构

adb是一个C/S架构的应用程序,由三部分组成:

  1. 客户端,运行在开发者的pc端,使用adb命令调用。运行后会尝试定位主机上的adb服务器,如果没有则启动一个adb服务器。
  2. 服务器,运行在开发者pc端的一个后台进程,作用在于监测usb端口的感知设备的连接和拔出;管理客户端和守护进程之间的通信,将客户端的请求通过usb或者tcp的方式发送到设备端的守护进程(常驻进程)adbd中。
  3. adbd(adb demon),运行在每个设备端后台的一个守护进程(常驻进程),作用是用于连接adb服务器,当adbd与服务器连接后,客户端就可以想adb服务器发送服务请求了。

adb的工作原理

  1. 在pc端运行adb命令启动时,客户端先监测服务器进程是否运行,否则启动,服务器在启动后与本地 tcp的5037端口绑定,通过该端口监听客户端发出的命令,也可以通过adb -P <port> start-server指定固定端口。
  2. 服务器与设备端连接,服务器通过扫描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 实际是分三步完成:

  1. push apk 文件到 /data/local/tmp。
  2. 调用 pm install 安装。
  3. 删除 /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>主要是keyeventtext
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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343