一、am_pss日志解读
Android源码中有大量的EventLog日志,通过这些日志可以很简洁的呈现出系统的事件处理流程,时间,状态等。
- am_pss日志解读
I am_pss : [12170,10248,com.android.calend,23965696,21639168,237568,131608576,0,19,6]
- pid 进程id:12170
- Uid 用户id:10248 (Android作为单用户系统,Uid用于数据共享,可在AndroidManifest.xml中配置)
- 进程名称:com.android.calend
- Pss Proportional Set Size 实际使用的物理内存(比例分配共享库占用的内存):23965696
- Uss Unique Set Size 进程独自占用的物理内存(不包含共享库占用的内存):21639168
- SwapPss swap交换分区:237568
- Rss: 131608576
- StatType: 0
- ProcState: 19
- PssDuration (如果有的话):6
- 相关命令
#查看Event所有的tags
adb shell cat /system/etc/event-log-tags
#输出events日志信息
adb logcat -b events
#通过adb logcat输出的event log文件,每一行都是以如下格式作为开头信息
#格式:timestamp PID TID log-level log-tag tag-values
#该命令会输出带有时间点、进程号等信息的events log
adb logcat -v threadtime -t 4096 -b events
- log类型说明
main log分类系统根据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
Android系统在应用程序框架层中定义了三个Java日志写入接口,它们分别是android.util.Log、android.util.Slog和android.util.EventLog,写入的日志记录类型分别为main、system和events。
二、am类代码说明
private void recordPssSampleLocked(ProcessRecord proc, int procState, long pss, long uss,
long swapPss, long rss, int statType, long pssDuration, long now) {
EventLogTags.writeAmPss(
profile.getPid(), proc.uid, proc.processName, pss * 1024, uss * 1024,
swapPss * 1024, rss * 1024, statType, procState, pssDuration);
}
源码中EventLogTags并没有定义writeAmPss方法,ActivityManagerService.java目录也没有EventLogTags类,这个类通过EventLogTags.logtags生成(其他am类日志(如am_cpu)也基本这个原理)
am_pss这个关键字,在手机/system/etc/event-log-tags文件或在代码/server/am/EventLogTags.logtags中找到它的定义:
//手机/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)
# Report collection of memory used by a process
30047 am_pss (Pid|1|5),(UID|1|5),(Process Name|3),(Pss|2|2),(Uss|2|2),(SwapPss|2|2),(Rss|2|2),(StatType|1|5),(ProcState|1|5),(TimeToCollect|2|2)
20003 dvm_lock_sample (process|3),(main|1|5),(thread|3),(time|1|3),(file|3),(line|1|5),(ownerfile|3),(ownerline|1|5),(sample_percent|1|6)
#格式:(<name>|data type[|data unit]) ==> (<名字>|数据类型[|数据单位])
#例子:(User|1|5) ==> 名字为User, 数据类型为1,数据单位为5,下面看看数据类型和数据单位
#数据类型:1:int,2:long,3:string,4:list
#数据单位:1:对象个数,2:字节数,3:毫秒,4:分配个数,5:ID,6百分比
实例分析:
am_proc_start (User|1|5),(PID|1|5),(UID|1|5),(Process Name|3),(Type|3),(Component|3) am_proc_start: [0,9227,10002,com.android.browser,content provider,com.android.browser/.provider.BrowserProvider2]
#进程启动: UserId=0, pid=9227, uid=10002, ProcessName=com.android.browser,
#数据类型=ContentProvider, 组件=com.android.browser/.provider.BrowserProvider2
//system/event/EventLogTags.java
public class EventLogTags {
private EventLogTags() { } // don't instantiate
/** 2721 cpu (total|1|6),(user|1|6),(system|1|6),(iowait|1|6),(irq|1|6),(softirq|1|6) */
public static final int CPU = 2721;
/** 30047 am_pss (Pid|1|5),(UID|1|5),(Process Name|3),(PssKb|2|2),(UssKb|2|2) */
public static final int AM_PSS = 30047;
}
am_pss对应AM_PSS, 值30047与 30047对应
上面的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)
public static void writeAmProcStart(int user, int pid, int uid, String processName, String type, String component) {
android.util.EventLog.writeEvent(AM_PROC_START, user, pid, uid, processName, type, component);
}
三、日志文件备忘
frameworks/base/core/java/android/util/Log.java
frameworks/base/core/jni/android_util_Log.cpp
frameworks/base/core/java/android/util/Slog.java