首页 > 其他分享 >Android 获取设备的CPU型号和设备型号

Android 获取设备的CPU型号和设备型号

时间:2024-03-11 14:36:12浏览次数:23  
标签:val customOS private VERSION 型号 KEY Android ro CPU

原文: Android 获取设备的CPU型号和设备型号-Stars-One的杂货小窝

之前整的项目的总结信息,可能不太全,凑合着用吧,代码在最下面一节

CPU型号数据

  • 华为: ro.mediatek.platform
  • vivo: ro.vivo.product.platform
  • oppo: ro.board.platform 或 ro.product.board
  • 三星: ro.board.platform
  • 小米: ro.soc.model

小米:

GKI 2.0 之前,/proc/cpuinfo 中包含 Hardware 相关信息,应用可以从中读取 cpu 型号信息;
GKI 2.0 之后,/proc/cpuinfo 中不再包含 Hardware 相关信息,应用无法从中读取到 cpu 型号信息,需要从 android.os.SystemProperties 中读取 ro.soc.model 属性信息。参考说明:关于 GKI 内核版本说明

建议优先从 android.os.SystemProperties 中读取 ro.soc.model 属性信息,若此属性信息为空,则再从 /proc/cpuinfo 中读取 Hardware 信息即可。

1.查看所有配置信息:
adb shell getprop

2.查看指定配置信息:
adb shell getprop [key]
如:查看设备型号:adb shell getprop “ro.product.model”

可以通过adb shell命令来得到数据或者通过反射

//通过shell命令
val cmdResult = ShellUtils.execCmd("getprop", false)

//通过反射
val classType = Class.forName("android.os.SystemProperties")
val method = classType.getDeclaredMethod("get", String::class.java)
val result = method.invoke(classType, "ro.vivo.product.platform") as String //SM6225

设备型号

vivo

[ro.vivo.os.build.display.id]: [OriginOS 1.0]
[ro.vivo.os.name]: [Funtouch]
[ro.vivo.os.version]: [12.0]
[ro.vivo.market.name]: [vivo Y32]	

小米

新增ro.product.marketname属性,值为手机设备名(上市机型名称);

历史已发布手机上设备型号的属性ro.product.model依然有效,以后新发布的机型上不再生效。请开发者及时适配。

建议应用优先读取属性ro.product.marketname,如果返回值不为空,这个值就是手机设备型号。如果此属性返回值为空,则读取之前的属性ro.product.model值

public static String getDeviceName() {
    String deviceName = "";
    try {
        Class SystemProperties = Class.forName("android.os.SystemProperties");
        Method get = SystemProperties.getDeclaredMethod("get", String.class, String.class);
        deviceName = (String) get.invoke(SystemProperties, "ro.product.marketname", "");
        if (TextUtils.isEmpty(deviceName)) {
            deviceName = (String) get.invoke(SystemProperties, "ro.product.model", "");
        }
    } catch (InvocationTargetException | NoSuchMethodException | IllegalAccessException | ClassNotFoundException e) {
        e.printStackTrace();
    }
    return deviceName;
}

工具类源码

点击展开代码
package com.hlfonts.richway.widget.tool

import android.os.Build
import android.text.TextUtils
import com.blankj.utilcode.util.ShellUtils
import java.util.*

/**
 * 工具类参考 https://blog.csdn.net/convex1009848621/article/details/120767000
 */
object CustomOSUtils {
    /**
     * customOS默认值为"",如果识别出的手机厂商是预知的,会被重新赋值,如果未识别到该机型则返回原生安卓信息
     */
    private var customOS: String? = ""

    /**
     * CustomOSVersion默认值为"",如果识别出的手机厂商是预知的,会被重新赋值成对应rom系统的版本号
     * 如果未识别到该机型则返回原生安卓信息
     */
    private var customOSVersion: String? = ""

    /**
     * HarmonyOS 系统输出的
     * 格式:2.0.0
     */
    private const val KEY_HARMONYOS_VERSION_NAME = "hw_sc.build.platform.version"

    /**
     * EMUI系统输出的
     * 格式:EmotionUI_8.0.0
     */
    private const val KEY_EMUI_VERSION_NAME = "ro.build.version.emui"

    /**
     * MagicUI系统输出的
     * 格式:3.1.0
     */
    private const val KEY_MAGICUI_VERSION = "ro.build.version.magic"

    /**
     * MIUI系统输出的
     * 格式:V12
     */
    private const val KEY_MIUI_VERSION_NAME = "ro.miui.ui.version.name"

    /**
     * OPPO手机ColorOS系统输出的
     * 格式:9
     */
    private const val KEY_COLOROS_VERSION_NAME = "ro.build.version.opporom"

    /**
     * VIVO手机系统输出的
     * name格式:funtouch
     * version格式: 9
     */
    private const val KEY_VIVO_VERSION_NAME = "ro.vivo.os.name"
    private const val KEY_VIVO_VERSION = "ro.vivo.os.version"

    /**
     * OonPlus手机系统输出的
     * 格式:Hydrogen OS 11.0.7.10.KB05
     */
    private const val KEY_ONEPLUS_VERSION_NAME = "ro.rom.version"

