android4.4系统LoadAverageService服务分析

2024-02-15 23:48

本文主要是介绍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也是内核负责分配的,我们进入看看是个什么样子,如下图:

 

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

 

有了上面说的这些素材,ProcessCpuTracker就有活干了,我们先来看一下其中一个重要的接口getCpuTimeForPidint 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;

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

 

 

这篇关于android4.4系统LoadAverageService服务分析的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/712902

相关文章

SpringBoot基于配置实现短信服务策略的动态切换

《SpringBoot基于配置实现短信服务策略的动态切换》这篇文章主要为大家详细介绍了SpringBoot在接入多个短信服务商(如阿里云、腾讯云、华为云)后,如何根据配置或环境切换使用不同的服务商,需... 目录目标功能示例配置(application.yml)配置类绑定短信发送策略接口示例:阿里云 & 腾

springboot项目如何开启https服务

《springboot项目如何开启https服务》:本文主要介绍springboot项目如何开启https服务方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录springboot项目开启https服务1. 生成SSL证书密钥库使用keytool生成自签名证书将

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

使用Node.js制作图片上传服务的详细教程

《使用Node.js制作图片上传服务的详细教程》在现代Web应用开发中,图片上传是一项常见且重要的功能,借助Node.js强大的生态系统,我们可以轻松搭建高效的图片上传服务,本文将深入探讨如何使用No... 目录准备工作搭建 Express 服务器配置 multer 进行图片上传处理图片上传请求完整代码示例

Spring LDAP目录服务的使用示例

《SpringLDAP目录服务的使用示例》本文主要介绍了SpringLDAP目录服务的使用示例... 目录引言一、Spring LDAP基础二、LdapTemplate详解三、LDAP对象映射四、基本LDAP操作4.1 查询操作4.2 添加操作4.3 修改操作4.4 删除操作五、认证与授权六、高级特性与最佳

Python 迭代器和生成器概念及场景分析

《Python迭代器和生成器概念及场景分析》yield是Python中实现惰性计算和协程的核心工具,结合send()、throw()、close()等方法,能够构建高效、灵活的数据流和控制流模型,这... 目录迭代器的介绍自定义迭代器省略的迭代器生产器的介绍yield的普通用法yield的高级用法yidle

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析

C++ Sort函数使用场景分析

《C++Sort函数使用场景分析》sort函数是algorithm库下的一个函数,sort函数是不稳定的,即大小相同的元素在排序后相对顺序可能发生改变,如果某些场景需要保持相同元素间的相对顺序,可使... 目录C++ Sort函数详解一、sort函数调用的两种方式二、sort函数使用场景三、sort函数排序

kotlin中const 和val的区别及使用场景分析

《kotlin中const和val的区别及使用场景分析》在Kotlin中,const和val都是用来声明常量的,但它们的使用场景和功能有所不同,下面给大家介绍kotlin中const和val的区别,... 目录kotlin中const 和val的区别1. val:2. const:二 代码示例1 Java