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;
    }
}

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏LuckQI

学习Java基础知识,打通面试关七

861
来自专栏猿人谷

《C++ primer》--第11章

习题11.1 algorithm头文件定义了一个count的函数,其功能类似于find。这个函数使用一对迭代器和一个值做参数,返回这个值出现次数的统计结果。编写...

1865
来自专栏吴裕超

exports 和 module.exports 的区别

require 用来加载代码,而 exports 和 module.exports 则用来导出代码。但很多新手可能会迷惑于 exports 和 module.e...

2714
来自专栏北京马哥教育

10个Python面试常问的问题

1758
来自专栏MasiMaro 的技术博文

C++继承

在封装的过程中,我们发现有很多地方有问题,比如我们在封装Windows API 的过程中,每个窗口都有各自的消息处理,而我们封装时不同的窗口要针对不同的消息而编...

752
来自专栏冰霜之地

从 JavaScript 作用域说开去

在电脑程序设计中,作用域(scope,或译作有效范围)是名字(name)与实体(entity)的绑定(binding)保持有效的那部分计算机程序。不同的编程语言...

853
来自专栏数据结构笔记

数据结构(一):什么是数据结构

数据的逻辑结构是从逻辑关系上描述数据(主要是相邻关系,比如栈、队列、链表等),它与数据的存储无关,是独立于计算机的。因此,数据结构可以看作从具体问题中抽象...

1454
来自专栏极客慕白的成长之路

JavaScript代码压缩细节

对于Javascript来说,提高网络下载的性能最直接的方法就是把JS文件体积减小。

892
来自专栏河湾欢儿的专栏

第一节预解释、作用域、this原理

632
来自专栏WD学习记录

基本一

1.extern可以置于变量或者函数前,以表示变量或者函数的定义在别的文件中,提示编译器遇到此变量和函数时在其他模块中寻找其定义。另外,extern也可用来进行...

1445

扫码关注云+社区