From f8483bdbb2508a7e91cef544fa59d7abab7a46b0 Mon Sep 17 00:00:00 2001 From: yuqian Date: Fri, 26 Dec 2025 14:28:39 +0800 Subject: [PATCH] =?UTF-8?q?=E9=99=A4status=EF=BC=8Ccpu=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../java/com/xyzshell/andinfo/libs/CpuInfo.kt | 24 ++ .../custom/SetNumberOrWordUtils.kt | 8 + .../myphoneinfo/dashboard/AnalysisActivity.kt | 71 ++++- .../myphoneinfo/dashboard/HardWareFragment.kt | 24 +- .../myphoneinfo/dialog/DialogCpuInfo.kt | 48 +++- .../src/main/res/layout/activity_analysis.xml | 44 +-- .../src/main/res/layout/dialog_cpu_info.xml | 264 +----------------- .../src/main/res/layout/item_analysis.xml | 30 ++ .../src/main/res/layout/item_cpu_analysis.xml | 31 ++ .../src/main/res/layout/item_dialog_cpu.xml | 92 ++++++ 10 files changed, 304 insertions(+), 332 deletions(-) create mode 100644 myphoneinfo/src/main/res/layout/item_analysis.xml create mode 100644 myphoneinfo/src/main/res/layout/item_cpu_analysis.xml create mode 100644 myphoneinfo/src/main/res/layout/item_dialog_cpu.xml diff --git a/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/CpuInfo.kt b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/CpuInfo.kt index 3204cc4..ffe814c 100644 --- a/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/CpuInfo.kt +++ b/myphoneinfo/andinfo/src/main/java/com/xyzshell/andinfo/libs/CpuInfo.kt @@ -630,6 +630,30 @@ class CpuInfo { return sb.toString() } + fun getCpuText():String{//自定义衍生方法 + val sb = StringBuilder() + val clusterInfo = getClusterInfo() + if (clusterInfo.bigCoreCount > 0) { + sb.append("大核: ${clusterInfo.bigCoreCount} 个, 最高频率: ${formatFrequency(clusterInfo.bigCoreFreq)}\n") + } + if (clusterInfo.midCoreCount > 0) { + sb.append("中核: ${clusterInfo.midCoreCount} 个, 最高频率: ${formatFrequency(clusterInfo.midCoreFreq)}\n") + } + if (clusterInfo.littleCoreCount > 0) { + sb.append("小核: ${clusterInfo.littleCoreCount} 个, 最高频率: ${formatFrequency(clusterInfo.littleCoreFreq)}\n") + } + return sb.toString() + } + //去重频率 + fun getFrequencyText():String {//自定义衍生方法 + return getCoreFrequencies() + .map { freq -> + "${formatFrequency(freq.minFreq.toULong() * 1000UL)}-${formatFrequency(freq.maxFreq.toULong() * 1000UL)}" + } + .distinct() // 自动去重 + .joinToString("\n") // 每行一个 + } + /** * 格式化频率显示 * @param freqHz 频率(Hz) diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberOrWordUtils.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberOrWordUtils.kt index 9d9d8bf..44589f2 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberOrWordUtils.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/custom/SetNumberOrWordUtils.kt @@ -29,4 +29,12 @@ object SetNumberOrWordUtils { "" } } + + /* + 将数字加1并转换为字符串 + */ + fun convertToStringNormal(string: String): String { + + return (Integer.parseInt(string) + 1).toString() + } } \ No newline at end of file diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/AnalysisActivity.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/AnalysisActivity.kt index 0353b77..aa360d1 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/AnalysisActivity.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/AnalysisActivity.kt @@ -2,11 +2,18 @@ package com.xyzshell.myphoneinfo.dashboard import android.content.Intent import android.os.Bundle +import android.view.LayoutInflater import androidx.appcompat.app.AppCompatActivity import com.xyzshell.andinfo.AndInfo +import com.xyzshell.andinfo.libs.cpu.models.Processor import com.xyzshell.myphoneinfo.R +import com.xyzshell.myphoneinfo.custom.SetNumberOrWordUtils.convertToStringNormal import com.xyzshell.myphoneinfo.databinding.ActivityAnalysisBinding +import com.xyzshell.myphoneinfo.databinding.ItemAnalysisBinding +import com.xyzshell.myphoneinfo.databinding.ItemCpuAnalysisBinding import com.xyzshell.myphoneinfo.dialog.DialogCpuInfo +import kotlin.collections.component1 +import kotlin.collections.component2 class AnalysisActivity : AppCompatActivity() { private lateinit var binding: ActivityAnalysisBinding @@ -31,25 +38,73 @@ class AnalysisActivity : AppCompatActivity() { } private fun initText() { + val cpu = AndInfo.instance.cpu //processor binding.proText1.textTitle.text=getString(R.string.hardware) - binding.proText1.textContent.text=AndInfo.instance.cpu.text() - println(AndInfo.instance.cpu.text()) + binding.proText1.textContent.text=cpu.getProcessorName() binding.proText2.textTitle.text=getString(R.string.manufacturer) + binding.proText2.textContent.text=cpu.getVendor() binding.proText3.textTitle.text=getString(R.string.marketing_name) + binding.proText3.textContent.text=cpu.getProcessorName() binding.proText4.textTitle.text=getString(R.string.process) + binding.proText4.textContent.text=cpu.getProcess() binding.proText5.textTitle.text=getString(R.string.cores) + binding.proText5.textContent.text=cpu.getCoreCount().toString() binding.proText6.textTitle.text=getString(R.string.CPU) + binding.proText6.textContent.text=cpu.getAllArchitectures().joinToString() binding.proText7.textTitle.text=getString(R.string.frequencies) + binding.proText7.textContent.text=cpu.getFrequencyText() binding.proText8.textTitle.text=getString(R.string.architecture) + binding.proText8.textContent.text=cpu.getArchitecture() binding.proText9.textTitle.text=getString(R.string.ABI) + binding.proText9.textContent.text=cpu.getAbi() binding.proText10.textTitle.text=getString(R.string.supported_ABls) + binding.proText10.textContent.text=cpu.getSupportedAbis().joinToString() binding.proText11.textTitle.text=getString(R.string.features) - //cluster1 - binding.clu1Text1.textTitle.text=getString(R.string.type) - binding.clu1Text2.textTitle.text=getString(R.string.vendor) - binding.clu1Text3.textTitle.text=getString(R.string.cluster) - binding.clu1Text4.textTitle.text=getString(R.string.max_frequency) - binding.clu1Text5.textTitle.text=getString(R.string.min_frequency) + binding.proText11.textContent.text=cpu.getCpuFeatures().joinToString() + setCluster() + + } + + /** + * 设置集群信息*/ + private fun setCluster() { + val groupedProcessors = mutableMapOf>() + //给簇分类 + AndInfo.instance.cpu.processors.forEach { processor -> + val clusterId = processor.cluster.clusterId + val list = groupedProcessors.getOrPut(clusterId) { mutableListOf() } + list.add(processor) + } + groupedProcessors.forEach { (clusterId, processors) -> + println("集群 $clusterId: ${processors.size} 个处理器") + val itemView= LayoutInflater.from(this).inflate(R.layout.item_analysis,binding.llCluster,false) + val itemBinding = ItemAnalysisBinding.bind(itemView) + itemBinding.cluster1Title.text=getString(R.string.cluster)+convertToStringNormal(clusterId.toString()) + val coresRangeList= mutableListOf() + //获取簇范围 + processors.forEach { processor -> + coresRangeList.add(processor.core.coreId.toString()) + } + processors.forEach { processor -> + //设置每个cpu信息 + val itemGroup= LayoutInflater.from(this).inflate(R.layout.item_cpu_analysis,itemBinding.clusterInfo,false) + val itemGroupBinding = ItemCpuAnalysisBinding.bind(itemGroup) + itemGroupBinding.cputitle.text="cpu ${processor.core.coreId}" + itemGroupBinding.clu1Text1.textTitle.text=getString(R.string.type) + itemGroupBinding.clu1Text1.textContent.text=processor.cluster.uarch.toString() + itemGroupBinding.clu1Text2.textTitle.text=getString(R.string.vendor) + itemGroupBinding.clu1Text2.textContent.text=processor.cluster.vendor.toString() + itemGroupBinding.clu1Text3.textTitle.text=getString(R.string.cluster) + itemGroupBinding.clu1Text3.textContent.text="$coresRangeList" + itemGroupBinding.clu1Text4.textTitle.text=getString(R.string.max_frequency) + itemGroupBinding.clu1Text4.textContent.text=processor.cluster.frequency.toString()+" MHz" + itemGroupBinding.clu1Text5.textTitle.text=getString(R.string.min_frequency) + itemBinding.clusterInfo.addView(itemGroup) + println(" CPU${processor.core.coreId}: ${processor.cluster.uarch}") + } + //添加到父容器 + binding.llCluster.addView(itemView) + } } } \ No newline at end of file diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/HardWareFragment.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/HardWareFragment.kt index 2279c8f..1ae50b9 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/HardWareFragment.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dashboard/HardWareFragment.kt @@ -79,11 +79,12 @@ class HardWareFragment : Fragment() { //硬件 binding.text2.textTitle.text = getString(R.string.hardware) binding.text2.textContent.text=cpu.getProcessorName() + //核心数 binding.text3.textTitle.text = getString(R.string.cores) binding.text3.textContent.text=cpu.cores.size.toString() //cpu内核详情 binding.text4.textTitle.text = getString(R.string.CPU) - binding.text4.textContent.text=cpu.getCpuText() + binding.text4.textContent.text=cpu.getAllArchitectures().joinToString() //制程工艺 binding.text5.textTitle.text = getString(R.string.process) binding.text5.textContent.text=cpu.getProcessInfo().process @@ -99,7 +100,6 @@ class HardWareFragment : Fragment() { //频率 binding.text9.textTitle.text = getString(R.string.frequencies) binding.text9.textContent.text=cpu.getFrequencyText() - println(cpu.getFrequencyText()) @@ -125,16 +125,16 @@ class HardWareFragment : Fragment() { binding.gpuText8.textTitle.text=getString(R.string.vulkan_support) binding.gpuText9.textTitle.text=getString(R.string.vulkan_API) binding.open1.text=getString(R.string.opengl) - gpuInfo.eglInformation?.let { eglInfo -> - eglInfo.eglExtensions?.let { - dialogExtension?.setContent(it.joinToString()) - } - eglInfo.glInformation?.let{glInfo -> - binding.openItem1.text=glInfo.glVendor - binding.openItem2.text=glInfo.glRenderer - binding.openItem3.text=glInfo.glVersion - } - } +// gpuInfo.eglInformation?.let { eglInfo -> +// eglInfo.eglExtensions?.let { +// dialogExtension?.setContent(it.joinToString()) +// } +// eglInfo.glInformation?.let{glInfo -> +// binding.openItem1.text=glInfo.glVendor +// binding.openItem2.text=glInfo.glRenderer +// binding.openItem3.text=glInfo.glVersion +// } +// } //display val defaultDisplayInfo = AndInfo.instance.display.getDefaultDisplayInfo() if(defaultDisplayInfo!=null){ diff --git a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogCpuInfo.kt b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogCpuInfo.kt index cbe9ecf..8f23053 100644 --- a/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogCpuInfo.kt +++ b/myphoneinfo/src/main/java/com/xyzshell/myphoneinfo/dialog/DialogCpuInfo.kt @@ -3,11 +3,17 @@ package com.xyzshell.myphoneinfo.dialog import android.graphics.Typeface import android.os.Bundle import android.text.SpannableString +import android.text.style.ForegroundColorSpan import android.text.style.StyleSpan +import android.view.LayoutInflater import android.view.View +import androidx.compose.ui.graphics.Color +import androidx.core.content.ContextCompat +import com.xyzshell.andinfo.AndInfo import com.xyzshell.myphoneinfo.R import com.xyzshell.myphoneinfo.base.BaseDialogFragment import com.xyzshell.myphoneinfo.databinding.DialogCpuInfoBinding +import com.xyzshell.myphoneinfo.databinding.ItemDialogCpuBinding class DialogCpuInfo :BaseDialogFragment(DialogCpuInfoBinding::inflate){ override fun getTitle(): String = resources.getString(R.string.proc_cpuinfo) @@ -18,16 +24,32 @@ class DialogCpuInfo :BaseDialogFragment(DialogCpuInfoBindi override fun onViewCreated(view: View, savedInstanceState: Bundle?) { super.onViewCreated(view, savedInstanceState) - binding.cpuTv01.text=setColonBoldText("Processor :AArch64 Processor rev 2(aarch64)") - binding.cpuTv02.text=setColonBoldText("processor :1") - binding.cpuTv03.text=setColonBoldText("BogoMIPS :3.84" ) - binding.cpuTv04.text=setColonBoldText("Features :fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid") - binding.cpuTv05.text=setColonBoldText("CPU implementer :0×41") - binding.cpuTv06.text=setColonBoldText("CPU architecture :8") - binding.cpuTv07.text=setColonBoldText("CPU variant :0×0") - binding.cpuTv08.text=setColonBoldText("CPU part :0×d03") - binding.cpuTv09.text=setColonBoldText("CPU revision :4") - binding.hardwareTv.text=setColonBoldText("Hardware :vendor Kirin710") + val cpu = AndInfo.instance.cpu//cpu信息 + cpu.processors.forEach { processor -> + val view=LayoutInflater.from(context).inflate(R.layout.item_dialog_cpu,binding.container,false) + val itemBinding= ItemDialogCpuBinding.bind(view) + + itemBinding.cpuTv02.text=setColonBoldText("processor :${processor.core.coreId}") + itemBinding.cpuTv03.text=setColonBoldText("BogoMIPS :" ) + itemBinding.cpuTv04.text=setColonBoldText("Features :${cpu.getCpuFeatures().joinToString(",")}") + itemBinding.cpuTv05.text=setColonBoldText("CPU implementer :${processor.core.midr?.implementer}") + itemBinding.cpuTv06.text=setColonBoldText("CPU architecture :${processor.core.midr?.architecture}") + itemBinding.cpuTv07.text=setColonBoldText("CPU variant :${processor.core.midr?.variant}") + itemBinding.cpuTv08.text=setColonBoldText("CPU part :${processor.core.midr?.primaryPartNumber}") + itemBinding.cpuTv09.text=setColonBoldText("CPU revision :${processor.core.midr?.revision}") + binding.container.addView(view) + } + binding.hardwareTv.text=setColonBoldText("Hardware :${cpu.getProcessorName()}") +// binding.cpuTv01.text=setColonBoldText("Processor :${cpu.getProcessorName()}") +// binding.cpuTv02.text=setColonBoldText("processor :1") +// binding.cpuTv03.text=setColonBoldText("BogoMIPS :3.84" ) +// binding.cpuTv04.text=setColonBoldText("Features :fp asimd evtstrm aes pmull sha1 sha2 crc32 cpuid") +// binding.cpuTv05.text=setColonBoldText("CPU implementer :0×41") +// binding.cpuTv06.text=setColonBoldText("CPU architecture :8") +// binding.cpuTv07.text=setColonBoldText("CPU variant :0×0") +// binding.cpuTv08.text=setColonBoldText("CPU part :0×d03") +// binding.cpuTv09.text=setColonBoldText("CPU revision :4") +// binding.hardwareTv.text=setColonBoldText("Hardware :vendor Kirin710") } fun setColonBoldText( text: String) : SpannableString { val colonIndex = text.indexOf(":") @@ -40,6 +62,12 @@ class DialogCpuInfo :BaseDialogFragment(DialogCpuInfoBindi colonIndex, SpannableString.SPAN_INCLUSIVE_INCLUSIVE ) + spannableString.setSpan( + ForegroundColorSpan(ContextCompat.getColor(context,R.color.left_color)), + 0, + colonIndex, + SpannableString.SPAN_INCLUSIVE_EXCLUSIVE + ) return spannableString } else { return SpannableString(text) diff --git a/myphoneinfo/src/main/res/layout/activity_analysis.xml b/myphoneinfo/src/main/res/layout/activity_analysis.xml index 8546d83..3ad8617 100644 --- a/myphoneinfo/src/main/res/layout/activity_analysis.xml +++ b/myphoneinfo/src/main/res/layout/activity_analysis.xml @@ -33,10 +33,6 @@ android:textColor="@color/black" style="@style/TextHeavy20"/> - - - - - - - - - + android:orientation="vertical"> diff --git a/myphoneinfo/src/main/res/layout/dialog_cpu_info.xml b/myphoneinfo/src/main/res/layout/dialog_cpu_info.xml index 7bc9223..f11483d 100644 --- a/myphoneinfo/src/main/res/layout/dialog_cpu_info.xml +++ b/myphoneinfo/src/main/res/layout/dialog_cpu_info.xml @@ -16,277 +16,21 @@ android:orientation="vertical"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + android:textColor="@color/right_color" + android:textSize="18sp" /> diff --git a/myphoneinfo/src/main/res/layout/item_analysis.xml b/myphoneinfo/src/main/res/layout/item_analysis.xml new file mode 100644 index 0000000..2d63b83 --- /dev/null +++ b/myphoneinfo/src/main/res/layout/item_analysis.xml @@ -0,0 +1,30 @@ + + + + + + + + + \ No newline at end of file diff --git a/myphoneinfo/src/main/res/layout/item_cpu_analysis.xml b/myphoneinfo/src/main/res/layout/item_cpu_analysis.xml new file mode 100644 index 0000000..f5cba91 --- /dev/null +++ b/myphoneinfo/src/main/res/layout/item_cpu_analysis.xml @@ -0,0 +1,31 @@ + + + + + + + + + \ No newline at end of file diff --git a/myphoneinfo/src/main/res/layout/item_dialog_cpu.xml b/myphoneinfo/src/main/res/layout/item_dialog_cpu.xml new file mode 100644 index 0000000..7fb0838 --- /dev/null +++ b/myphoneinfo/src/main/res/layout/item_dialog_cpu.xml @@ -0,0 +1,92 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file