亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Android如何獲取當(dāng)前CPU頻率和占用率

 更新時(shí)間:2025年03月12日 16:00:54   作者:microhex  
最近在優(yōu)化 App 的性能,需要獲取當(dāng)前 CPU視頻頻率和占用率,所以本文小編就來(lái)和大家總結(jié)一下如何在Android中獲取當(dāng)前CPU頻率和占用率吧

最近在優(yōu)化 App 的性能,需要獲取當(dāng)前 CPU視頻頻率和占用率,通過(guò)查詢資料,大致思路如下:

目前沒(méi)有標(biāo)準(zhǔn)的 API 來(lái)獲取 CPU 的使用頻率,只能通過(guò)讀取指定 CPU 文件獲取當(dāng)前 CPU 頻率,在某些機(jī)器或者特定版本中,可能需要ROOT 權(quán)限或者特殊權(quán)限,因此會(huì)存在一定幾率的失敗,因此需要做好 Try…catch 動(dòng)作。又因?yàn)楝F(xiàn)在手機(jī) CPU 的多核數(shù)目,因此我們可能需要獲取多個(gè) CPU 頻率數(shù),并取平均值。

獲取系統(tǒng) CPU 核心數(shù):

 val cpuCoreNum = Runtime.getRuntime().availableProcessors()

獲取指定 CPU 當(dāng)前頻率:

/sys/devices/system/cpu/cpu${index}/cpufreq/scaling_cur_freq

那么核心代碼為:

private fun getAllCpuCoreFrequency() : Long {

        var frequency = 0L

        for (index in 0 until  cpuCoreNum){
            frequency += readFile("/sys/devices/system/cpu/cpu$index/cpufreq/scaling_cur_freq")
        }

        BLog.d("frequency : $frequency")

        return frequency / cpuCoreNum
    }


  private fun readFile(filePath: String): Long{
        try {
            val file = RandomAccessFile(filePath, "r")
            val content = file.readLine()
            file.close()

            if (TextUtils.isEmpty(content)){
                return 0L
            }

            BLog.d("readFile content : $content")

            return content.trim().toLong()

        }catch (e : Exception){
            e.printStackTrace()

           return 0L
        }
    }

如果需要獲取 CPU 的占用率,那么就需要知道每個(gè)核心的最大頻率和最小頻率,同樣是通過(guò)文件獲取:

//max frequency file
/sys/devices/system/cpu/cpu${index}/cpufreq/cpuinfo_max_freq

???????//min frequency file
/sys/devices/system/cpu/cpu${index}/cpufreq/cpuinfo_min_freq

那么核心代碼為:

object CPUUtils {

    private var cpuCoreNum = 0
    private var cpuMaxFrequency = 0L
    private var cpuMinFrequency = 0L

    fun initCpuCoreNum(){
        if (cpuCoreNum <= 0 || cpuMaxFrequency <= 0L || cpuMinFrequency <= 0L){

            cpuCoreNum = Runtime.getRuntime().availableProcessors()
            initMaxAndMinFrequency()

            if (cpuCoreNum > 0 && cpuMaxFrequency > 0L && cpuMinFrequency > 0L){
               SpManager.getInstance().setCanUseCPUFrequency(true)
            }
        }

        BLog.d("cpuCoreNum : $cpuCoreNum")
    }

    private fun initMaxAndMinFrequency()  {
        if (cpuCoreNum <= 0){
            return
        }

        cpuMaxFrequency = 0L
        cpuMinFrequency = 0L

        for (index in 0 until cpuCoreNum){
            cpuMaxFrequency += readFile("/sys/devices/system/cpu/cpu${index}/cpufreq/cpuinfo_max_freq")
            cpuMinFrequency += readFile("/sys/devices/system/cpu/cpu${index}/cpufreq/cpuinfo_min_freq")
        }


        BLog.d("cpuMaxFrequency : $cpuMaxFrequency, cpuMinFrequency : $cpuMinFrequency")
    }


    private fun readFile(filePath: String): Long{
        try {
            val file = RandomAccessFile(filePath, "r")
            val content = file.readLine()
            file.close()

            if (TextUtils.isEmpty(content)){
                return 0L
            }

            BLog.d("readFile content : $content")

            return content.trim().toLong()

        }catch (e : Exception){
           ExceptionHandler.recordException(e)

           return 0L
        }
    }
    
    private fun getAllCpuCoreFrequency() : Long {
        initCpuCoreNum()

        if (cpuCoreNum <=0){
            return 0L
        }

        var frequency = 0L

        for (index in 0 until  cpuCoreNum){
            frequency += readFile("/sys/devices/system/cpu/cpu$index/cpufreq/scaling_cur_freq")
        }

        BLog.d("frequency : $frequency")

        return frequency
    }

    fun findCurrentFrequencyPercent() : Long {

        val currentFrequency = getAllCpuCoreFrequency()

        BLog.d("currentFrequency : $currentFrequency, cpuMinFrequency : $cpuMinFrequency, cpuMaxFrequency : $cpuMaxFrequency")

        if (cpuMaxFrequency - cpuMinFrequency <= 0L || currentFrequency - cpuMinFrequency < 0L || cpuMaxFrequency - currentFrequency < 0L){
            return 0L
        }

        return (currentFrequency - cpuMinFrequency) * 100 / (cpuMaxFrequency - cpuMinFrequency)
    }


