分析系统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\)
参考: