前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >adb shell 查看系统属性(用来判断特殊的操作系统)

adb shell 查看系统属性(用来判断特殊的操作系统)

作者头像
用户1155943
发布2018-01-04 15:25:45
2.4K0
发布2018-01-04 15:25:45
举报
文章被收录于专栏:Android点滴积累Android点滴积累

一般来讲,在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;
    }
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2016-02-15 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档