#Android Debug Bridge http://developer.android.com/guide/developing/tools/adb.html
一 介绍
Android调试桥接器,简称adb,用于管理模拟器或真机状态的工具。采用CS模式。
客户端部分,运行在开发用的电脑上,可以在命令行中运行adb命令来调用该客户端,像ADB插件和DDMS这样的Android工具也可以调用adb客户端。
服务端部分,是运行在开发用电脑上的后台进程,用于管理客户端与运行在模拟器或真机的守护进程通信。
守护进程部分,运行于模拟器或手机的后台。
当启动adb客户端时,客户端首先检测adb服务端进程是否运行,如果没有运行,则启动服务端。当服务端启动时,它会绑定到本地的TCP5037端口,并且监听从adb客户端发来的命令——所有的adb客户端都使用5037端口与adb服务端通信。
接下来服务端与所有正在运行的模拟器或手机连接。它通过扫描5555-5585之间的奇数号端口来搜索模拟器或手机,一旦发现adb守护进程,就通过此端口进行连接。需要说明的是,每一个模拟器或手机使用一对有序的端口,偶数号端口用于控制台连接,奇数号端口用于adb连接,例如:
Emulator 1, console: 5554
Emulator 1, adb: 5555
Emulator 2, console: 5556
Emulator 2, adb: 5557 …
即如果模拟器与adb在5555端口连接,则其与控制台的连接就是5554端口。
当服务端与所有的模拟器建立连接之后,就可以使用adb命令来控制或者访问了。因为服务端管理着连接并且可以接收到从多个adb客户端的命令,所以可以从任何一个客户端或脚本来控制任何模拟器或手机设备。
下文介绍了可以用来管理模拟器或手机的这些adb命令。如果是在Eclipse并且安装了ADT插件的环境下开发Android应用程序,就不需要从命令行使用adb了,ADT插件已经提供了透明的集成。不过,还是可以在调试等需要的时候直接使用adb。
二 命令
2.1 常用
adb devices
查看设备列表- 序列号 serialNumber–由adb创建的使用控制台端口号的用于唯一标识的一个设备字符串,格式为**<设备类型>-<端口号>**,如emulator-5554.端口号>设备类型>
adb [-d|-e|-s <serialNumber>] <command>
操作指定device;如adb -s emulator-5554 install hello.apk
-d
仅对USB设备有效,多个USB设备会报错;-e
多个模拟器也会报错;-s
如果不指定设备会返回错误adb get-serialno
// 获取设备的ID和序列号serialNumberadb reboot*
重启设备adb reboot bootloader*
重启到bootloader,即刷机模式adb reboot recovery*
重启到recovery,即恢复模式adb root*
以root权限重启adb服务adb wait-for-device*
// 在模拟器/设备连接之前把命令转载在adb的命令器中adb shell cat /sys/class/net/wlan0/address
获取mac地址-
adb shell cat /proc/cpuinfo
获取cpu序列号 aapt d badging <apkfile>
获取apk的packagename 和 classnameadb install <apkfile>
安装apkadb install -r <apkfile>
保留数据和缓存文件,重新安装apk,adb install -s <apkfile>
安装apk到sd卡adb shell am start -n <package_name>/.<activity_class_name>
启动应用adb uninstall <package>
卸载appadb uninstall -k <package>
卸载app但保留数据和缓存文件adb ppp
通过usb启动ppp
2.2 文件
//android中,sdcard代表内置存储,不同系统中tf卡的设备名可能不同,使用查看。可以使用adb pull 或者 push与设备传输文件。
adb pull <remote> <local>
从设备中复制文件到本地,local不写默认当前路径,adb pull /sdcard/data/add.txt
,可使用pwd查看当前目录adb push <local> <remote>
复制一个文件到设备上,可指定路径adb shell ls mnt
查看所有存储设备名。adb remount
将system分区重新挂载为可读写分区,重新加载硬盘adb push <local> <remote>
从本地复制文件到设备adb pull <remote> <local>
从设备复制文件到本地adb shell ls
列出目录下的文件和文件夹,等同于dos中的dir命令adb shell ls -a
查看目录下的文件adb shell cd <folder>
进入文件夹,等同于dos中的cd 命令adb shell rename path/oldfilename path/newfilename
重命名文件adb shell rm /system/avi.apk
删除system/avi.apkadb shell rm -r <folder>
删除文件夹及其下面所有文件adb shell mv path/file newpath/file
移动文件adb shell chmod 777 /system/fonts/DroidSansFallback.ttf
设置文件权限adb shell mkdir path/foldelname
新建文件夹adb shell cat <file>
查看文件内容adb shell cat /data/misc/wifi/*.conf
查看wifi密码adb bugreport
查看bug报告adb shell cat /system/build.prop
获取设备名称adb shell getprop
读取系统的各种配置文件信息getprop ro.product.locale
adb shell getprop persist.sys.country
adb shell getprop persist.sys.language
语言adb shell getprop ro.product.model
grep
查找特定内容
2.3 config
adb help
输出adb支持的命令adb version
adb的版本号adb get-state
adb设备的状态free
显示当前进程内存使用情况top
显示瞬间的进程的资源占用等信息adb shell top
查看设备cpu和内存占用情况adb shell top -m 6
查看占用内存前6的appadb shell top -n 1
刷新一次内存信息,然后返回adb shell procrank
查询各进程内存使用情况ps
显示进程的自身标识信息adb shell ps
查看进程列表adb shell ps -x [PID]
查看指定进程状态adb shell ps | (grep <packageName> / findStr <关键字>)
查看某一程序的进程adb shell ps -x [PID]
查看指定进程状态adb shell kill [PID]
杀死进程adb shell service list
查看后台services信息adb shell cat /proc/meminfo
查看当前内存占用adb shell cat /proc/iomem
查看IO内存分区adb shell kill [pid]
杀死一个进程
2.4 adb shell
adb提供了shell在设备上的各种命令,这些命令的二进制形式存在于这个路径
/system/bin/...
无论是否进入adb远程shell,都可以使用shell命令来执行。
adb [-d/-e/-s (serialNumber)] shell <shellCommand>
未进入远程shell时可执行adb [-d/-e/-s (serialNumber)] shell
启动远程shell- 退出
ctrl + D
或者 exit。 start/kill-server
开始、停止adb- 【setprop KEY VALUE】设置key的property值位value
- 【getprop KEY】获取该key的property值
- 【getevent】获取所有事件
- 【watchprops】监听property值的变化
- 【stop SERVER】强行停止某一个服务
- 【start SERVER】启动某一个服务
- 【ioctl】控制设备
- 【rm /path/filename】从终端删除一个文件
- 【mkdir】新建一个目录或者文件
- 【cp】拷贝文件
- 【dd】复制文件
- 【mv】移动目录文件,或者改名
- 【cat】查看文件内容
- 【ipconfig】查看更改网络接口地址和参数
- 【ping】检测网络状态
- 【netstat】查看网络状态
- 【telnet】登录远程主机
- 【sqlite3 /path/DATABASENAME.db】打开某一个数据库。之后即可使用select,insert,delete等数据库操作命令
- 【tcpdump -p -nnn -vvv -s 0 -w /PATH/NAME.pcap port 80 and tcp】网络调试抓包
- 【gst-launch playbin uri=file:///system/media/audio/bootaudio.mp3】gst多媒体框架,播放音频文件
- 【alsa_amixer】音频调试命令,可以切换声道,调节音量,切换设备。不同的芯片厂家的参数设置有所不同。
- 【alsa_aplay -D AndroidPlayback_Speaker_normal /cache/music/dial/0.wav】通过alsa播放pcm码流。
- 【alsa_arecord】通过alsa实现录音
- 【stack –symbols-dir=./out/target/product/NAME/symbols ramdump】查看调用堆栈
- 【exit】退出shell
从远程shell检查sqlite3 数据库
通过远程shell,可以使用sqlite3命令行程序来管理由应用程序创建的SQLite数据库。 sqlite3 工具包含很多有用的命令,例如 .dump 用于输出表格的内容,.schema 用于为已经存在的表输出 SQL CREATE 语句。 并且该工具也提供了联机执行SQLite命令的能力。
使用 sqlite3时,向前文描述的那样进入模拟器的远程shell,然后使用sqlite3 命令。也可以在调用 sqlite3时指定数据库的全路径。SQLite3数据库存储在/data/data/
adb -s emulator-5554 shell
sqlite3 /data/data/com.example.google.rss.rssexample/databases/rssitems.db
SQLite version 3.3.12
Enter ".help" for instructions
.... enter commands, then quit...
sqlite> .exit
一旦运行了 sqlite3,就可以使用 sqlite3 命令,退出并返回远程shell可以使用 exit 或 CTRL+D。
使用Monkey进行UI或应用程序测试
- ` adb shell monkey -v -p your.package.name 500` 对程序进行强制测试500次
Monkey是运行于模拟器或手机上的一个程序,通过生成伪随机的大量的系统级的用户事件流来模拟操作,包括单击、触摸、手势等。从而为正在开发中的应用程序通过随机响应进行压力测试。
最简单使用monkey的方式是通过下面的命令行,它可以运行指定的应用程序并向其发送500个伪随机事件。
2.5 adb logcat(shell环境下直接用logcat)
adb logcat [<option>] ... [<filter-spec>] ...
输出日志信息adb logcat -v time -s TAGNAME
显示自定义的TAGNAME并显示时间- 过滤日志: V – 明细,D(Debug),I(info), W(Warning),E(Error), F(), S 无记载.
通过运行logcat ,可以获得一个系统中使用的标记和优先级的列表,观察列表的前两列,给出的格式是
/ 。
这里是一个日志输出的消息,优先级是“I”,标记是“ActivityManager”:
I/ActivityManager( 585): Starting activity: Intent { action=android.intent.action…} 如果想要减少输出的内容,可以加上过滤器表达式进行限制,过滤器可以限制系统只输出感兴趣的标记-优先级组合。
过滤器表达式的格式是tag:priority … ,其中tag是标记, priority是最小的优先级, 该标记标识的所有大于等于指定优先级的消息被写入日志。也可以在一个过滤器表达式中提供多个这样的过滤,它们之间用空格隔开。
下面给出的例子是仅输出标记为“ActivityManager”并且优先级大于等于“Info”和标记为“MyApp”并且优先级大于等于“Debug”的日志:
adb logcat ActivityManager:I MyApp:D *:S
上述表达式最后的 *:S 用于设置所有标记的日志优先级为S,这样可以确保仅有标记为“View”(译者注:应该为ActivityManager,原文可能是笔误)和“MyApp”的日志被输出,使用 *:S 是可以确保输出符合指定的过滤器设置的一种推荐的方式,这样过滤器就成为了日志输出的“白名单”。
下面的表达是显示所有优先级大于等于“warning”的日志:
adb logcat *:W
如果在开发用电脑上运行 logcat (相对于运行运程shell而言),也可以通过ANDROID_LOG_TAGS环境变量设置默认的过滤器表达式:
export ANDROID_LOG_TAGS=”ActivityManager:I MyApp:D *:S”
需要注意的是,如果是在远程shell或是使用adb shell logcat 命令运行logcat , ANDROID_LOG_TAGS 不会导出到模拟器或手机设备上。
控制日志格式
日志消息在标记和优先级之外还有很多元数据字段,这些字段可以通过修改输出格式来控制输出结果, -v 选项加上下面列出的内容可以控制输出字段:
- brief — 显示优先级/标记和原始进程的PID (默认格式)
- process — 仅显示进程PID
- tag — 仅显示优先级/标记
- thread — 仅显示进程:线程和优先级/标记
- raw — 显示原始的日志信息,没有其他的元数据字段
- time — 显示日期,调用时间,优先级/标记,PID
- long —显示所有的元数据字段并且用空行分隔消息内容
可以使用 -v启动 logcat来控制日志格式:
[adb] logcat [-v
adb logcat -v thread 注意只能在 -v 选项中指定一种格式。
Viewing Alternative Log Buffers
Android日志系统为日志消息保持了多个循环缓冲区,而且不是所有的消息都被发送到默认缓冲区,要想查看这些附加的缓冲区,可以使用-b 选项,以下是可以指定的缓冲区:
- radio — 查看包含在无线/电话相关的缓冲区消息
- events — 查看事件相关的消息
- main — 查看主缓冲区 (默认缓冲区)
-b 选项的用法:
[adb] logcat [-b
adb logcat -b radio
查看stdout和stderr
默认的,Android系统发送 stdout 和 stderr (System.out 和 System.err) 输出到 /dev/null。 在 Dalvik VM进程,可以将输出复制到日志文件,在这种情况下,系统使用 stdout 和 stderr标记写入日志,优先级是I。
要想使用这种方式获得输出,需要停止运行中的模拟器或手机,然后使用命令 setprop 来允许输出重定位,示例如下:
$ adb shell stop $ adb shell setprop log.redirect-stdio true $ adb shell start 系统会保留这一设置直到模拟器或手机退出,也可以在设备中增加/data/local.prop以使得这一设备成为默认配置。
Logcat命令选项列表
- -b
加载不同的缓冲区日志,例如 event 或radio。main 缓冲区是默认项,参见Viewing Alternative Log Buffers. - -c 清空(刷新)所有的日志并且退出
- -d 在屏幕上输出日志并退出
- -f
将日志输出到文件 ,默认输出是stdout. - -g 输出日志的大小
- -n
设置最大的循环数据 ,默认是4,需要-r选项 - -r
每 循环日志文件,默认是16,需要 -f 选项 - -s 设置默认的过滤器为无输出
- -v
设置输出格式,默认的是brief,支持的格式列表参见Controlling Log Output Format.
2.8 am
- adb shell am
am start -n {packageName}/{packageName}.{activityName}
启动am force-stop {packageName}
停止应用相关进程am startservice -n {packageName}/{packageName}.{serviceName}
am broadcast -a <Broadcast action> 如 android.net.conn.CONNECTIVITY_CHANGE
am broadcast -a NotifyServiceStart/Stop
am kill-all
杀死后台所有的进程am kill <package>
杀死指定的包的进程am display-size WxH
改变显示的分辨率am display-density <dpi>
改变显示的density
2.8 pm
- adb shell pm command
pm uninstall [-k] packageName
卸载,如pm uninstall -k com.lq.he.test
pm install [-l] [-r] path
-r表示重新安装,如pm install -r user/test.apk
cp user/test.apk /data/app
安装rm -f /data/app/test.apk
卸载pm list packages [-f]
获取设备的所有安装包pm list permission-groups
获取权限pm list permissions [-g] [-f] [-d] [-u] [GROUP]
-
pm list instrumentation [-f] [TARGET-PACKAGE]
pm list features
输出系统的所有功能pm list libraries
输出当前设备支持的所有库pm users
输出系统上所有的用户pm path package
某个包的路径,如pm path com.lq.he.test
–package:/system/app/Test/Test.apkclear package
删除与软件包关联的所有数据pm enable package_or_component
启用指定的软件包或组件pm disable package_or_component
停用pm disable-user [options] package_or_component
要停用的用户pm grant package_name permission
向应用授权pm revoke package_name permission
撤销权限pm set-install-location location
更改默认安装位置pm get-install-location
返回安装的位置pm set-permission-enforced permission [true/false]
指定是否应强制执行给定的权限pm trim-caches desired_free_space
减少缓存文件以达到给定的可用空间pm create-user user_name
使用给定的user_name创建新用户pm remove-user user_id
移除指定user_id的用户pm get-max-users
输出设备支持的最大用户数
2.9 screenshot
- take a screenshot of a device display
- adb shell screencap /sdcard/screen.png
2.10 video
- adb shell screenrecord /sdcard/demo.mp4
2.11 dumpsys (DDMS提供的一个集成调试环境)
adb shell dumpsys [-t timeout] [--help | -l | --skip 服务 | 服务 | 参数] | -c(指定格式输出) | -H(帮助)]
adb shell dumpsys
在屏幕上显示系统数据,如adb shell dumpsys sensorservice
adb shell dumpsys activity
显示活动栈信息adb shell dumpsys activity activities
adb shell dumpsys activity services [<packagename>]
adb shell dumpsys activity top
查看栈顶Activity,用来获取包名
adb shell dumpsys cpuinfo
查看CPU信息adb shell dumpsys input
为输入组件提供系统数据adb shell dumpsys -l
输出系统服务的完整的列表
2.11.1 测试UI性能
adb shell dumpsys gfxinfo packageName
指定包的UI性能数据adb shell dumpsys gfxinfo packageName framestats
最近帧中跟踪和调试
2.11.2 网络诊断
adb shell dumpsys netstats detail
设备的网络使用情况统计信息adb shell dumpsys package com.example.myapp | grep userId
2.11.3 监测电量
adb shell dumpysy batterystats options
adb shell dumpsys batterystats --charged packageName
- 电池相关事件的历史记录
- 设备的全局统计信息
- 每个UID和系统组件近似的功耗
- 每个应用的数据包的移动的毫秒数
- 系统UID汇总统计信息
- 应用UID汇总统计信息
adb shell dumpsys batterystats --checkin
检查机器友好的输出
2.11.4 查看内存分配
- procstats:
adb shell dumpsys procstats --hour 3
3个小时内的内存使用情况 - meminfo:
adb shell dumpsys meminfo packageName|pid [-d]
具体应用的内存信息- 一般只关心
Pss Total
和Private Dirty
(实际的内存)。 Dalvik Heap
分配应用中使用的RAM。Private Dirty
(实际的内存),由你自己分配和任何Zygote分配组成,只承担你的应用的堆。Heap Alloc
是Dalvik和本机堆分配器为各个应用分配的内存量。共享。
.so .dex mmap
私有。- RAM用于映射.so和.dex代码。
.oat mmap
代码图像使用的RAM数量,基于多个应用的预加载类。共享。.art mmap
堆使用的RAM数量,基于多个应用的预加载类。共享。.Heap
应用的堆内存量。不包括对象和大对象空间。.LOS
ART大对象(>12kb的基本数组分配)空间使用的RAM量。包括Zygote大对象。.GC
垃圾回收的开销成本,没有任何方法可以减少这种开销。、.JINCache
这是JIN数据和代码缓存使用的内存量。通常为0,因为应用将在安装时编译。.Zygote
合子空间使用的内存量。Zygote空间是在设备启动时创建的,并永远不会分配。.NonMoving
ART不移动空间使用的RAM数量。非移动空间包含特殊的不可移动对象,如字段和方法。可以减少。.IndirectRef
ART简介参考表使用的RAM数量。很小。可通过减少本地和全局JNI引用的数量来减少。Unknown
系统无法分类。TOTAL
是PSS(总比例集大小)字段的总和。你的进程使用的PSS RAM。ViewRootImpl
处于活动状态的根视图数量。每个根视图都有一个窗口相关。分析view相关的OOM。AppContexts Activity
当前应用的Context和Activity对象的数量。可识别Activity由于静态引用而无法GC引起的OOM。
- 一般只关心
2.12 其他shell命令
adb shell ls /system/bin
adb dumpstate
将状态输出到文件adb dmesg
在屏幕上输出核心调试信息adb start/stop
启动或停止设备
三 使用实例
-
adb shell am start -W packagename/activity
计算apk启动时间。adb shell am start -W com.lq.test/com.lq.test.MainActivity Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp= com.lq.test/.MainActivity } Status: ok Activity: com.lq.test/.ui.MainActivity ThisTime: 609 TotalTime: 710 WaitTime: 728 Complete
adb shell dumpsys batterystats
电量消耗-
AS no debuggable applications
解决办法: Tools->Android->Enable ADB Integration。在设备上重新安装一遍加上 debuggable true,并且关闭其他adb端口 -
Installation error: INSTALL_FAILED_UPDATE_INCOMPATIBLE 因为这个APP是通过系统内置的APP 转自 http://blog.csdn.net/ouyang_peng/article/details/50419276
直接使用adb uninstall com.he.demo 会导致 Failure [DELETE_FAILED_INTERNAL_ERROR] 第一步:先把原来已经存在的相同包名的APK删除,如:adb shell rm system/app/demo/demo.apk 第二步:将data/data/目录下该应用的包名的目录删除掉,如:adb shell rm -rf data/data/com.he.demo/ 第三步:重启Android手机 adb reboot 第四步:再重新安装该APK
``` 另一种解决办法 **办法1: settings->applications->mange applications-> select the application->select “unistall”. **办法2**: http://blog.csdn.net/he315889714/article/details/38519101 一、删除Android系统下的软件,使用adb shell进入系统,然后使用命令重新挂载“/system”目录为读写权限,具体操作及命令如下: 1、 adb shell 2、切换到root权限:root@android:/ # su
3、重新挂载:root@android:/ # mount -o remount,rw rootfs /system/
4、进入系统安装目录:root@android:/ # cd system/app
5、查看apk包:root@android:/ # ls
6、删除apk包:rm -r com.he.demo.apk 注:删除apk包后,系统中的应用会自动删除卸载的,无需手动卸载 二、删除包后,运行程序调试会出现INSTALL_FAILED_UPDATE_INCOMPATIBLE的安装错误; 主要原因是你删除了apk包,但是系统中还有安装信息没有删除; 利用adb shell进入系统,进入/data/app或者/data/data,删除跟你安装的apk同样的包名 1、进入adb shell 2、进入程序安装信息目录 root@android:/ # cd data/data
3、删除apk信息 root@android:/data/data # rm -r com.he.demo 4、修改/data/system/packages.xml中安装包信息,将xml导出到当前文件夹中 adb pull/data/system/packages.xml .
5、编辑xml删除与之前删除apk的信息 找到你需要的包名,删除到 的一段数据。例如:
保存package.xml
6.最后将xml导入系统中
adb push packages.xml /data/system
7.设置完成了一定要重启手机:adb reboot
5. `adb opendir failed ,permission denied `
```
1.adb devices 查看所有虚拟设备
2.adb -s 设备名称 shell 进入真机(设备名称为真机的设备名称)
3.cd data 进入data目录
4.ls 查看当前目录的所有文件 (此时会提示adb opendir failed ,permission denied)注意:这时可以输入su,并按回车键
5.cd data 重新进入data目录
6.ls 查看当前目录的所有文件 此时就能看到此文件夹下的所有文件了
7.cd data 进入data/data目录
8.cd com.he.lq.demo 进入程序中
9.cd shared_prefs 进入shared_prefs目录
10.cat xx.xml 查看xx.xml文件中的内容
*****如果是db, 或者其他不能使用cat的文件,可以导出
1.cd data/data/com.he.lq.demo/databases
1.cp XXX.db /sdcard
2 adb pull /sdcard/XXX.db