查看Android设备的CPU架构信息

查看Android设备的CPU架构信息
db shell cat /proc/cpuinfo

最近在做一个项目中使用了vitamio视频播放框架,框架不支持部分cpu,所以需要在app开发过程中去判断cpu的arm架构,比如说是armeabi-v7a,或是arm64-v8a。

其实,在adb shell命令下面,可以通过getprop的方式,获取到一些信息,比如:

rk3399_urbetter:/ # getprop|grep arm
[dalvik.vm.isa.arm.features]: [default]
[dalvik.vm.isa.arm.variant]: [cortex-a53.a57]
[dalvik.vm.isa.arm64.features]: [default]
[dalvik.vm.isa.arm64.variant]: [cortex-a53]
[persist.sys.alarm.fixed]: [300000]
[ro.config.alarm_alert]: [Alarm_Classic.ogg]
[ro.product.cpu.abi]: [arm64-v8a]
[ro.product.cpu.abilist]: [arm64-v8a,armeabi-v7a,armeabi]
[ro.product.cpu.abilist32]: [armeabi-v7a,armeabi]
[ro.product.cpu.abilist64]: [arm64-v8a]
rk3399_urbetter:/ #

可以看到,现在cpu的架构是支持arm64-v8a。
科普一下:

processor: 0/1 表示第几个核。
BogoMIPS:伪MIPS,用于测量CPU速度,详细分析可见:
https://www.linux-mips.org/wiki?title=bogomips&oldid=6231
https://blog.csdn.net/ly890700/article/details/52294769
Features:表示当前CPU所支持的特性,比如neon,vfp等。
CPU architecture:7表示arm-v7,8表示arm-v8
AArch64是ARMv8 架构的一种执行状态。
为了更广泛地向企业领域推进,需要引入 64 位构架。同时也需要在 ARMv8 架构中引入新的 AArch64 执行状态。AArch64 不是一个单纯的 32 位 ARM 构架扩展,而是 ARMv8 内全新的构架,完全使用全新的 A64 指令集。这些都源自于多年对现代构架设计的深入研究。更重要的是, AArch64 作为一个分离出的执行状态,意味着一些未来的处理器可能不支持旧的 AArch32 执行状态。 虽然最初的 64 位 ARM 处理器将会完全向后兼容,但我们大胆且前瞻性地将 AArch64 作为在 ARMv8 处理器中唯一的执行状态。我们在这些系统中将不支持 32 位执行状态, 这将使许多有益的实现得到权衡,如默认情况下,使用一个较大的 64K 大小的页面,并会使得纯净的 64 位 ARM 服务器系统不受遗留代码的影响。立即进行这种划分是很重要的,因为有可能在未来几年内将出现仅支持 64 位的服务器系统。没有必要在新的 64 位架构中去实现一个完整的 32 位流水线,这将会提高未来 ARM 服务器系统的能效。这样回想起来, AArch64 作为在 Fedora ARM 项目中被支持的 ARM 构架是一个很自然的过程: armv5tel、armv7hl、aarch64。新的架构被命名为:aarch64,这同 ARM 自己选择的主线命名方式保持一致,同时也考虑到了 ARM 架构名与 ARM 商标分开的期望。
ARMv8-A将 64 位架构支持引入 ARM 架构中,其中包括:
64 位通用寄存器、SP(堆栈指针)和 PC(程序计数器)
64 位数据处理和扩展的虚拟寻址

两种主要执行状态:
AArch64 - 64 位执行状态,包括该状态的异常模型、内存模型、程序员模型和指令集支持
AArch32 — 32 位执行状态,包括该状态的异常模型、内存模型、程序员模型和指令集支持
这些执行状态支持三个主要指令集
A32(或 ARM):32 位固定长度指令集,通过不同架构变体增强部分 32 位架构执行环境现在称为 AArch32。
T32 (Thumb) 是以 16 位固定长度指令集的形式引入的,随后在引入 Thumb-2 技术时增强为 16 位和 32 位混合长度指令集。部分 32 位架构执行环境现在称为 AArch32。
A64:提供与 ARM 和 Thumb 指令集类似功能的 32 位固定长度指令集。随 ARMv8-A 一起引入,它是一种 AArch64 指令集。
ARM ISA 不断改进,以满足前沿应用程序开发人员日益增长的要求,同时保留了必要的向后兼容性,以保护软件开发投资。在 ARMv8-A 中,对 A32 和 T32 进行了一些增补,以保持与 A64 指令集一致。

那么,在app的开发过程中,是怎么样获取到这个值呢。

分成两个层次来讨论:

1) native层

 在native层,可以通过property_get()函数来实现,比如:

char value[PROPERTY_VALUE_MAX];
property_get(EXIT_PROP_NAME, value, "0");

2) java层

这次遇到的问题就是需要在java层去做这个事情。网络上面有介绍可以使用System.getproperty()来达到这个目标,不过Java的System.getProperty得到null,暂时还没有解决。但是可以寻求折中的解决方案,就是在java层执行shell 命令,直接通过getprop的shell命令来获取到结果。

cpu_abi = mCMD.execCmd("getprop ro.product.cpu.abi");
        public static String execCmd(String cmd) {
                DataOutputStream dos = null;
                String result = "";
                String lastline = " ";
                try {
                    Process process = Runtime.getRuntime().exec(cmd);// 经过Root处理的android系统即有su命令
                    //get the err line
                    InputStream stderr = process.getErrorStream();
                    InputStreamReader isrerr = new InputStreamReader(stderr);
                    BufferedReader brerr = new BufferedReader(isrerr);
         
                    //get the output line
                    InputStream outs = process.getInputStream();
                    InputStreamReader isrout = new InputStreamReader(outs);
                    BufferedReader brout = new BufferedReader(isrout);
                    String errline = null;
         
         
                    // get the whole error message
                    String  line = "";
         
                    while ( (line = brerr.readLine()) != null)
                    {
                        result += line;
                        result += "/n";
                    }
         
                    if( result != "" )
                    {
                        // put the result string on the screen
                        Log.i(TAG," the str error message " + result.toString());
                    }
         
                    // get the whole standard output string
                    while ( (line = brout.readLine()) != null)
                    {
                        lastline = line;
                        result += line;
                        result += "/n";
                    }
                    if( result != "" )
                    {
                        // put the result string on the screen
                        Log.i(TAG," the standard output message " + lastline.toString());
                    }
                }catch(Throwable t)
                {
                    t.printStackTrace();
                }
                return lastline.toString();
            }
发布了70 篇原创文章 · 获赞 176 · 访问量 31万+

猜你喜欢

转载自blog.csdn.net/zheng_weichao/article/details/89633835