1.首先在手机上开启USB调试功能,并安装驱动(这一步很多手机助手都可以完成)。
2.用USB电缆连接手机和电脑。
3.确保手机和电脑在一个局域网内,简单的说就是电脑和手机共用一个路由器,网段一样。
4.打开电脑上CMD窗口,输入以下命令:
adb tcpip 5555(该命令打开手机adb网络调试功能)
正常情况下输入命令后控制台会出现回显
restarting in TCP mode port: 5555
打开手机查看手机的IP地址(不会请百度)假设手机的地址是192.168.1.x输入命令
adb connect 192.168.1.x
如果一切正常控制台会回显以下内容
connected to 192.168.1.x:5555
如果你想查看是否连接成功请输入以下内容
adb devices
控制台会回显连接的设备
5.如果一切连接成功,请拔掉USB电缆,选择File->Build&Run,在编译之前要勾选上Development Build 和Script Debugging这两项(在build setting里面勾选不要忘记否则是不能调试的)电脑会自动编译文件并将APK推送至手机,在手机上同意并安装。
6.当程序运行后再Monodevelop里面打开Run->Attach to process 会发现你手机的选项,选择手机,在脚本里面添加断点,你发现可以调试了,那叫一个爽!出现问题再也不用去瞎猜,或者添加Debuglog了。
开发过程中,解决各种问题bug,不管是性能问题还是ANR问题,还是各种严重崩溃问题,经常需要抓取log,从log中分析找到问题源头,并进行修改。
但是,统一时间点下,可能会有很多log打印出来,分属于各个不同的进程。因此,我们需要的部分可能已经被淹没了。因此,使用工具或者命令抓取需要的log部分,并尽可能少的减少遗漏,是非常有必要的。
通常情况下,可以使用工具。
因此,使用命令抓取变得很重要,这里就自己总结下adb相关的命令。
比如eclipse 的logcat可以直接查看log输出,但是有个问题就是在手机设备没有连接的情况下,是很恼火的。比如我需要开机log,可以直接使用adb抓取到txt文件中就OK了。google的同时自己整理了一下。不喜勿喷。
adb logcat 命令使用帮助说明;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
logcat: option requires an argument -- v
Unrecognized Option
Usage: logcat [options] [filterspecs]
options include:
-s Set
default
filter to silent.
Like specifying filterspec
'*:s'
-f
-r [
16
if
unspecified). Requires -f
-n
default
4
-v
brief process tag thread raw time threadtime
long
-c clear (flush) the entire log and exit
-d dump the log and then exit (don't block)
-t
-g get the size of the log's ring buffer and exit
-b
'main'
,
'system'
,
'radio'
or
'events'
. Multiple -b parameters are allowed and the
results are interleaved. The
default
is -b main -b system.
-B output the log in binary
filterspecs are a series of
where
for
all) and priority is:
V Verbose
D Debug
I Info
W Warn
E Error
F Fatal
S Silent (supress all output)
'*'
means
'*:d'
and
If not specified on the commandline, filterspec is set from ANDROID_LOG_TAGS.
If no filterspec is found, filter defaults to
'*:I'
If not specified with -v, format is set from ANDROID_PRINTF_LOG
or defaults to
"brief"
|
抓取log之前先清除缓存的log信息。
1
2
|
appledeMacBook-Pro:~ apple$ adb logcat -c
appledeMacBook-Pro:~ apple$
|
或者你可以这样写
1
2
3
4
5
|
appledeMacBook-Pro:~ apple$ adb logcat -c && adb logcat
--------- beginning of /dev/log/main
E/cynicok (
16917
): receive a heartbeat msg: H!
I/Wisdom_ConnectSdk(
16917
): request
long
connection success and the state =
200
I/Wisdom_ConnectSdk(
16917
): receive the heart message H
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
appledeMacBook-Pro:~ apple$ adb logcat
--------- beginning of /dev/log/main
D/AppOps (
1989
): startOperation: allowing code
40
uid
1000
package
android
D/NtpTrustedTime(
1989
): currentTimeMillis() cache hit
--------- beginning of /dev/log/system
D/PowerManagerService(
1989
): newScreenState =
0
D/PowerManagerService(
1989
): updateDisplayPowerStateLocked: mBootCompleted =
true
, mScreenBrightnessSettingDefault =
165
D/PowerManagerService(
1989
): updateDisplayPowerStateLocked: xxxx =
187
D/PowerManagerService(
1989
): Package Lib: shouldUseProximitySensorLocked mLidMode =
false
D/PowerManagerService(
1989
): updateDisplayPowerStateLocked: yyyyy =
187
D/PowerManagerDisplayController(
1989
): changed is
false
, mPendingRequestChangedLocked =
false
D/NtpTrustedTime(
1989
): currentTimeMillis() cache hit
D/NtpTrustedTime(
1989
): currentTimeMillis() cache hit
|
使用I,V,D,E,F,W等过滤
和Log.i ,Log.e ,Log.d,Log.w等对应。
1
2
3
4
5
6
7
8
9
10
11
12
|
appledeMacBook-Pro:~ apple$ adb logcat *:I
--------- beginning of /dev/log/main
--------- beginning of /dev/log/system
E/cynicok (
16917
): receive a heartbeat msg: H!
I/Wisdom_ConnectSdk(
16917
): request
long
connection success and the state =
200
I/Wisdom_ConnectSdk(
16917
): receive the heart message H
E/cynicok (
16917
): receive a heartbeat msg: H!
I/Wisdom_ConnectSdk(
16917
): request
long
connection success and the state =
200
I/Wisdom_ConnectSdk(
16917
): receive the heart message H
E/cynicok (
16917
): receive a heartbeat msg: H!
I/Wisdom_ConnectSdk(
16917
): request
long
connection success and the state =
200
I/Wisdom_ConnectSdk(
16917
): receive the heart message H
|
输出指定标签的日志.后面必须是*:S
1
2
3
4
|
appledeMacBook-Pro:~ apple$ adb logcat Wisdom_ConnectSdk:* *:S
--------- beginning of /dev/log/main
--------- beginning of /dev/log/system
I/Wisdom_ConnectSdk(
16917
): request
long
connection success and the state =
200
|
1
2
3
4
5
6
7
8
9
|
appledeMacBook-Pro:~ apple$ adb logcat -v time
--------- beginning of /dev/log/main
02
-
08
12
:
18
:
48.700
D/eup (
17972
): rqdp{ current unseen pn:}com.tencent.androidqqmail:Push
02
-
08
12
:
18
:
49.810
D/MSF.C.NetConnTag(
2700
): [E]netRecv ssoSeq:
2023997818
uin:*
9889
cmd:-
316037937
2023998098
02
-
08
12
:
18
:
49.840
D/Q.msg.TroopMsgProxy(
18335
): [E]insertToList MessageRecord=friendUin:2824senderuin:
9517
,istroop:
1
,msgType:-
1000
,time:
1423369131
,shmsgseq:
33949
02
-
08
12
:
18
:
50.630
D/MSF.C.NetConnTag(
2700
): [E]netRecv ssoSeq:
2024000051
uin:*
9889
cmd:
961141751
2024000635
02
-
08
12
:
18
:
50.665
D/MSF.C.NetConnTag(
2700
): [E]pa ok:
93239
02
-
08
12
:
18
:
50.670
D/MSF.C.NetConnTag(
2700
): [E]netSend ssoSeq:
93239
uin:*
9889
cmd:-
183665717
93419
--------- beginning of /dev/log/system
|
-v 设置log的打印格式。上面的time显示时间。
process 只显示进程id
1
2
3
4
5
6
|
appledeMacBook-Pro:~ apple$ adb logcat -c
appledeMacBook-Pro:~ apple$ adb logcat -v process
--------- beginning of /dev/log/main
E(
16917
) receive a heartbeat msg: H! (cynicok)
I(
16917
) request
long
connection success and the state =
200
(Wisdom_ConnectSdk)
I(
16917
) receive the heart message H (Wisdom_ConnectSdk)
|
1
2
3
4
5
6
7
8
9
|
appledeMacBook-Pro:~ apple$ adb logcat -v tag
--------- beginning of /dev/log/main
E/cynicok : receive a heartbeat msg: H!
I/Wisdom_ConnectSdk: request
long
connection success and the state =
200
I/Wisdom_ConnectSdk: receive the heart message H
I/System.out: AsyncExecImpl : add task, s =
1
D/SyncMainManager: requestInstantSync check local data : quickReply
--------- beginning of /dev/log/system
D/ActivityManager: Not moving, persistent: ProcessRe
|
1
2
3
4
5
6
7
8
9
10
|
appledeMacBook-Pro:~ apple$ adb logcat -v thread
--------- beginning of /dev/log/main
E(
16917
:
16936
) receive a heartbeat msg: H!
I(
16917
:
16917
) request
long
connection success and the state =
200
I(
16917
:
16917
) receive the heart message H
I(
2235
:
2235
) AsyncExecImpl : add task, s =
1
D(
2235
:
20109
) requestInstantSync check local data : quickReply
--------- beginning of /dev/log/system
D(
1989
:
3972
) Not moving, persistent: ProcessRecord{41fd2488
2173
:com.android.phone/
1001
}
D(
1989
:
2186
) noteOperation: allowing code
14
uid
10042
package
com.meizu.mzsyncservice
|
adb logcat | grep PID
adb logcat | grep --color= auto PID
1
2
3
4
5
6
7
|
appledeMacBook-Pro:~ apple$ adb logcat | grep
16917
E/cynicok (
16917
): receive a heartbeat msg: H!
I/Wisdom_ConnectSdk(
16917
): request
long
connection success and the state =
200
I/Wisdom_ConnectSdk(
16917
): receive the heart message H
E/cynicok (
16917
): receive a heartbeat msg: H!
I/Wisdom_ConnectSdk(
16917
): request
long
connection success and the state =
200
I/Wisdom_ConnectSdk(
16917
): receive the heart message H
|
1
2
3
4
5
|
appledeMacBook-Pro:~ apple$ adb logcat | grep --color=auto
16917
E/cynicok (
16917
): receive a heartbeat msg: H!
I/Wisdom_ConnectSdk(
16917
): request
long
connection success and the state =
200
I/Wisdom_ConnectSdk(
16917
): receive the heart message H
E/cynicok (
16917
): receive a heartbeat msg: H!
|
先查看程序进程pid。下面这个命令也可以看到该进程使用内存相关情况。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
appledeMacBook-Pro:~ apple$ adb shell dumpsys meminfo com.wisdom.wisdomapp
Applications Memory Usage (kB):
Uptime:
14917420
Realtime:
24328990
** MEMINFO in pid
16835
[com.wisdom.wisdomapp] **
Pss Private Private Swapped Heap Heap Heap
Total Dirty Clean Dirty Size Alloc Free
------ ------ ------ ------ ------ ------ ------
Native Heap
0
0
0
0
22396
20994
653
Dalvik Heap
26814
26660
0
0
29228
28344
884
Dalvik Other
1603
1512
0
0
Stack
24
24
0
0
Other dev
4
0
4
0
.so mmap
1125
732
0
0
.apk mmap
5
0
0
0
.ttf mmap
0
0
0
0
.dex mmap
307
28
0
0
Other mmap
10
8
0
0
Unknown
20246
20240
0
0
TOTAL
50138
49204
4
0
51624
49338
1537
|
1
2
3
4
5
6
7
8
|
appledeMacBook-Pro:~ apple$ adb shell service
Usage: service [-h|-?]
service list
service check SERVICE
service call SERVICE CODE [i32 INT | s16 STR] ...
Options:
i32: Write the integer INT into the send parcel.
s16: Write the UTF-
16
string STR into the send parcel.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
appledeMacBook-Pro:~ apple$ adb shell service list
Found
92
services:
0
secsystemserver: [com.lbe.security.service.core.loader2.internal.ISystemServer]
1
secloader2: [com.lbe.security.service.core.loader2.internal.ILoaderServiceEx]
2
sip: [android.net.sip.ISipService]
3
phone_ext: [com.meizu.telephony.ITelephonyExt]
4
phone: [com.android.internal.telephony.ITelephony]
5
iphonesubinfo: [com.android.internal.telephony.IPhoneSubInfo]
6
simphonebook: [com.android.internal.telephony.IIccPhoneBook]
7
isms: [com.android.internal.telephony.ISms]
8
gesture_manager: [android.view.IGestureManager]
9
deivce_states: [android.os.IDeviceStateService]
10
access_control: [android.content.IAccessControlManager]
11
media_router: [android.media.IMediaRouterService]
12
print: [android.print.IPrintManager]
13
dreams: [android.service.dreams.IDreamManager]
|
python值得学习。有空是要学习下。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
|
#!/usr/bin/env python
#coding:utf-
8
#This script is aimed to grep logs by application(User should input a packageName and then we look up
for
the process ids then separate logs by process ids).
import
os
import
sys
packageName=str(sys.argv[
1
])
command =
"adb shell ps | grep %s | awk '{print $2}'"
%(packageName)
p = os.popen(command)
##
for
some applications,there are multiple processes,so we should get all the process id
pid = p.readline().strip()
filters = pid
while
(pid !=
""
):
pid = p.readline().strip()
if
(pid !=
''
):
filters = filters +
"|"
+ pid
#print
'command = %s;filters=%s'
%(command, filters)
if
(filters !=
''
) :
cmd =
'adb logcat | grep --color=always -E "%s" '
%(filters)
os.system(cmd)
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
appledeMacBook-Pro:Desktop apple$ python logcat.py com.wisdom.wisdomapp
E/cynicok (
16917
): receive a heartbeat msg: H!
I/Wisdom_ConnectSdk(
16917
): request
long
connection success and the state =
200
I/Wisdom_ConnectSdk(
16917
): receive the heart message H
E/cynicok (
16917
): receive a heartbeat msg: H!
I/Wisdom_ConnectSdk(
16917
): request
long
connection success and the state =
200
I/Wisdom_ConnectSdk(
16917
): receive the heart message H
E/cynicok (
16917
): receive a heartbeat msg: H!
I/Wisdom_ConnectSdk(
16917
): request
long
connection success and the state =
200
I/Wisdom_ConnectSdk(
16917
): receive the heart message H
E/cynicok (
16917
): receive a heartbeat msg: H!
I/Wisdom_ConnectSdk(
16917
): request
long
connection success and the state =
200
I/Wisdom_ConnectSdk(
16917
): receive the heart message H
E/cynicok (
16917
): receive a heartbeat msg: H!
I/Wisdom_ConnectSdk(
16917
): request
long
connection success and the state =
200
|
ps命令过滤查看。
1
2
3
4
|
appledeMacBook-Pro:Desktop apple$ adb shell
shell
@mx2
:/ $ ps | grep com.meizu.flyme.weather
system
9175
1567
880208
32432
ffffffff
00000000
S com.meizu.flyme.weather
shell
@mx2
:/ $
|
adb 这么多命令,我该快速的用呢。其实早就有大神解决了这个问题。
git 地址 :https://github.com/JakeWharton/pidcat
这个开源代码pidcat在mac上面使用需要安装HomeView
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
^CappledeMacBook-Pro:Desktop apple$ ruby -e
"$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
==> This script will install:
/usr/local/bin/brew
/usr/local/Library/...
/usr/local/share/man/man1/brew.
1
Press RETURN to
continue
or any other key to abort
==> /usr/bin/sudo /bin/mkdir /usr/local
Password:
==> /usr/bin/sudo /bin/chmod g+rwx /usr/local
==> /usr/bin/sudo /usr/bin/chgrp admin /usr/local
==> /usr/bin/sudo /bin/mkdir /Library/Caches/Homebrew
==> /usr/bin/sudo /bin/chmod g+rwx /Library/Caches/Homebrew
==> Downloading and installing Homebrew...
remote: Counting objects:
229812
, done.
remote: Compressing objects:
100
% (
60244
/
60244
), done.
remote: Total
229812
(delta
168312
), reused
229812
(delta
168312
)
Receiving objects:
100
% (
229812
/
229812
),
52.82
MiB |
1022
KiB/s, done.
Resolving deltas:
100
% (
168312
/
168312
), done.
From https:
//github.com/Homebrew/homebrew
* [
new
branch] master -> origin/master
HEAD is now at 9a0fbf6 moreutils: update
0.55
bottle.
==> Installation successful!
==> Next steps
Run `brew doctor` before you install anything
Run `brew help` to get started
appledeMacBook-Pro:Desktop apple$
|
截取:
Viewing Alternative Log Buffers
Android日志系统为日志消息保持了多个循环缓冲区,而且不是所有的消息都被发送到默认缓冲区,要想查看这些附加的缓冲区,可以使用-b
选项,以下是可以指定的缓冲区:
radio — 查看包含在无线/电话相关的缓冲区消息
events — 查看事件相关的消息
main — 查看主缓冲区 (默认缓冲区)
-
b 选项的用法:
1
|
[adb] logcat [-b
|
例如查看radio缓冲区:
1
|
adb logcat -b radio
|
保存Log到sd卡。
1
2
|
appledeMacBook-Pro:~ apple$ adb logcat -d -f /sdcard/test_log.txt
appledeMacBook-Pro:~ apple$
|
配置adb环境变量,并且将变量添加到
.bashrc
or
.zshrc
两个文件中
1
|
export PATH=$PATH:/Users/apple/Documents/Tools/IDE/adt-bundle-mac-x86_64-
20131030
/sdk/tools:/Users/apple/Documents/Tools/IDE/adt-bundle-mac-x86_64-
20131030
/sdk/platform-tools
|