CPU信息獲取-代碼獲取

手機(jī)開發(fā)者選項(xiàng)里面如何獲取CPU運(yùn)行信息的

做為Android開發(fā)者來(lái)說(shuō),應(yīng)該對(duì)開發(fā)者選項(xiàng)是特別熟悉的。
通過(guò)【設(shè)置】->【開發(fā)者選項(xiàng)】->【顯示cpu使用情況】這些步驟,可以看到CPU當(dāng)前的情況。
這個(gè)功能的實(shí)現(xiàn)在系統(tǒng)的源碼LoadAverageService類里實(shí)現(xiàn)的:com.android.systemui.LoadAverageService。
LoadAverageService是一個(gè)Service。
以5.1.1_r1為例,我們看到的CPU的實(shí)時(shí)的情況是在com.android.systemui.LoadAverageService里實(shí)現(xiàn)的:

LoadAverageService有一個(gè)內(nèi)部類LoadView,用于展示CUP的實(shí)時(shí)情況,
數(shù)據(jù)從內(nèi)部類CpuTracker獲取,這類繼承自ProcessCpuTracker。所以我們的重點(diǎn)是看看ProcessCpuTracker是如何獲取CPU數(shù)據(jù)的。

LoadAverageService的代碼只保留了主要結(jié)構(gòu)和核心的代碼:

package com.android.systemui;

import com.android.internal.os.ProcessCpuTracker;

public class LoadAverageService extends Service {
    private View mView;

    private static final class CpuTracker extends ProcessCpuTracker {
        String mLoadText;
        int mLoadWidth;

        private final Paint mPaint;

        CpuTracker(Paint paint) {
            super(false);
            mPaint = paint;
        }
        // 省略
    }

    private class LoadView extends View {
        private Handler mHandler = new Handler() {
            @Override
            public void handleMessage(Message msg) {
                if (msg.what == 1) {
                    //重新獲取一次數(shù)據(jù)
                    mStats.update();
                    updateDisplay();
                    Message m = obtainMessage(1);
                    //每?jī)擅腌姼乱淮螖?shù)據(jù)
                    sendMessageDelayed(m, 2000);
                }
            }
        };

       

        LoadView(Context c) {
            super(c);

            //省略了初始化繪制時(shí)需要的工具
            //這里創(chuàng)建了CpuTracker對(duì)象,并進(jìn)行了初始化    
            mStats = new CpuTracker(mLoadPaint);
            mStats.init();
            //更新展示,讓CPU的情況繪制到屏幕上
            updateDisplay();
        }

        @Override
        protected void onAttachedToWindow() {
            super.onAttachedToWindow();
            //當(dāng)View和Window關(guān)聯(lián)后,第一次發(fā)送繪制的異步消息
            mHandler.sendEmptyMessage(1);
        }

        //省略...

        @Override
        public void onDraw(Canvas canvas) {
            super.onDraw(canvas);
            //省略

            //獲取CPU的相關(guān)信息,并做一定的運(yùn)算    
            final CpuTracker stats = mStats;
            final int userTime = stats.getLastUserTime();
            final int systemTime = stats.getLastSystemTime();
            final int iowaitTime = stats.getLastIoWaitTime();
            final int irqTime = stats.getLastIrqTime();
            final int softIrqTime = stats.getLastSoftIrqTime();
            final int idleTime = stats.getLastIdleTime();

            final int totalTime = userTime+systemTime+iowaitTime+irqTime+softIrqTime+idleTime;
            if (totalTime == 0) {
                return;
            }
            int userW = (userTime*W)/totalTime;
            int systemW = (systemTime*W)/totalTime;
            int irqW = ((iowaitTime+irqTime+softIrqTime)*W)/totalTime;

            //繪制工作省略...
        }

        void updateDisplay() {
            //View的高度寬度重新計(jì)算,主要用于判斷是否重新繪制View還是重新進(jìn)行測(cè)量。
            if (neededWidth != mNeededWidth || neededHeight != mNeededHeight) {
                mNeededWidth = neededWidth;
                mNeededHeight = neededHeight;
                requestLayout();
            } else {
                invalidate();
            }
        }
    }

    @Override
    public void onCreate() {
        super.onCreate();
        //省略:把View add到屏幕上
        WindowManager wm = (WindowManager)getSystemService(WINDOW_SERVICE);
        wm.addView(mView, params);
    }

   //省略

}

ProcessCpuTracker 是如何獲取CPU信息的

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

推薦閱讀更多精彩內(nèi)容