adb shell 查看系统属性(用来判断特殊的操作系统)
2016-02-15 19:53
519 查看
原文链接:https://www.geek-share.com/detail/2666537180.html
一般来讲,在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,代码入下
shell@mx4pro:/ $
cd system
shell@mx4pro:/system $
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 .....还有很多
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.v 3ff7 ersion.incremental ro.build.display.id ro.build.description ro.build.fingerprint
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必须要配置到系统环境变量中)
shell@mx4pro:/ $
- 进入system目录
cd system
shell@mx4pro:/system $
- 查看系统属性
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这个词最能代表它的属性
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.v 3ff7 ersion.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; } }
转载于:https://www.cnblogs.com/popfisher/p/5191232.html
相关文章推荐
- adb shell 查看系统属性(用来判断特殊的操作系统)
- adb shell 查看系统属性(用来判断特殊的操作系统)
- linux操作学习06文件权限:文件属性查看(ls),文件所有人、组的管理(chown、chgrp),文件普通权限(chmod)、系统默认权限的设定(umask)、文件特殊权限
- adb shell 查看系统属性
- 通过关键系统文件判断正确的操作系统版本
- Linux操作系统下TCP keepalive属性查看
- 20.5 shell脚本中的逻辑判断 20.6 文件目录属性判断 20.7 if特殊用法 20.8/20.9 case判断
- 操作系统为win7 ,用vs2010写的应用程序,打包时在属性--系统必备中找不到.net2.0 如何解决
- shell逻辑判断、文件属性判断、if特殊用法、case判断
- 如何查看mac系统是32位还是64位的操作系统
- 20.5 Shell脚本中的逻辑判断;20.6 文件目录属性判断;20.7 if特殊用法;20.8 20.9 cace判断(上下)
- 通过关键系统文件判断正确的操作系统版本
- 牛客网Java刷题知识点之File对象常用功能:获取文件名称、获取文件路径、获取文件大小、获取文件修改时间、创建与删除、判断、重命名、查看系统根目录、容量获取、获取某个目录下内容、过滤器
- 判断这个函数有没有某个属性,用来第一次调用这个函数使用
- AIX和Linux下用来收集查看系统状态的命令:*stat
- linux学习第六十四篇:Shell脚本中的逻辑判断,文件目录属性判断, if特殊用法,case判断
- Linux中文件系统的权限管理(普通权限,特殊权限,文件的扩展属性,FACL)
- Linux操作系统下TCP keepalive属性查看
- 用来查看系统占用的端口
- 命令查看windows系统服务的属性信息