am_pss信息解读及代码说明

一、am_pss日志解读

Android源码中有大量的EventLog日志,通过这些日志可以很简洁的呈现出系统的事件处理流程,时间,状态等。

  1. 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
  1. 相关命令
#查看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
  1. 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,下面看看数据类型和数据单位

#数据类型:1int2long3: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

参考

Android EventLog含义
Java日志写入接口
event log 分析

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值