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 条评论
登录 后参与评论

相关文章

来自专栏向治洪

Android 进程回收之LowMemoryKiller原理篇

在前面的文章Android进程保活一文中,对于LowMemoryKiller的概念做了简单的提及。LowMemoryKiller简称低内存杀死机制。简单来说,L...

3377
来自专栏向治洪

Android 进程回收之LowMemoryKiller原理篇

在前面的文章Android进程保活一文中,对于LowMemoryKiller的概念做了简单的提及。LowMemoryKiller简称低内存杀死机制。简单来说,L...

25510
来自专栏前端知识分享

第32天:微博发布动态

653
来自专栏简书专栏

基于bs4+requests的python爬虫伪装 - 草稿

要导入fake-useragent库,需要先用pip安装,安装命令:pip install fake-useragent params是爬虫伪装的参数,数据类...

692
来自专栏一个会写诗的程序员的博客

《Spring Boot 实战:从0到1》第4章 Spring Boot自动配置原理第3章 Spring Boot自动配置原理

我们可以看到有783个java文件。spring-boot核心工程有551个java文件。从上面的java文件数量大致可以看出,SpringBoot技术框架的核...

952
来自专栏数据和云

Oracle12.2体系架构图:Filesystem+Multitenant

全面解读Oracle 12.2体系架构图系列课程,精彩继续。本期的内容由两部分组成,一是数据库实例与文件系统的访问;二是多租户解决方案。文中将会简单列举视频要点...

3289
来自专栏草根专栏

ASP.NET Core的实时库: SignalR简介及使用

SignalR是一个.NET Core/.NET Framework的开源实时框架. SignalR的可使用Web Socket, Server Sent Ev...

481
来自专栏用户3030674的专栏

GreenDao教程1

最近项目重构,涉及到了数据库和文件下载,发现GreenDao这个框架还是不错的。直接面向对象的,可以通过对对象的操作,实现数据的存储。

663
来自专栏史上最简单的Spring Cloud教程

SpringBoot非官方教程 | 第二篇:Spring Boot配置文件详解

springboot采纳了建立生产就绪Spring应用程序的观点。 Spring Boot优先于配置的惯例,旨在让您尽快启动和运行。在一般情况下,我们不需要做太...

2456
来自专栏散尽浮华

测试网站页面网速的一个简单Python脚本

无聊之余,下面分享一个Python小脚本:测试网站页面访问速度 [root@huanqiu ~]# vim pywww.py #!/usr/bin/python...

20610

扫码关注云+社区