zoukankan      html  css  js  c++  java
  • adb shell 查看系统属性(用来判断特殊的操作系统)

    一般来讲,在android程序开发中进行需要判断设备类型和系统版本
    1、设备类型判断(android.os.Build.MODEL
    比如判断属于Google Nexus 5,Nexus 7,MIUI v5, MIUI v6,三星设备,魅族设备等;
    这类型的问题都使用的android.os.Build.MODEL来判断,android.os.Build.MODEL是一个String变量,可以根据String中一些特殊字段来判断android设备属于什么设备,比如判断Nexus 7,代码入下
    public static boolean isN7() {
        return "Nexus 7".equals(android.os.Build.MODEL);
    }
     
    所以平时开发过程中如果不知道一个设备的MODEL值,写个测试程序输出android.os.Build.MODEL值,然后再将该值用到我么的程序中参与判断。
     
    2、系统版本判断(api版本-android.os.Build.VERSION.SDK_INT
    比如判断系统是属于2.3, 3.0, 4.4, 5.0 等,这种属性判断使用的是系统的android.os.Build.VERSION.SDK_INT变量。
    最常用的场景是用来判断一些系统函数的api版本,比如有些方法只有高版本的api才有,低版本上使用会导致程序崩溃。
     
    但是还有一种场景导致还要第三种方法才能搞定
    使用场景:现在操作系统大多是开源的,默认是google 的android系统,但是别忘了还有魅族的Flyme OS 和小米的 Miui,它们是android的变种。如果用非小米手机也装上了miui,后者是非魅族手机装上了魅族的Flyme OS,这种情况怎么判断呢。拿魅族来说:显然这个时候不能用判断设备类型的方式,因为非魅族设备安装了魅族系统。所以这个时候只能判断这个操作系统是魅族的Flyme OS,它的操作系统应该具备一些它自己的特性,所以只要找到一个唯一的特性就可以解决上面的问题了。
     
    3、判断特殊的操作系统---获取系统属性加以研究(魅族为例)
    进入adb shell,获取魅族系统属性:
    • 首先进入cmd,然后输入adb shell 命令进入adb shell (前提:adb必须要配置到系统环境变量中)
         C:\Users\Administrator>adb shell
         shell@mx4pro:/ $
    • 进入system目录
         shell@mx4pro:/ $ cd system
         cd system
         shell@mx4pro:/system $
    • 查看系统属性
         shell@mx4pro:/system $ cat build.prop
         cat build.prop
         # begin build properties
         # autogenerated by buildinfo.sh
         ro.build.cta=noncta
         ro.build.id=KTU84P
         ro.build.mask.id=4.4.4-1423716396_wo
         ro.build.args=
         ro.build.inside.id=4.4.4-20150212124636
         ro.build.version.incremental=m76.Flyme_OS_4.2.2.1.20150212124636
         ro.build.version.sdk=19
         ro.build.version.codename=REL
         ro.build.version.release=4.4.4
        .....还有很多
    • 筛选包含Flyme字符的属性,因为既然是魅族操作系统,Flyme这个词最能代表它的属性
         shell@mx4pro:/system $ cat build.prop | grep Flyme
         cat build.prop | grep Flyme

         ro.build.version.incremental=m76.Flyme_OS_4.2.2.1.20150212124636
         ro.build.display.id=Flyme OS 4.2.2.1U
         ro.build.description=meizu_mx4pro-user 4.4.4 KTU84P m76.Flyme_OS_4.2.2.1.2015021
         2124636 release-keys
         ro.build.fingerprint=Meizu/meizu_mx4pro/mx4pro:4.4.4/KTU84P/m76.Flyme_OS_4.2.2.1
         .20150212124636:user/release-keys
         shell@mx4pro:/system $
         
        帅选到四个属性:ro.build.version.incremental   ro.build.display.id   ro.build.description    ro.build.fingerprint
    • 换一个其他的安装有魅族操作系统设备,重复上面的步骤。最终会发现 ro.build.display.id这个属性可以当做一个魅族操作系统唯一的特性(因为这个属性值几乎都会包含Flyme字段,这正是我们想要的)。我们就可以用这个属性来与其他系统进行区分。
    • 最后一步,当然是怎么取出这个属性值了。

    4、通过反射调用获取系统属性

    // 判断是魅族操作系统
    public static boolean isMeizuFlymeOS() {
          return getMeizuFlymeOSFlag().toLowerCase().contains("flyme");
    }
     
    /**
     * 获取魅族系统操作版本标识
     */
    public static String getMeizuFlymeOSFlag() {
          return getSystemProperty("ro.build.display.id", "");
    }
     
    private static String getSystemProperty(String key, String defaultValue) {
            try {
                    Class<?> clz = Class.forName("android.os.SystemProperties");
                    Method get = clz.getMethod("get", String.class, String.class);
                    return (String)get.invoke(clz, key, defaultValue);
            } catch (Exception e) {
            }
            return defaultValue;
    }
    
    // 下面是小米操作系统的一些相关方法
    /**
     * 获取MIUI版本名
     */
    public static String getMIUIVersionName() {
            return getSystemProperty("ro.miui.ui.version.name", null);
    }
     
    // MIUI v5版本
    public static boolean isV5(){
            if("V5".equalsIgnoreCase(getMIUIVersionName())){
                    return true;
            }
            return false;
    }

    为了方便,封装一个反射调用系统SystemProperties类的工具类

    public class SystemPropertiesReflect {
        public static String get(String key, String value) {
            try {
                Method method = Class.forName("android.os.SystemProperties")
                        .getMethod("get", String.class, String.class); return (String) method.invoke(null, key, value); } catch (Exception e) { } return value; } public static long getLong(String key, long value) { try { Method method = Class.forName("android.os.SystemProperties")
                        .getMethod("getLong", String.class, long.class); return (Long) method.invoke(null, key, value); } catch (Exception e) { } return value; } }
  • 相关阅读:
    【LOJ】#2071. 「JSOI2016」最佳团体
    【LOJ】#2070. 「SDOI2016」平凡的骰子
    【LOJ】#2069. 「SDOI2016」齿轮
    【LOJ】#2068. 「SDOI2016」探险路线
    【LOJ】#2067. 「SDOI2016」硬币游戏
    【LOJ】#2066. 「SDOI2016」墙上的句子
    【LOJ】#2065. 「SDOI2016」模式字符串
    【LOJ】#2064. 「HAOI2016」找相同字符
    【LOJ】#2063. 「HAOI2016」字符合并
    【LOJ】#2062. 「HAOI2016」地图
  • 原文地址:https://www.cnblogs.com/popfisher/p/5191232.html
Copyright © 2011-2022 走看看