android4.4系统LoadAverageService服务分析

简介: android4.4系统LoadAverageService服务分析        在前一段时间写的《android系统cpu资源相关查询》感觉还比较实用,上次没有对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;

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

 

 

目录
相关文章
|
25天前
|
开发工具 Android开发 Swift
安卓与iOS开发环境对比分析
在移动应用开发的广阔舞台上,安卓和iOS这两大操作系统无疑是主角。它们各自拥有独特的特点和优势,为开发者提供了不同的开发环境和工具。本文将深入浅出地探讨安卓和iOS开发环境的主要差异,包括开发工具、编程语言、用户界面设计、性能优化以及市场覆盖等方面,旨在帮助初学者更好地理解两大平台的开发特点,并为他们选择合适的开发路径提供参考。通过比较分析,我们将揭示不同环境下的开发实践,以及如何根据项目需求和目标受众来选择最合适的开发平台。
34 2
|
2月前
|
JavaScript 前端开发 Java
[Android][Framework]系统jar包,sdk的制作及引用
[Android][Framework]系统jar包,sdk的制作及引用
43 0
|
7天前
|
安全 Android开发 数据安全/隐私保护
探索安卓与iOS的安全性差异:技术深度分析与实践建议
本文旨在深入探讨并比较Android和iOS两大移动操作系统在安全性方面的不同之处。通过详细的技术分析,揭示两者在架构设计、权限管理、应用生态及更新机制等方面的安全特性。同时,针对这些差异提出针对性的实践建议,旨在为开发者和用户提供增强移动设备安全性的参考。
|
10天前
|
监控 Android开发 iOS开发
深入探索安卓与iOS的系统架构差异:理解两大移动平台的技术根基在移动技术日新月异的今天,安卓和iOS作为市场上最为流行的两个操作系统,各自拥有独特的技术特性和庞大的用户基础。本文将深入探讨这两个平台的系统架构差异,揭示它们如何支撑起各自的生态系统,并影响着全球数亿用户的使用体验。
本文通过对比分析安卓和iOS的系统架构,揭示了这两个平台在设计理念、安全性、用户体验和技术生态上的根本区别。不同于常规的技术综述,本文以深入浅出的方式,带领读者理解这些差异是如何影响应用开发、用户选择和市场趋势的。通过梳理历史脉络和未来展望,本文旨在为开发者、用户以及行业分析师提供有价值的见解,帮助大家更好地把握移动技术发展的脉络。
|
6天前
|
Dart 开发工具 Android开发
在 Android 系统上搭建 Flutter 环境的具体步骤是什么?
在 Android 系统上搭建 Flutter 环境的具体步骤是什么?
|
14天前
|
安全 Linux Android开发
探索安卓与iOS的安全性差异:技术深度分析
本文深入探讨了安卓(Android)和iOS两个主流操作系统平台在安全性方面的不同之处。通过比较它们在架构设计、系统更新机制、应用程序生态和隐私保护策略等方面的差异,揭示了每个平台独特的安全优势及潜在风险。此外,文章还讨论了用户在使用这些设备时可以采取的一些最佳实践,以增强个人数据的安全。
|
22天前
|
JavaScript 前端开发 Android开发
让Vite+Vue3项目在Android端离线打开(不需要起服务)
让Vite+Vue3项目在Android端离线打开(不需要起服务)
|
1月前
|
调度 Android开发 UED
Android经典实战之Android 14前台服务适配
本文介绍了在Android 14中适配前台服务的关键步骤与最佳实践,包括指定服务类型、请求权限、优化用户体验及使用WorkManager等。通过遵循这些指南,确保应用在新系统上顺畅运行并提升用户体验。
51 6
|
1月前
|
Android开发 UED 开发者
Android经典实战之WindowManager和创建系统悬浮窗
本文详细介绍了Android系统服务`WindowManager`,包括其主要功能和工作原理,并提供了创建系统悬浮窗的完整步骤。通过示例代码,展示了如何添加权限、请求权限、实现悬浮窗口及最佳实践,帮助开发者轻松掌握悬浮窗开发技巧。
55 1
|
9天前
|
安全 API 开发工具
Android平台RTMP推送|轻量级RTSP服务如何实现麦克风|扬声器声音采集切换
Android平台扬声器播放声音的采集,在无纸化同屏等场景下,意义很大,早期低版本的Android设备,是没法直接采集扬声器audio的(从Android 10开始支持),所以,如果需要采集扬声器audio,需要先做系统版本判断,添加相应的权限。
下一篇
无影云桌面