    /**
     * 魅族手机系统输出的
     */
    private const val KEY_FLYME_VERSION_NAME = "ro.build.display.id"

    /**
     * nubia手机系统输出的
     */
    private const val KEY_NUBIA_VERSION_NAME = "ro.build.nubia.rom.name"
    private const val KEY_NUBIA_VERSION_CODE = "ro.build.nubia.rom.code"

    /**
     * 传入获取手机系统属性的key,可以得到rom系统版本信息
     * @param key
     * @return
     */
    private fun getSystemPropertyValue(key: String): String {
        val cmd = """
                getprop "$key"
            """.trimIndent()
        val cmdResult = ShellUtils.execCmd(cmd, false)
        return cmdResult.successMsg?:""

    }

    /**
     * 判断是否是华为鸿蒙系统,能否识别荣耀鸿蒙未知
     *
     * @return
     */
    private fun isHarmonyOS(): Boolean {
        val value = getHarmonyOsBrand()
        return TextUtils.isEmpty(value).not()
    }

    private fun getHarmonyOsBrand(): String {
        var result = ""
        kotlin.runCatching {
            val classType = Class.forName("com.huawei.system.BuildEx")
            val getMethod = classType.getMethod("getOsBrand")
            result = getMethod.invoke(classType) as String
        }
        return result
    }


    /**
     * 通过手机品牌信息获取手机rom系统+系统版本号
     * @param phoneBrand
     * @return 如 flyme 5.0
     */
    fun getPhoneSystemName(): String {
        if (TextUtils.isEmpty(customOS)) {
            setCustomOSInfo()
        }
        return "$customOS $customOSVersion"
    }

    private val isMagicUI: Boolean = false

    /**
     * 通过手机品牌信息获取手机rom系统
     * @param phoneBrand
     * @return
     */
    fun getCustomOS(): String? {
        if (TextUtils.isEmpty(customOS)) {
            setCustomOSInfo()
        }
        return customOS
    }

    /**
     * 通过手机品牌信息获取手机rom系统版本号
     * @param phoneBrand
     * @return
     */
    fun getCustomOSVersion(): String? {
        if (TextUtils.isEmpty(customOS)) {
            setCustomOSInfo()
        }
        return customOSVersion
    }


    /**
     * 删除字符串中的空格并全部转成大写
     * @param str
     * @return
     */
    private fun deleteSpaceAndToUpperCase(str: String): String {
        return if (TextUtils.isEmpty(str)) {
            ""
        } else str.replace(" ".toRegex(), "").uppercase(Locale.getDefault())
    }

    private fun setCustomOSInfo() {
        //  示例: xiaomi
        val phoneBrand = Build.BRAND
        try {
            when (deleteSpaceAndToUpperCase(phoneBrand)) {
                "HUAWEI" -> if (isHarmonyOS()) {
                    customOSVersion = getSystemPropertyValue(KEY_HARMONYOS_VERSION_NAME)
                    customOS = "Harmony"
                } else {
                    customOS = "EMUI"
                    customOSVersion = getSystemPropertyValue(KEY_EMUI_VERSION_NAME)
                }
                "HONOR" -> if (isHarmonyOS()) {
                    customOS = "Harmony"
                    if (!TextUtils.isEmpty(getSystemPropertyValue(KEY_HARMONYOS_VERSION_NAME))) {
                        customOSVersion = getSystemPropertyValue(KEY_HARMONYOS_VERSION_NAME)
                    } else {
                        customOSVersion = ""
                    }
                } else if (!TextUtils.isEmpty(getSystemPropertyValue(KEY_MAGICUI_VERSION))) {
                    customOS = "MagicUI"
                    customOSVersion = getSystemPropertyValue(KEY_MAGICUI_VERSION)
                } else {
                    //格式:EmotionUI_8.0.0
                    customOS = "EMUI"
                    customOSVersion = getSystemPropertyValue(KEY_EMUI_VERSION_NAME)
                }
                "XIAOMI", "REDMI" -> {
                    //格式:MIUIV12
                    customOS = "MIUI"
                    customOSVersion = getSystemPropertyValue(KEY_MIUI_VERSION_NAME)
                }
                "REALME", "OPPO" -> {
                    //格式:ColorOSV2.1
                    customOS = "ColorOS"
                    customOSVersion = getSystemPropertyValue(KEY_COLOROS_VERSION_NAME)
                }
                "VIVO" -> {
                    val result = getSystemPropertyValue("ro.vivo.os.build.display.id")
                    if (result.isNotBlank()) {
                        //格式: OriginOS 1.0
                        val arr = result.split(" ")
                        customOS = arr.first()
                        customOSVersion = arr.last()
                    } else {
                        //格式:Funtouch9
                        customOS = "Funtouch"
                        customOSVersion = getSystemPropertyValue(KEY_VIVO_VERSION)
                    }
                }
                "ONEPLUS" -> {
                    //格式:Hydrogen OS 11.0.7.10.KB05
                    customOS = "Hydrogen"
                    customOSVersion = getSystemPropertyValue(KEY_ONEPLUS_VERSION_NAME)
                }
                "MEIZU" -> {
                    //格式:Flyme 6.3.5.1G
                    customOS = "Flyme"
                    customOSVersion = getSystemPropertyValue(KEY_FLYME_VERSION_NAME)
                }
                "NUBIA" -> {
                    //格式:nubiaUIV3.0
                    customOS = getSystemPropertyValue(KEY_NUBIA_VERSION_NAME)
                    customOSVersion = getSystemPropertyValue(KEY_NUBIA_VERSION_CODE)
                }
                else -> {
                    customOS = "Android"
                    customOSVersion = Build.VERSION.RELEASE
                }
            }
        } catch (e: Exception) {
            customOS = "Android"
            customOSVersion = Build.VERSION.RELEASE
        }
    }
}

