Android 官方命令深入分析之Android Debug Bridge(adb)
作者:宋志辉
Android Debug Brideg(adb)是一个多用途的命令行工具。可以与Android虚拟机进行通信或连接真机。它同样提供了访问设备shell的高级命令行操作的权限。它是一个包含以下三部分的客户端-服务端程序:
一个客户端,运行在你的开发设备上。你可以通过adb命令来从shell中调用一个客户端。或者通过ADT插件和DDMS创建adb客户端。
一个服务端,作为一个后台进程运行在你的开发设备中。服务端负责客户端和虚拟机或设备中adb守护进程的通信。
一个守护进程,运行在虚拟机和设备中的一个后台进程。
你可以在/platform-tools/中找到adb工具。
当你启动一个adb客户端时,客户端首先检查这里是否已经有一个服务端进程在运行。如果没有,则启动服务端进程。当服务端进程运行后,与本地的TCP的5037端口,并且监听发自客户端的命令-所有的adb 客户端都通过5037端口与adb 服务端进行通信。
接下来服务端建立起与所有运行的虚拟机和设备的连接。它通过扫描5555到5585端口的奇数端口来确定运行的虚拟机或设备的实例。当服务端发现一个adb守护进程,就通过这个端口建立连接。需要注意的是,每个虚拟机或设备都需要两个端口:一个偶数端口用来进行控制台连接,一个奇数端口用来adb 连接。
比如:
宋志辉的虚拟机,控制台端口:5554
宋志辉的虚拟机,adb端口:5555
如上所示,虚拟机实例连接到5555端口,控制台监听5554端口。
一旦服务器建立起所有虚拟机的连接,你可以使用adb命令来访问这些设备。因为服务端管理与设备或虚拟机的连接并且处理来自adb客户端的命令。你可以使用任何的客户端来控制任意的虚拟机或设备。
允许adb 调试
为了使adb可以通过USB连接设备,必须在系统设置中找到 开发者选项 开启USB调试。
在Android 4.2及以上版本中,开发者选项默认是隐藏的。要显示出来,点击“设置”“关于”“构建版本”7次。返回之前的屏幕可以找到“开发者选项”。
在有些设备中,开发者选项 可能显示出来或者名称不同。
注意:当你连接一个高于Android4.2.2版本的设备到计算机时,手机会弹窗提示是否同意一个RSA密钥来运行这台计算机进行调试。这个安全机制用来保护用户的设备,因为除非你解锁设备,否则其他的adb命令无法运行。这需要adb版本大于等于1.0.31(SDK大于等于16.0.1)。
语法
你可以在你的电脑上通过命令行来运行adb命令。用法如下:
adb [-d|-e|-s <设备号>] <命令>
如果这里只有一个虚拟机或设备运行,adb默认发送到这台设备或虚拟机。如果有多个虚拟机或设备存在,你需要使用-d, -e, 或 -s选项指明运行命令的设备。
命令
下面的表格列出了所有的支持的adb命令并解释了含义和用途。
分类
命令
描述
目标设备
-d
传递一个adb命令到仅有的usb设备上
-e
传递一个adb命令到仅有的虚拟机上
-s
传递一个adb命令到指定的设备上
通用
devices
列出当前运行的虚拟机或设备列表
help
列出adb命令的帮助列表
version
输出adb的版本
调试
logcat [option] [filter-specs]
打印log数据到屏幕上
bugreport
输出dumpsys, dumpstate和logcat数据到屏幕上
jdwp
列出指定的设备的可用的JDWP进程
数据
install
安装Android应用到虚拟机或设备中
pull
从虚拟机或设备中复制文件到电脑上
push
从电脑上复制文件到虚拟机或设备中
端口和网络
forward
sockets连接用到的命令
ppp
通过USB运行PPP
脚本
get-serialno
获取adb实例的序列号字符串
get-state
获取虚拟机或设备的adb状态
wait-for-device
阻断执行直到设备在线
服务端
start-server
检测adb服务端是否运行,如果不,则运行
stop-server
终止adb服务端进程
shell
shell
在指定设备或虚拟机中启动远程的shell
查询虚拟机或设备实例
在使用adb命令之前,了解当前运行了多少虚拟机或设备是很有必要的。可以通过指定的命令生成一个当前运行的列表:
adb devices
作为回应adb输出所有设备的状态信息:
序列号。由adb创建的用于唯一标示虚拟机或设备的字符串。
状态。实例运行的状态(offline,device,no device)。
输出的格式如下:
[序列号] [状态]
下面是devices命令的一个例子:
adb devices
List of devices attached
emulator-5554 device
emulator-5556 device
emulator-5558 device
指定特定的虚拟机或设备
如果是多个设备或虚拟机在运行,你需要指定运行adb命令的实例。可以使用命令中的-s来实现:
adb -s <序列号> <命令>
可以通过devices命令获取序列号。
adb -s emulator-5556 install helloWorld.apk
需要注意的是,当多个设备运行时,你没有通过-s指定设备,运行adb命令会报错。
如果有一个或多个设备,但只有一个虚拟机,可以使用-e命令在虚拟机运行;如果有一个或多个虚拟机,但只有设备,可以使用-d在设备运行。
安装一个应用
你可以使用adb命令从开发计算机中复制一个应用到虚拟机或设备中。可以使用install命令:
adb install <apk路径>
当然,安装apk到设备中不一定要使用命令行。
复制文件
你可以使用pull和push来复制虚拟机或设备中的文件。
停止adb服务端
在有些时候,我们需要停止adb服务端,重新启动来解决问题。
停止adb服务端,可以使用kill-server命令,之后就可以重启adb服务端运行任何命令了。
无线连接
通常adb命令通过usb连接设备来使用,当然也可以通过wifi来实现。
开发计算机和设备(通常是手机)连接了同一个网络(同一个wifi或在同一个局域网中)。(并不是所有的热点都支持,防火墙需要支持adb)。
使用usb线连接计算机。
确保计算机的adb命令运行在usb模式中。
$ adb usb
restarting in USB mode
通过usb连接设备。
$ adb devices
List of devices attached
######## device
重启adb到tcipip模式。
$ adb tcpip 5555
restarting in TCP mode port: 5555
找到android设备的ip地址。
通过ip地址连接到设备。
$ adb connect #.#.#.#
connected to #.#.#.#:5555
移除设备的usb线,确认你还可以对设备进行访问。
$ adb devices
List of devices attached
#.#.#.#:5555 device
如果adb连接丢失后:
确保你的计算机和手机接入同一个wifi。
通过adb connect重新连接。
如果没用的话,重启服务端进程。
adb kill-server
然后重新开始以上步骤。
Android虚拟机 USB转串口调试方法
有时候需要在虚拟机调试串口,首先安装串口的驱动程序(不知道的话可以用驱动精灵),然后打开设备管理器找到驱动,查看驱动使用的端口(比如COM3),虚拟机需要在命令行启动:
将SDK下的tools文件夹加入path中,重启explorer。
打开cmd,输入如下命令(Android4.4是你使用的avd的名字,COM3是你的设备连接的端口):
emulator @Android4.4 -qemu -serial COM3
如果没有报错说明成功,启动虚拟机后,下载comassistant,通过命令行安装到虚拟机中(1.apk表示应用的文件名):
adb install 1.apk
安装成功后,需要用 chmod更改tty的权限(ttyS0 ttyS1...),更改成功后,打开安装到虚拟机中的应用就可以调试串口了。
更改权限方法:
打开cmd(相关命令加入path),输入adb shell
进入dev:cd dev
更改权限:chmod 777 ttyS0
安卓开发,adb shell 调试sqlite3数据库
安卓开发,adb shell 调试sqlite3数据库
在安卓中创建了sqlite3数据库,想要调试怎么办? 通过adb shell来进行查看。
第一步,将adb加入到系统变量中。
这样就可以在命令行中使用adb指令了。
输入adb shell,就可以连接电脑上的安卓模拟器,或者与电脑连接的手机了。
使用adb指令的时候,手机最好有root权限,不然好多指令都用不了。
有root权限,才能进入su root指令模式,才能查看ls的内容。
每个app,都有一个目录,cd data/data/demo.jq.com.databasetest/databases 就可以进入到相应的数据库目录下面。
然后通过sqlite3指令查看数据库情况。
要想使用sqlite3,必须要确保手机上有sqlite3工具。
如果没有,可以通过360手机助手,从电脑上传入到system/xbin目录下面。
还有个坑,要确保sqlite3的版本跟手机版本匹配,可以去网上下载相应的版本。
从虚拟机导出的sqlite3文件,push到手机里,然后操作数据库发现不能用!
报:sh: /system/xbin/sqlite3: not executable: magic 7F45错误。
原来它是要使用跟你真机CPU型号相同的sqlite3文件,比如你的测试机是4.2版本,而你的studio的SDK是5.0以上版本,这样你从虚拟机里导出的sqlite3文件5.0版本,而你手机想对应的应该是4.0版本,那sqlite3文件会不匹配,所以报这个错误!只需要下载跟手机想符的sqlite3文件就可以了,5.0是一个分水岭!
这里面有个坑,就是当你通过su root进入的时候,输入sqlite3的指令会不显示。调试的时候,不要使用su root进入就可以了。
使用adb shell的时候,有时候连接不上,原因有两种,一个是手机与电脑断开了。或者是360手机助手跟adb shell冲突了。可以进入进程管理中,把手机助手杀掉。
通过adb shell 就可以方便的调试sqlite3数据库了。
小结,这小小的调试,遇到了很多坑。一点点跳出来了,也是蛮有意思的。
本文转自TBHacker博客园博客,原文链接:http://www.cnblogs.com/jiqing9006/p/7698030.html,如需转载请自行联系原作者
android 启动过程
android系统启动的时候首先会启动Linux的基础进程,加载Linux kernel启动初始化(init)进程。
接着,回启动Linux deamon(守护进程)会启动以下的内容:
①启动USBdusb管理守护进程来管理USB连接。
②启动adb守护进程来管理adb连接
③启动debugged守护进程来管理调试程序请求。
④启动ridle守护进程来管理无线管理进程. 请看图:
在启动init进程会启动守护进程同时,同时还会启动一个zygnote进程,其步骤如下:
①初始化一个davilk虚拟机实例
②装载一个socket请求所需的类和监听
③创建虚拟机实例来管理虚拟机的实例 如图所示:
再接着,需要初始化Runtime进程,其过程如下:
①注册服务管理器
②注册服务管理器,他作为默认的binder作为context管理器。
经接着,一个Runtime进程请求到zygnote创建一个davilk虚拟机的实例,如图:
这样,一个android实例已经启动了。
Android Day01-DDMS和ADB的使用
一、DDMS的使用
DDMS 的全称是Dalvik Debug Monitor Service,是 Android 开发环境中的Dalvik虚拟机调试监控服务。它为我们提供例如:为测试设备截屏,针对特定的进程查看正在运行的线程以及堆信息、Logcat、广播状态信息、模拟电话呼叫、接收SMS、虚拟地理坐标等等。
进入DDMS之后,界面如下:
二、ADB的使用
adb环境变量的配置:
http://jingyan.baidu.com/article/17bd8e52f514d985ab2bb800.html
adb的全称为Android Debug Bridge,就是起到调试桥的作用。通过adb我们可以在Eclipse中方便通过DDMS来调试Android程序,说白了就是debug工具。
在使用adb指令之前,应该将adb所在目录配置到环境变量Path中去,这样在CMD命令行就能直接使用adb指令。
常用adb命令:
https://www.cnblogs.com/bravesnail/articles/5850335.html
1.adb devices:列出当前电脑连接的所有Android设备(包括真机和模拟器),可以查看设备的序列号,作为设备的唯一标识。
2.adb占用的端口是5037,可以在cmd中输入 netstat -oan命令来列出当前电脑所占有的所有端口,通过查看5037端口对应的PID,去任务管理器查询,就知道是哪个应用程序占据了这个端口,可以将这个程序关掉。
3.adb kill-server:中断adb服务,在DDMS中的devices可以看到设备会消失。
4.adb start-server:重启adb服务,在DDMS中的devices中可以看到设备又出现了。
5.adb [-s android设备序列号] install [-r] APK文件的带盘符路径:安装应用程序。
如果设备多于1台设备,需要指定-s加参数指定设备序列号(可以通过devices命令查看)
-r指的是强制安装,即如果不用-r,如果设备上有将要安装的这个应用程序,会安装失败。如下图:
如果你想把网络上下载的APP安装到虚拟机上,就要用到这个命令.
6. adb [-s android设备序列号] uninstall 应用程序包名:卸载应用程序。
如果设备多于1台设备,需要指定-s加参数指定设备序列号(可以通过devices命令查看)
因为应用程序的包名可以唯一标识应用程序,通过包名就可以卸载应用程序。
7. adb [-s android设备序列号] shell:进入设备的linux目录,命令会出现#,表示等待用户输入linux指令。在DDMS中的File Explorer的设备文件目录,就是用linux指令来列出来的。
# ls -l:列出手机目录信息
# logcat:查看手机日志信息
8. adb pull :将文件从设备拷贝到电脑
9. adb push :将文件从电脑拷贝到设备
10. # cat 文件名(带后缀) 打印文件内容,比如在向sp更新内容之后,不必要每次都把文
件pull到电脑上查看,可以使用这个命令在打印文件查看内容。
11.adb wifi调试
1)手机开一个wifi,让电脑连上。
2)命令行 adb tcpip 5555
3) 命令行 adb connect 192.168.43.1(固定)
ADB的实际应用场景
1.安装APK adb install , 如果有了apk,但是没有什么手机助手。只能用这种方式安装了。
2.我们公司的设备,一开始设备装了个应用,会自动启动。应用将回退按钮给屏蔽了,系统也没有悬浮球操作按钮,无法回到桌面。我就想了使用adb
查看手机运行的进程 http://blog.csdn.net/xingchenxuanfeng/article/details/50386689 adb shell ps
根据这个应用的名字,我大致就猜出了它的包名,执行adb uninstall 包名果断卸载,然后adb install 我的应用包名
我的应用装上了,我也想回到桌面啊,uninstall自己的应用太low了,用 adb shell am force-stop 包名,即可停止应用 。
3) adb shell input key event 4 (模拟android系统的返回键)
键值参考:http://blog.csdn.net/itfootball/article/details/37567373
ADB使用的问题
1) file explore下的data/data目录不显示:https://www.cnblogs.com/smyhvae/p/3881477.html
adb shell
su
chmod 777 data (一级一级的去改变权限)
本文转自屠夫章哥 51CTO博客,原文链接:http://blog.51cto.com/4259297/1673947,如需转载请自行联系原作者
使用adb命令停止APP后台进程的方法
0. 环境描述
① 宿主机系统:Ubuntu 14.04 Desktop② 客户机系统:Android-x86 4.4 R2③ SDK版本:android-sdk_r24.2-linux④ 虚拟化方案:KVM QEMU⑤ 联网方式:NAT⑥ 宿主机IP:192.168.1.109⑦ 客户机IP:192.168.122.131⑧ 示例APP:搜狐视频
1. 启动客户机
① 通过VNC连接至宿主机;② 在宿主机中找到并运行:Applications → System Tools → Virtual Machine Manager;③ 在KVM的图形界面中运行先前创建好的Android-x86虚拟机。
2. ADB连接至客户机
在宿主机的shell中运行以下命令:
adb connect 192.168.122.131:5555
若上述命令的输出如下所示,则表示连接成功:
3. 检查搜狐视频是否在运行
在宿主机的shell中运行以下命令:
adb shell ps | grep sohu
若上述命令的输出如下所示,则表明当前没有运行搜狐视频:
4. 运行搜狐视频APP
① 查找运行入口
使用APKTool工具反编译搜狐视频的APK安装文件(SohuVideo_Android_Phone.apk),得到如下文件列表:
其中的AndroidManifest.xml文件包含APP的启动信息,几乎每个APP的APK文件反编译之后都具有这个文件。
使用Notepad++打开AndroidManifest.xml文件,查找关键字“android.intent.category.LAUNCHER”或“android.intent.action.MAIN”,此时可以找到APP的入口动作:
其中的“.FirstNavigationActivityGroup”便是便是搜狐视频的入口动作,下面通过adb启动APP时需要用到。
② 在宿主机的shell中运行以下命令:
adb shell am start -a android.intent.action.MAIN -n com.sohu.sohuvideo/.FirstNavigationActivityGroup
若上述命令的输出如下所示,则表明运行搜狐视频成功:
此时观察客户机,可以发现搜狐视频已经成功运行:
5. 关闭搜狐视频APP
① 找到搜狐视频的系统进程
在宿主机的shell中运行以下命令:
adb shell ps | grep sohu
若上述命令的输出如下所示,则表示找到搜狐视频的进程:
搜狐视频的进程名为“com.sohu.sohuvideo”。
② 此处有两种方法关闭搜狐视频的进程,如下所示:
Method-A:
在宿主机的shell中运行以下命令:
adb shell am force-stop com.sohu.sohuvideo
若上述命令的输出如下所示,则表示成功杀死进程:
注意:
这种方法会强制停止APP进程,不会清除APP进程在系统中产生的数据。
Method-B:
在宿主机的shell中运行以下命令:
adb shell pm clear com.sohu.sohuvideo
若上述命令的输出如下所示,则表示成功杀死进程:
注意:
这种方法不仅会停止APP进程,而且会清除这个APP进程产生的所有数据。
③ 检查搜狐视频是否正在运行
在宿主机的shell中运行以下命令:
adb shell ps | grep sohu
若上述命令的输入如下所示,则表示已经成功停止搜狐视频的后台进程:
adb常用命令,技巧
安装、卸载apk
adb connect ip:31015 指定端口连接,如果不指定端口,默认端口一般为5555
adb disconnect 断开连接
adb uninstall com.app.lication 卸载软件 强制卸载
adb shell cd /data/app 或者 cd /system/app (查找应用包名) ls 查看有没我们的APK安装包 rm apk文件名 exit mount -o rw,remount /system 改变文件的只读属性
adb install /path/to/file.apk 安装包的绝对路径 adb install -r /path/to/file.apk 强制安装apk
安装到sysystem路径下,可能需要root权限
adb shell 进入系统命令行 mount -o remount rw /system 用读写重新加载/system
exit 退到adb模式 adb push /path/to/file.apk 安装包的绝对路径
查找apk安装路径
cat /data/system/packages.xml 或cat /data/system/packages.xml|grep XXX
打印日志
adb logcat -v time 打印日志 adb logcat -v time >> d:/a.txt 将打印日志保存在D盘,命名为a.txt ctrl +c 停止 adb shell bugreport > d:/1.txt 包括内存分配,cpu使用情况,按键分发,组件状态,虚拟内存状态 adb pull /data/anr/traces.txt d:/traces.txt 程序无响应日志导出 adb logcat -c 清除信息
截图
机顶盒截图: adb shell /system/bin/screencap -p /data/XX.png 将截图推到本地 adb pull /data/XX.png > D:/png/XX.png
apk操作
adb shell am start com.app.lication 启动apk am force-stop com.app.lication 强制停止 pm clear com.app.lication 清除缓存
设置DNS和hosts
DNS adb shell setprop net.dns1 8.8.8.8 setprop net.dns2 8.8.4.4 hosts echo "10.0.0.1 baidu.com" >>/etc/hosts
other
getprop | grep dns 查看stb的dns信息 netcfg 查看网卡信息
遇到问题描述:Android Please ensure that adb is correctly located at问题解决
遇到问题描述:
运行android程序控制台输出
[2013-11-04 16:18:26 - ] The connection to adb is down, and a severe error has occured.
[2013-11-04 16:18:26 - ] You must restart adb and Eclipse.
[2012-11-04 16:18:26 - ] Please ensure that adb is correctly located at 'D:\java\sdk\platform-tools\adb.exe' and can be executed.
1. 解决问题:
百度google大家多说的是任务管理器 kill掉adb 或者重启adb server,但我任务管理器就没有adb ,猜测是某个程序占用了adb端口。于是按此思路查找。
5037为adb默认端口 查看该端口情况如下:
netstat -aon|findstr "5037"
TCP 127.0.0.1:5037 0.0.0.0:0 LISTENING 6540
发现6540占用了 5037端口,继续查看6540的task,发现是wandoujia .如下所示
tasklist|findstr "6540"
wandoujia_daemon.exe 6540 Console 1 4,276 K
接下来问题就好解决了,在任务管理器kill掉wandoujia_daemon.exe ,运行android程序,ok .
2. 将android-sdk-windows/platform-tools和android-sdk-windows/tools都加到环境变量中去。
(classpath或者path)
我都试过了还是不行,继续百度中。。。。。。。。。。
3.我把豌豆荚给卸载了,还是不行,最后:
今天遇见了这个问题 因为我更新了最新的adt 出现ADB server didn't ACK, failed to start daemon 然后你想启动一个程序 这个时候又会出现 Please ensure that adb is correctly located at 'D:\android-sdk-windows\platform-tools\adb.exe' and can be executed. "
首先呢 查看是否查看任务管理器,是否有关闭所有adb.exe 有的关掉
将将android-sdk-windows\platform-tools和android-sdk-windows\tools都加到环境变量中去
测试一下能启动不能 如果不能
运行一下命令行
adb kill-server
adb start-server
这个时候可能出现
D:\android-sdk-windows\platform-tools>adb kill-server
D:\android-sdk-windows\platform-tools>adb start-server
* daemon not running. starting it now on port 5037 *
ADB server didn't ACK
* failed to start daemon *
如果还是有毛病 这个时候唯一的选择,我这里呢 没有听从网上的 说啥重启机器 重启eclipse,我的办法是
在eclipse中的android管理器中也就是 avd Manager中 选择 第一个选项 虚拟设备virtural device从里面找到一个模拟机启动 当启动起来之后 关掉你的eclipse 在重新启动 就好了
这里说命的一点是 一定要注意 虚拟设备一定要先开 然后在重启eclipse 至少我的方法是这样子的
注意一个顺序问题
使得我的问题是解决了,可是又出现了:
ActivityManager: Starting: Intent { act=android.intent.action.MAIN cat=[android.intent.category.LAUNCHER] cmp=com.android_denglu/.MainActivity }
ActivityManager: Warning: Activity not started, its current task has been brought to the front
很是纠结,继续百度ing....................
百度中的大神说:删了AVD重新建一个,我试一下,希望成功吧。
我晕死,又出现emulator-arm.exe已停止工作的问题。现在虚拟机都不出来一个了。。。。。。。。。。
解决方法:在创建avd的 时候有个hardware 选项 ,点击new ,里面可以看见 GPU emulation 选择yes ,然后我的android界面就出来了,问题真是纠结死人了。。。。。。。。
Android的logcat日志工具使用详解
logcat是Android中一个命令行工具,可以用于得到程序的log信息。Android日志系统提供了记录和查看系统调试信息的功能。日志都是从各种软件和一些系统的缓冲区中记录下来的,缓冲区可以通过 logcat 命令来查看和使用。
一、环境描述
宿主机OS:CentOS 6.6 x86_64宿主机IP:192.168.1.119虚拟机OS:Android-x86 4.4-r2虚拟机IP:192.168.1.126网络方式:BridgeAndroid SDK版本:android-sdk_r24.2-linuxKVM版本:QEMU PC emulator version 0.12.1 (qemu-kvm-0.12.1.2-2.448.el6_6.3)
二、logcat命令的基本用法
1. logcat命令使用格式
[adb] logcat [<option>] ... [<filter-spec>] ...
2. 两种使用方式
在宿主机上使用:
$ adb logcat
在虚拟机或手机上使用:
# logcat
三、过滤日志输出
每一条输出的Android日志信息都有一个标签和优先级。
1. 日志标签
日志的标签是系统部件原始信息的一个简要的标志。(比如:“View”就 是查看系统的标签)。
2. 日志优先级
日志优先级有下列几种,按照从低到高顺序排列:
V — Verbose(最详细的日志,最低优先级)
D — Debug(调试)
I — Info(信息)
W — Warning(警告)
E — Error(错误)
F — Fatal(致命错误)
S — Silent(静默,最高优先级,不会输出任何信息)
3. 日志过滤器
在运行logcat的时候在前两列的信息中你就可以看到 logcat 的标签列表和优先级别,它是这样标出的:<priority>/<tag>。
下面是一个logcat输出的例子,它的优先级是I,标签是ActivityManage:
I/ActivityManager (585): Starting activity: Intent { action=android.intent.action...}
为了让日志输出能够体现管理的级别,你还可以用过滤器来控制日志输出,过滤器可以帮助你描述系统的标签等级。
过滤器语句按照下面的格式描述:
tag:priority ...
其中,tag表示标签,priority表示相应标签日志的最低优先级。
从上面的tag的中可以得到日志的标签和优先级。你可以在过滤器中多次描述tag:priority。
4. 使用实例
请查看以下使用实例:
adb logcat ActivityManager:I MyApp:D *:S
上述实例表示支持所有的日志信息,除了标签为“ActivityManager”和优先级为“Info”以上的日志,以及标签为“MyApp”和优先级为“Debug”以上的日志。上述实例中的最后的元素*:S,意味着将所有其他标签的优先级设置为“Silent”,所有日志只显示有“ActivityManager”和“MyApp”标签的。*:S的另一个用处是能够确保日志输出的时候是按照过滤器的说明限制的,也让过滤器作为一项输出到日志中。
下面的过滤语句只显示优先级为“Warning”或更高优先级的日志信息:
adb logcat *:W
如果你在宿主机上运行logcat,相比起在远程adb shell端,你还可以为环境变量ANDROID_LOG_TAGS指定一个参数来设置默认的过滤器:
export ANDROID_LOG_TAGS="ActivityManager:I MyApp:D *:S"
注意,如果通过远程shell运行logcat命令,或者运行adb shell logcat命令,那么将不能使用ANDROID_LOG_TAGS中设置的过滤器。
四、指定日志输出格式
日志信息包括很多元数据域,例如标签和优先级。可以修改日志的输出格式,指定显示特定的元数据域。可以通过-v 选项得到格式化输出日志的相关信息:
brief — 显示源进程的优先级/标签和PID(默认格式)。
process — 只显示PID。
tag — 只显示优先级/标签。
thread — 只显示进程 : 线程和优先级/标签。
raw — 显示原始的日志消息,没有其他的元数据域。
time — 显示源进程的日期、调用时间、优先级/标签和PID。
long — 显示所有的元数据域和单独的消息,带有一个空行。
启动logcat时,你可以通过-v选项来指定日志输出格式:
[adb] logcat [-v <format>]
以下实例使用thread来指定日志输出格式:
adb logcat -v thread
注意,你只能使用-v选项来指定日志输出格式的选项。
五、查看可用的日志缓冲区
我们在使用logcat抓取日志的时候,可以指定buffer,来请求不同的环形缓冲区 ('main', 'system', 'radio', 'events',默认为"-b main -b system"),因为Android日志系统为日志消息保持了多个循环缓冲区,而且不是所有的消息都被发送到默认缓冲区,要想查看这些附加的缓冲区,可以使用-b选项,以下是可以指定的缓冲区:
radio — 查看包含在无线/电话相关的缓冲区消息。
events — 查看事件相关的日志消息。
main — 查看主缓冲区(默认缓冲区)。
system — 查看系统相关的日志消息。
-b选项的使用方法如下所示:
[adb] logcat [-b <buffer>]
以下实例表示如何查看包含无线和电话的日志消息:
adb logcat -b radio
六、查看标准输出和标准错误
在默认状态下,Android系统会将标准输出和标准错误(System.out和System.err)输出到/dev/null,在运行Dalvik VM的进程中,有一个系统可以备份日志文件。在这种情况下,系统会用标准输出和标准错误,以及优先级 I 来记录日志消息。
通过以下方法可以指定日志输出的路径,停止运行的模拟器/设备,然后使用setprop命令远程输入日志:
$ adb shell stop
$ adb shell setprop log.redirect-stdio true
$ adb shell start
七、logcat命令选项
选项
描述
-b <buffer>
请求可选择的环形缓冲区,main、system、radio或events。可以使用多个-b参数,输出的结果是交错的。默认值为-b main -b system。
-c
清除全部日志,然后退出。
-d
转储日志,然后退出(不会阻塞)。
-f <filename>
将日志输出至文件。默认为标准输出(stdout)。
-g
获取日志环形缓冲区的大小,然后退出。
-n <count>
通过指定轮转日志的最大数量,默认为4。
-r <kbytes>
每千字节就轮转一次日志。若没有指定,则默认值为16。需要使用-f选项。
-s
"将默认的过滤器设置为静默。就像是指定过滤器描述符“*:S”。
-v <format>
"设置日志的输出格式,其中<format>是下面其中之一:brief、process、tag、thread、raw、time、threadtime、long"
-t <count>
只输出最近几行的日志,行数由<count>指定(隐含-d选项)。
-B
以二进制方式输出日志。
八、在kvm环境中使用logcat
1. 启动Android-x86虚拟机
在virt-manager的图形界面中启动Android-x86虚拟机,如下图所示:
在shell中运行ps aux | grep kvm命令,可以看到这个虚拟机的进程详情,如下图所示:
2. 从宿主机连接至虚拟机
在shell中运行以下命令:
adb connect 192.168.1.126
若命令返回如下图所示,则表示连接成功:
3. 运行logcat命令
在shell中运行以下命令:
adb logcat
若命令返回和下图中类似,则表明已经看到Android虚拟机中的日志消息:
图解ADB工作原理,建议收藏!
介绍Android 调试桥 (adb) 是一种功能多样的命令行工具,它可以让你与设备进行通信,adb 命令可用于执行各种设备操作(例如安装和调试应用),并提供对 Unix shell(可用来在设备上运行各种命令)的访问权限,它是一种C/S架构的程序,包括以下三个组件:客户端:主要用于发送命令,adb client在开发机器上运行,你可以通过发出 adb 命令从命令行终端调用客户端,它主要的工作是:解析像:push、shell、install等命令的参数,做必要预处理,然后转移为指令或数据,发送给adb server。守护程序 (adbd):是运行在Android设备(真机/模拟器)后台的一个进程,它是由init进程启动的,并且系统一开机就已经启动,它的主要作用是处理来自 adb server的命令行请求,然后获取对应Android设备的信息,再将结果返回给adb server。服务器:是运行在开发机器上的一个后台进程,它有两个作用:1)检测USB端口感知设备的连接和拔除,以及模拟器实例的启动或停止;2)将adb client的请求通过usb或者tcp的方式发送到对应的adbd上。工作原理当你启动某个 adb 客户端时,该客户端会先检查是否有 adb 服务器进程正在运行,如果没有,它会先启动服务器进程,服务器在启动后会与本地 TCP 端口 5037 绑定,并监听 adb 客户端发出的命令(所有 adb 客户端均通过端口 5037 与 adb 服务器通信)如下图:然后,服务器会与所有正在运行的设备建立连接,它通过扫描 5555 到 5585 之间(该范围供前 16 个模拟器使用)的奇数号端口查找模拟器,服务器一旦发现 adb 守护程序 (adbd),便会与相应的端口建立连接,请注意,每个模拟器都使用一对按顺序排列的端口(用于控制台连接的偶数号端口和用于 adb 连接的奇数号端口)例如:模拟器 1,控制台:5554
模拟器 1,adb:5555
模拟器 2,控制台:5556
模拟器 2,adb:5557
依此类推如上所示,在端口 5555 处与 adb 连接的模拟器与控制台监听端口为 5554 的模拟器是同一个。服务器与所有设备均建立连接后,你便可以使用 adb 命令访问这些设备,由于服务器管理与设备的连接,并处理来自多个 adb 客户端的命令,因此你可以从任意客户端(或从某个脚本)控制任意设备。通信流程如下图:举个例子:我们通过Android Studio工具或者命令行界面直接或间接的调用某个adb命令,比如adb install或者adb devices这时候adb进程会fork出一个子进程作为adb server,而这个fork出的进程将常驻PC端,监听来自Client端的请求adb server查找当前连接的真机或者模拟器,并接收来自Client端发出的请求adb server处理请求:如果是本地能直接处理的请求比如:adb devices就直接处理,如果是本地处理不了的请求就会转发给连接的真机或者模拟器来进行处理,可以通过数据线和TCP/IP的方式通信位于真机或者模拟器后台的adbd进程接收到请求后,通过JDWP协议转发给对应的Java虚拟机进程处理adbd将处理后的结果返回给adb serveradb server再将结果返回给Client,这时候我们就在命令行界面中看到展示结果了