    fun getCpuCoreFrequency() : Long {
        initCpuCoreNum()

        if (cpuCoreNum <=0){
            return 0L
        }

        return getAllCpuCoreFrequency() / cpuCoreNum
    }

}

獲取 CPU 頻率:

CPUUtils.getCpuCoreFrequency()

獲取 CPU 占用率:

CPUtils.findCurrentFrequencyPercent()

到此這篇關(guān)于Android如何獲取當(dāng)前CPU頻率和占用率的文章就介紹到這了,更多相關(guān)Android獲取CPU頻率和占用率內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Android百度定位導(dǎo)航之基于百度地圖移動(dòng)獲取位置和自動(dòng)定位

    Android百度定位導(dǎo)航之基于百度地圖移動(dòng)獲取位置和自動(dòng)定位

    項(xiàng)目需求是這樣的,首先定位我當(dāng)前的起始位置,并跟隨移動(dòng)不斷自動(dòng)定位我的當(dāng)前位置,下面通過(guò)本文給大家介紹android百度定位導(dǎo)航之基于百度地圖移動(dòng)獲取位置和自動(dòng)定位,需要的朋友參考下
    2016-01-01
  • Android應(yīng)用開(kāi)發(fā)中使用Fragment的入門學(xué)習(xí)教程

    Android應(yīng)用開(kāi)發(fā)中使用Fragment的入門學(xué)習(xí)教程

    這篇文章主要介紹了Android應(yīng)用開(kāi)發(fā)中Fragment的入門學(xué)習(xí)教程,可以把Fragment看作為Activity基礎(chǔ)之上的模塊,需要的朋友可以參考下
    2016-02-02
  • Kotlin語(yǔ)言使用BroadcastReceiver示例介紹

    Kotlin語(yǔ)言使用BroadcastReceiver示例介紹

    Android開(kāi)發(fā)的四大組件分別是:活動(dòng)(activity),用于表現(xiàn)功能;服務(wù)(service),后臺(tái)運(yùn)行服務(wù),不提供界面呈現(xiàn);廣播接受者(Broadcast Receive),勇于接收廣播;內(nèi)容提供者(Content Provider),支持多個(gè)應(yīng)用中存儲(chǔ)和讀取數(shù)據(jù),相當(dāng)于數(shù)據(jù)庫(kù),本篇著重介紹廣播組件
    2022-09-09
  • Android實(shí)現(xiàn)支付寶支付密碼輸入界面

    Android實(shí)現(xiàn)支付寶支付密碼輸入界面

    這篇文章主要為大家詳細(xì)介紹了Android實(shí)現(xiàn)支付寶支付密碼輸入界面,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-05-05
  • Android+Flutter實(shí)現(xiàn)文字跑馬燈特效

    Android+Flutter實(shí)現(xiàn)文字跑馬燈特效

    跑馬燈常常被運(yùn)用在很多領(lǐng)域, 例如商場(chǎng)的電子條幅、大樓的宣傳廣告位、地鐵的廣告位。今天我們來(lái)說(shuō)一下flutter 怎么通過(guò)繪制來(lái)實(shí)現(xiàn)跑馬燈效果!,希望對(duì)大家有所幫助
    2022-11-11
  • 協(xié)程作用域概念迭代RxTask?實(shí)現(xiàn)自主控制

    協(xié)程作用域概念迭代RxTask?實(shí)現(xiàn)自主控制

    這篇文章主要為大家介紹了協(xié)程作用域概念迭代RxTask實(shí)現(xiàn)自主控制詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2022-10-10
  • 仿iPhone風(fēng)格對(duì)話框(附件包含例子/jar包/jar包源碼)

    仿iPhone風(fēng)格對(duì)話框(附件包含例子/jar包/jar包源碼)

    這個(gè)對(duì)框完全繼承、仿照AlertDialog,只是實(shí)現(xiàn)了自定義效果;另外,沒(méi)有實(shí)現(xiàn)setIcon,因?yàn)閕phone中的對(duì)話框多數(shù)都沒(méi)有圖標(biāo);附件包含例子、jar包、jar包源碼
    2013-01-01
  • Android編程實(shí)現(xiàn)改變控件背景及形態(tài)的方法

    Android編程實(shí)現(xiàn)改變控件背景及形態(tài)的方法

    這篇文章主要介紹了Android編程實(shí)現(xiàn)改變控件背景及形態(tài)的方法,涉及Android控件布局設(shè)置的相關(guān)技巧,需要的朋友可以參考下
    2016-02-02
  • Android實(shí)現(xiàn)循環(huán)平移動(dòng)畫示例

    Android實(shí)現(xiàn)循環(huán)平移動(dòng)畫示例

    這篇文章主要介紹了Android實(shí)現(xiàn)循環(huán)平移動(dòng)畫示例,本文講解實(shí)現(xiàn)用一張背景圖做循環(huán)從左往右平移動(dòng)畫,需要的朋友可以參考下
    2015-06-06
  • Android之Spinner用法詳解

    Android之Spinner用法詳解

    這篇文章主要介紹了Android之Spinner用法詳解,本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-08-08

最新評(píng)論