用法:

CustomOSUtils.getPhoneSystemName()

参考

标签:val,customOS,private,VERSION,型号,KEY,Android,ro,CPU
From: https://www.cnblogs.com/stars-one/p/18066008

相关文章

  • Android 获取设备的亮度百分比
    一般的屏幕亮度都是0-255,而小米手机的高版本不一样为了使亮度调节更加细腻,MIUI对原生亮度级别进行了扩展,由原有的255级调整根据不同屏幕分别支持255/1023/2047/4095级。开发者在进行亮度调整时需要先去确认机型亮度的最大值和最小值,然后进行比例调整。计算屏幕亮度fung......
  • Android 《系统广播》
    一.接收系统的分钟广播TimeReceiver.javapackagecom.xian.app.broadcast.receiver;importandroid.content.BroadcastReceiver;importandroid.content.Context;importandroid.content.Intent;importandroid.util.Log;importjava.util.Date;publicclassTimeReceiv......
  • 在Docker中,如何控制容器占用系统资源(CPU,内存)的份额?
    在Docker中,你可以通过多种方式来控制容器对系统资源(如CPU和内存)的使用份额,以确保容器不会过度消耗宿主机的资源,并与其他容器公平地共享资源。以下是一些常用的方法:一.控制CPU资源CPU份额(CPUShares):Docker使用CPU份额来分配CPU时间。默认情况下,所有容器具有相同的CPU份额,这意......
  • 在Linux中,发现CPU负载过大,接下来怎么办?
    在Linux系统中,如果发现CPU负载过高,遵循以下步骤进行故障排查和解决:1.监控与确认问题使用top或htop命令实时查看当前CPU使用情况,并找出占用CPU较高的进程:top或者htop#需要先安装htop工具在top中按1可以看到每个单独的CPU核心的负载情况。使用ps或psaux......
  • 在Linux中,如何获取CPU的总核心数?
    在Linux中,可以通过几种不同的命令来获取CPU的总核心数。具体如下:查看物理CPU个数:可以通过查看/proc/cpuinfo文件来获取物理CPU的个数。使用以下命令:cat/proc/cpuinfo|grep"physicalid"|sort-u|wc-l这个命令会显示物理CPU的个数。查看每个物理CPU的核数:同样,可......
  • 在Linux中,如何查看占用CPU最多的进程?
    在Linux中,有多种方法可以查看占用CPU最多的进程。以下是几种常用的方法:使用top命令:top命令是Linux中常用的性能分析工具,可以实时显示系统中各个进程的资源占用情况,包括CPU使用率。打开终端,输入top命令,按下回车键。top命令会显示出当前系统中CPU使用率最高的进程列表。默认情......
  • CPU型号后面的字母分别是什么含义?
    笔记本CPU的处理器型号后缀U、P、H各自代表着不同的性能和用途。 U系列代表超低功耗(Ultra-LowPower),专为轻薄型笔记本电脑和长续航时间设备设计,适用于日常办公和轻度应用。P系列则代表高性能(Performance),具备更高的时钟频率和计算能力,适用于复杂应用程序、多任务处理和图形设......
  • Android Studio 2021 Gradle 下载失败时,解决方法
    我是mac,Androidstudio2021,创建一个android项目,gradle下载失败,折腾了半天,以下是解决方法:1.出现的错误: 无法下载gradle,2.解决方法使用腾讯的镜像,这里的 地址为:https://mirrors.cloud.tencent.com/gradle/gradle-8.4-all.zip后面的版本可以按自己的需求随意切换然......
  • 【测试】Android Studio 相关下载及参数
    AndroidStudio仅限命令行工具ZipfilesWindows:commandlinetools-win-11076708_latest.zip(153.6MB)SHA-256Checksums4d6931209eebb1bfb7c7e8b240a6a3cb3ab24479ea294f3539429574b1eec862commandlinetools-win-11076708_latest.zipAndroidEmulatorAndroid模拟器......
  • Delphi11安装Android安卓SDK
    由于Google的AndroidSDK不再允许其他程序分发。Delphi11安装后,默认是没有Android安卓SDK的,在默认安装路径的情况下,在C:\Users\Public\Documents\Embarcadero\Studio\22.0\CatalogRepository\AndroidSDK-2525-22.0.46141.0937\目录下面,只有最基本的安卓SDK的命令行工具,我们可以使......