系统日志分析

分析系统log:

adb logcat -b [ main / radio / event /system /crash /all ]

系统根据log类型,分为main,radio,events,system,crash

frameworks/base/core/java/android/util/Log.java //用于记录main log

frameworks/base/core/java/android/util/Slog.java //用于记录framework log

frameworks/base/telephony/java/android/telephony/Rlog.java //用于记录radio log

frameworks/base/core/java/com/android/internal/os/RuntimeInit.java //内部记录了crash log

分析event log

1.命令 adb logcat - b event

2 .event log文件格式

timestamp PID TID log-level log-tag tag-values

分为两部分看:

第一部分 timestamp PID TID log-level

第二部分 log-tag tag-values

2.2.1 第一部分(timestamp PID TID log-level)很容易理解

2.2.2 主要看第二部分(log-tag tag-values),以am相关的tags来讲述

在文件frameworks/base/services/core/java/com/android/server/am/EventLogTags.logtags中,存在如下一句log-tags定义(定义中的30014与am_proc_start是绑定的):

# Application process has been started

30014 am_proc_start (User|1|5),(PID|1|5),(UID|1|5),(Process Name|3),(Type|3),(Component|3)

而上面这句log-tags在/system/etc/event-log-tags中也同样存在,打印看下:

zhanghu@winth:~$ adb shell cat /system/etc/event-log-tags | grep am_proc_start

99:30014 am_proc_start (User|1|5),(PID|1|5),(UID|1|5),(Process Name|3),(Type|3),(Component|3)

即:/system/etc/event-log-tags 包含了系统所有EventLogTags.logtags文件中的log-tags的定义(EventLogTags.logtags文件根据系统服务的区别,存放在不同的路径下)

am_proc_start后面的跟的(User|1|5),(PID|1|5),(UID|1|5),etc 这些是什么意思呢?在system/core/logcat/event.logtags文件中有说明,摘录如下:

# (<name>|data type[|data unit])

# Multiple values are separated by commas.

#

# The data type is a number from the following values:

# 1: int

# 2: long

# 3: string

# 4: list

# 5: float

#

# The data unit is a number taken from the following list:

# 1: Number of objects

# 2: Number of bytes

# 3: Number of milliseconds

# 4: Number of allocations

# 5: Id

# 6: Percent

翻译如下:

数据类型:

1: int

2: long

3: string

4: list

5:float

数据类型中int和string用得最多.

数据单位:

1: Number of objects(对象个数)

2: Number of bytes(字节数)

3: Number of milliseconds(毫秒)

4: Number of allocations(分配个数)

5: Id

6: Percent(百分比)

2.2.3 实例解析

event log:

09-06 16:18:46.197 1632 2405 I am_proc_start: [0,4394,1000,com.android.usbsecurity,broadcast,com.android.usbsecurity/.UsbSecurityReceiver]

log-tag tag-values部分是下面这部分:

am_proc_start: [0,4394,1000,com.android.usbsecurity,broadcast,com.android.usbsecurity/.UsbSecurityReceiver]

根据am_proc_start这个关键字,在/system/etc/event-log-tags文件或在../server/am/EventLogTags.logtags中找到它的定义:

30014 am_proc_start (User|1|5),(PID|1|5),(UID|1|5),(Process Name|3),(Type|3),(Component|3)

根据上面这个定义我们就知道event log的tag-values这个值的含义了,放在一起对比下:

am_proc_start (User|1|5),(PID|1|5),(UID|1|5),(Process Name|3),(Type|3),(Component|3)

am_proc_start: [0,4394,1000,com.android.usbsecurity,broadcast,com.android.usbsecurity/.UsbSecurityReceiver]

含义:

进程启动: pid=4394,uid=1000, 进程名=com.android.usbsecurity, 类型broadcast,相应组件=com.android.usbsecurity/.UsbSecurityReceiver

上面am_proc_start生成位置在ActivityManagerService.startProcessLocked方法内,如下:

          EventLog.writeEvent\(EventLogTags.AM\_PROC\_START,

                    UserHandle.getUserId\(uid\), startResult.pid, uid,

                    app.processName, hostingType,

                    hostingNameStr != null ? hostingNameStr : ""\);

