android4.4系统LoadAverageService服务分析

android4.4系统LoadAverageService服务分析

 

       在前一段时间写的《android系统cpu资源相关查询》感觉还比较实用,上次没有对LoadAverageService做深入一点的分析,今天我们接着来看看。

       首先看看大智慧低调的LoadAverageService的源代码小心翼翼的潜伏在android\frameworks\base\packages\SystemUI\src\com\android\systemui下面, 文件很小,也就12KB样子。放在systemui里面还是有好处的,被其他程序替代的可能性低一些,一般设备很少有人去替换systemui的,launcher被换的倒是大有人在,比较隐蔽,因为不常用也不用太显眼;

/*****************************************************************************************************/
声明:本博内容均由http://blog.csdn.net/edsam49原创,转载请注明出处,谢谢!
/*****************************************************************************************************/

        LoadAverageService有两个重要的class,一个是CpuTracker,负责运行状态数据收集的,另外一个就是LoadView,从名字上也能看出是为了显示的,要显示成啥样,就在这里面了。

   private static final class CpuTracker extends ProcessCpuTracker { }

   private class LoadView extends View {}

我们从上面这中关系中可以看出ProcessCpuTracker是至关重要的,那么下面我们来看看它都提供了些什么。首先还是先了解一下linux特性,在系统运行时在/proc伪文件系统中会生成对应任务的PID相关运行信息,这个PID也是内核负责分配的,我们进入看看是个什么样子,如下图:

 

我们再进一级,比如PID是2121的进程,我们看看他的运行stat记录,如下图:

 

有了上面说的这些素材,ProcessCpuTracker就有活干了,我们先来看一下其中一个重要的接口getCpuTimeForPid(int pid),代码如下:

    /**
     * Returns the total time (in clock ticks, or 1/100 sec) spent executing in
     * both user and system code.
     */
    public long getCpuTimeForPid(int pid) {
        final String statFile = "/proc/" + pid + "/stat";
        final long[] statsData = mSinglePidStatsData;
        if (Process.readProcFile(statFile, PROCESS_STATS_FORMAT,
                null, statsData, null)) {
            long time = statsData[PROCESS_STAT_UTIME]
                    + statsData[PROCESS_STAT_STIME];
            return time;
        }
        return 0;
    }

       我们不难看出他是去分析了/proc下面的每个PID对应的stat文件,关于stat的格式说明请参看一下http://www.net527.cn/a/caozuoxitong/Linux/2012/0823/24385.html这篇文章,写得很清楚了。从stat文件得到的信息真不少啊!要算出cpu占有率这些东西,肯定是要有计算时长的,一般默认也是用5秒钟做一个加权计算,可以看看这个任务两次采样时占的系统时间的差异,再根据cpu的总时间来算出百分比,算CPU总的使用率的话是分析/proc/stat文件即可;值得一提的就是/proc/loadavg,他里面算的是任务数,跟我们平时看的占有率不一样,我们还是更习惯看占有率。其实看到这里,我相信大多数码友都知道大概怎么来的了吧!

       要实时不断的显示刷新出来,无法是有个任务隔一段时间去采样一下,计算出来结果update上去,再通过LoadView来显示。LoadView值得一提的就是它在任何应用界面上都可以显示,它是用的系统层,而不是activities层,始终高于activities。我们看看是怎么实现的,核心代码如下:

    public void onCreate() {
        super.onCreate();
        mView = new LoadView(this);
        WindowManager.LayoutParams params = new WindowManager.LayoutParams(
            WindowManager.LayoutParams.MATCH_PARENT,
            WindowManager.LayoutParams.WRAP_CONTENT,
            WindowManager.LayoutParams.TYPE_SECURE_SYSTEM_OVERLAY,
            WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE|
            WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE,
            PixelFormat.TRANSLUCENT);
        params.gravity = Gravity.END | Gravity.TOP;
        params.setTitle("Load Average");
        WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE);
        wm.addView(mView, params);
    }

      用的是TYPE_SECURE_SYSTEM_OVERLAY这个参数来指定的,这个参数的介绍参考如下:

        /**
         * Window type: secure system overlay windows, which need to be displayed
         * on top of everything else.  These windows must not take input
         * focus, or they will interfere with the keyguard.
         *
         * This is exactly like {@link #TYPE_SYSTEM_OVERLAY} except that only the
         * system itself is allowed to create these overlays.  Applications cannot
         * obtain permission to create secure system overlays.
         *
         * In multiuser systems shows only on the owning user's window.
         * @hide
         */
        public static final int TYPE_SECURE_SYSTEM_OVERLAY = FIRST_SYSTEM_WINDOW+15;

     其实,通过以上的一些简单分析,梳理一下思路,我们就可以了解到它从下到上是怎么运作起来的。它山之石可以攻玉!为我所用,灵活使用,事半功倍!   

 

 

时间: 2024-10-26 21:14:29

android4.4系统LoadAverageService服务分析的相关文章

基于android4.4系统行车记录应用黑屏问题分析及对策

