欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Android app开发中获取cpu arm架构信息及执行shell命令方法

程序员文章站 2022-06-20 21:06:52
...

    最近在做一个项目,需要在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。

    那么,在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,这个让我非常的郁闷,找了不少方式也都没有办法解决。如果有人知道为什么返回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();
    }