EventLogTags.AM_PROC_START这句的EventLogTags引自自动生成的文件(out/target/common/obj/JAVA_LIBRARIES/services.core_intermediates/src/java/com/android/server/am/EventLogTags.java)

out/target/common/obj/JAVA_LIBRARIES/services.core_intermediates/src/java/com/android/server/am/EventLogTags.java

3.实例分析

logcat_events.txt

Line 26: Line 3847: 01-02 13:03:58.149279 887 901 I am_pss : [16438,10036,com.android.systemui,52458496,47415296,146432]

16438 Pid 进程id

10036 Uid 用户id,Android作为单用户系统,Uid用于数据共享,可在AndroidManifest.xml中配置

com.android.systemui 进程名称

后面几个数字分别是

Pss Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存)

Uss Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存)

SwapPss swap交换分区,表示交换分区内存占用

am_pss 关键字

在源码中位置 \base\frameworks\base\services\core\java\com\android\server\am\EventLogTags.logtags

4.tag对应的一些场景

下面列举tag可能使用的部分场景:

am\_low\_memory:位于AMS.killAllBackgroundProcesses或者AMS.appDiedLocked,记录当前Lru进程队列长度。

am\_pss:位于AMS.recordPssSampleLocked\(

am\_meminfo:位于AMS.dumpApplicationMemoryUsage

am\_proc\_start:位于AMS.startProcessLocked,启动进程

am\_proc\_bound:位于AMS.attachApplicationLocked

am\_kill: 位于ProcessRecord.kill,杀掉进程

am\_anr: 位于AMS.appNotResponding

am\_crash:位于AMS.handleApplicationCrashInner

am\_wtf:位于AMS.handleApplicationWtf

am\_activity\_launch\_time:位于ActivityRecord.reportLaunchTimeLocked\(\),后面两个参数分别是thisTime和 totalTime.

am\_activity\_fully\_drawn\_time:位于ActivityRecord.reportFullyDrawnLocked, 后面两个参数分别是thisTime和 totalTime

am\_broadcast\_discard\_filter:位于BroadcastQueue.logBroadcastReceiverDiscardLocked

am\_broadcast\_discard\_app:位于BroadcastQueue.logBroadcastReceiverDiscardLocked

Activity生命周期相关的方法:

am\_on\_resume\_called: 位于AT.performResumeActivity

am\_on\_paused\_called: 位于AT.performPauseActivity, performDestroyActivity

am\_resume\_activity: 位于AS.resumeTopActivityInnerLocked

am\_pause\_activity: 位于AS.startPausingLocked

am\_finish\_activity: 位于AS.finishActivityLocked, removeHistoryRecordsForAppLocked

am\_destroy\_activity: 位于AS.destroyActivityLocked

am\_focused\_activity: 位于AMS.setFocusedActivityLocked, clearFocusedActivity

am\_restart\_activity: 位于ASS.realStartActivityLocked

am\_create\_activity: 位于ASS.startActivityUncheckedLocked

am\_new\_intent: 位于ASS.startActivityUncheckedLocked

am\_task\_to\_front: 位于AS.moveTaskToFrontLocked

下面列举tag可能使用的部分场景:

power\_sleep\_requested: 位于PMS.goToSleepNoUpdateLocked

power\_screen\_state:位于Notifer.handleEarlyInteractiveChange, handleLateInteractiveChange



battery\_level: \[19,3660,352\] //剩余电量19%, 电池电压3.66v, 电池温度35.2℃

power\_screen\_state: \[0,3,0,0\] // 灭屏状态\(0\), 屏幕超时\(3\). 当然还有其他设备管理策略\(1\),其他理由都为用户行为\(2\)

power\_screen\_state: \[1,0,0,0\] // 亮屏状态\(1\)

参考:

https://blog.csdn.net/yelangjueqi/article/details/52621903

http://gityuan.com/2016/05/15/event-log/

results for ""

    No results matching ""