基于android4.4系统行车记录应用黑屏问题分析及对策           笔者最近遇到一个棘手的问题,那就是行车记录应用出现黑屏的问题,现象就是进入行车记录应用surface是黑的,录像文件几分钟一个的那种,每个文件的大小都是零.看到这个大家都非常重视,对于车载产品来说,行车记录功能需要保持长时间正常工作,出现这种问题肯定是不能接受的,必须解决!那这个问题是怎么出现的呢?        跟了很长时间,同时动用了8台相同的机器来单独做行车记录的拷机测试,12个小时内都不会出问题,但是超过24

使用SLS和ODPS进行系统的性能分析

在对计算机系统,尤其是分布式系统的搭建和验证过程中,性能因素是需要着重考虑的因素之一.更激进一点说,判断架构设计的正确与否,性能的好坏.是否可控.是否可预期绝对是最有效的衡量指标. 不幸的是,现有的性能工具大部分是针对代码级的运行时间进行分析,目标是诊断代码的性能bug.但目前我们并没有(或者我还没见到)针对大型的分布式系统的系统级性能分析工具. 虽然这样,但我们可以发扬DIY精神,卷起袖子自己来做这样的性能分析.通过简单日志服务(SLS)对性能日志进行收集,并使用SLS的离线通道将性能相关的数

framework层服务分析

framework层服务分析       最近在做公司内部员工android系统培训,编写了一些PPT,引用了网上诸位大侠的贡献,下面就分析下framework框架层服务.              Android Service是android 系统中的四大组件之一(Activity.Service.BroadcastReceiver.ContentProvider),大家都知道,它有下面两大特点:     1)运行在后台的一种服务程序     2)一般很少和用户交互,没有可视化界面.    

windows xp系统停止服务怎么办

  大家熟知以及习惯的xp系统在今年的4月8日就要被停止技术的支持了,下面我们一起来说说xp停止服务了我们该怎么办?其实一个很简单的办法就是将自己的系统升级为win或者更高的系统. 由图我们可以得知,在百度统计系统用户的时候发现绝大部分用户还是在使用xp的,当然这其中主要的原因还是因为:网吧.用户操作习惯等造成的! xp作为一款非常经典的操作系统,也是很多用户用过的第一款操作系统,对他的操作方式已经产生了依赖和习惯性,如果停止服务了,那么也就意味着这款系统将变得不安全了,那么我们最好的方式就是去

win7系统开启服务提示错误1067进程意外终止怎么办

  win7系统开启服务提示错误1067进程意外终止怎么办 1.在桌面上的网络图标上单机右键,选择属性,然后点击"更改适配器设置"; 2.在网络链接界面中的"本地连接"上单击右键选择属性(网络连接中有多个"本地连接",我们要选择在使用的那一个); 3.在属性界面点击"共享"选卡,然后点击"设置"按钮; 4.在高级设置中,在服务窗口下方勾选所有服务,然后点击确定; 5.在左面上的计算机中单击右键,选择&quo

win8系统停止服务怎么办

  win8系统停止服务怎么办: 微软表示会在Win8.1发布两年后停止支持Win8,即2015年10月18日.最新FAQ页面表示Win8的支持会截止至2016年1月12日.系统天堂小编建议你尽快升级win8.1update,尚未升级Win8.1的Win8用户不需非得升级Win8.1 Update,但Win8用户仍可以下载这次更新;倘若不安装这次Update,从2014年5月份开始Windows Update未来将不会推送任何新更新来修复系统.         注:更多精彩教程请关注三联电脑教程

xp系统停止服务怎么办?

  由图我们可以得知,在百度统计系统用户的时候发现绝大部分用户还是在使用xp的,当然这其中主要的原因还是因为:网吧.用户操作习惯等造成的! xp作为一款非常经典的操作系统,也是很多用户用过的第一款操作系统,对他的操作方式已经产生了依赖和习惯性,如果停止服务了,那么也就意味着这款系统将变得不安全了,那么我们最好的方式就是去换系统,下面小编整合了几个关键性的问题来帮助你解答! 问题一: xp系统停止服务了我们还可以继续使用吗? 答:当然可以,就像现在还能使用98.2000等系统一样,但是会有一定风险

xp系统停止服务恢复工具

  xp系统停止服务恢复工具大全-杀毒软件xp专版排行榜: 推荐一:百度卫士xp护航专版 百度卫士率先推出"XP护航方案".与其他安全产品"打补丁"方式持续维护WinXP系统不同,百度卫士推出的"XP用户解决方案"在理念上承诺"不骚扰.不胁迫.不窃取"的同时,以全方位的主动防御机制保障WinXP系统的安全和顺畅.   推荐二:360安全卫士xp专版 最为国内最新推出xp专版的360,在安全防御方面应该说实力目前是最好的. 36

iis webservice-siebel系统的服务总是自动停掉。

问题描述 siebel系统的服务总是自动停掉. siebel系统的服务总是自动停掉,重启后过几分钟就掉了,查看了日志文件,文件显示服务就没启动成功过,重启了服务器,但也是不行,请问有知道是怎么回事的吗 解决方案 根部无法启动检查下配置,比如说iis的权限,数据库,应用程序池等.