Android Build类获取系统信息
2015-03-31 11:27
555 查看
Build类中的常量列表
Build类可以用来获取Android系统的相关信息。Build类中定义了一系列的public static final的常量,和两个静态内部类(VERSION和VERSION_CODES),两个静态类中又分别包含了一些其他的public static final的常量。所有Build类中定义的常量列举如下(字段含义仅供参考)。这些常量中Build.TIME是long类型,Build.VERSION_SDK_INT是int类型,其他都是String类型。字段 | 含义 | 示例 | 用法 |
---|---|---|---|
Build.BRAND | 产品品牌 | Meizu | 通过这个字段可以获取到对用户有意义的手机厂商名称,例如Xiaomi,Meizu,Huawei等。 |
Build.MANUFACTURER | 产品制造商 | Meizu | 多数品牌会把这个字段的值设置成和Build.BRAND值是一样的(华为这个字段和Build.BRAND有大小写上的差异)。也许Google最初是想把这个字段留给生产手机的代工厂,比如富士康、伟创力之类的,不过显然手机厂商显然都不希望这样使用,把这个字段都填成了自己。 |
Build.PRODUCT | 产品型号,产品全称 | meizu_mx3 | 通过产品型号可以区分不同品牌,也可以区分同一个品牌下不同的产品。 |
Build.BOARD | 主板型号 | meizu_mx3 | 虽然含义上是主板型号,不过有些厂商把这个字段填成了产品型号,或者填一个笼统的型号,显然并不希望被别人获取到这个信息 |
Build.BOOTLOADER | bootloader版本号 | unknown | 大多数设备上都获取不到 |
Build.CPU_ABI | CPU ABI | armeabi-v7a | |
Build.CPU_ABI2 | CPU第二ABI | armeabi | |
Build.DEVICE | 设备型号 | mx3 | |
Build.DISPLAY | 设备的显示信息 | Flyme OS 4.1.3.5A | |
Build.FINGERPRINT | 设备指纹 | Meizu/meizu_mx3/mx3:4.4.4 /KTU84P/m35x.Flyme_OS_4.1.3 .5.20150111061013: user/release-keys | |
Build.HARDWARE | mx3 | ||
Build.HOST | mz-builder-5 | ||
Build.ID | KTU84P | ||
Build.MODEL | M351 | ||
Build.RADIO | unknown | ||
Build.SERIAL | 设备序列号 | 351RBJPYUTSO | |
Build.TAGS | release-keys | ||
Build.TIME | 系统build时间 | ||
Build.TYPE | user | ||
Build.UNKNOWN | unknown | ||
Build.USER | flyme | ||
Build.VERSION.CODENAME | REL | ||
Build.VERSION.INCREMENTAL | m35x.Flyme_OS_4.1.3.5 .20150111061013 | ||
Build.VERSION.RELEASE | Android release版本 | 4.4.4 | |
Build.VERSION.SDK | Android API版本(String类型) | 19 | |
Build.VERSION.SDK_INT | Android API版本(int类型) | 19 |
Build类获取系统信息流程
Build类中除Build. UNKNOWN(这个常量是直接返回”unknown”)之外的每个常量都是通过private static String getString(String property);这个内部静态方法来获取的。在getString()方法中调用了Systemproperties类的public static String get(String key);方法来获取这些值。Systemproperties类是android.os中标记为@hide的一个类,无法直接访问(但可以通过反射方式访问)。在Systemproperties类调用了private static native String native_get(String key);这个native方法。此native方法的代码 在Android源码的“frameworks/base/core/jni/android_os_SystemProperties.cpp”文件中。Systemproperties类代码代码如下。[code]public class SystemProperties { public static final int PROP_NAME_MAX = 31; public static final int PROP_VALUE_MAX = 91; private static native String native_get(String key); private static native String native_get(String key, String def); private static native int native_get_int(String key, int def); private static native long native_get_long(String key, long def); private static native boolean native_get_boolean(String key, boolean def); private static native void native_set(String key, String def); public static String get(String key) { if (key.length() > PROP_NAME_MAX) { throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX); } return native_get(key); } public static String get(String key, String def) { if (key.length() > PROP_NAME_MAX) { throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX); } return native_get(key, def); }
android_os_SystemProperties.cpp代码如下。
[code]<!-- lang: cpp --> #include "cutils/properties.h" #include "jni.h" #include "android_runtime/AndroidRuntime.h" #include <nativehelper/JNIHelp.h> namespace android { static jstring SystemProperties_getSS(JNIEnv *env, jobject clazz, jstring keyJ, jstring defJ) { int len; const char* key; char buf[PROPERTY_VALUE_MAX]; jstring rvJ = NULL; if (keyJ == NULL) { jniThrowNullPointerException(env, "key must not be null."); goto error; } key = env->GetStringUTFChars(keyJ, NULL); len = property_get(key, buf, ""); if ((len <= 0) && (defJ != NULL)) { rvJ = defJ; } else if (len >= 0) { rvJ = env->NewStringUTF(buf); } else { rvJ = env->NewStringUTF(""); } env->ReleaseStringUTFChars(keyJ, key); error: return rvJ; } static jstring SystemProperties_getS(JNIEnv *env, jobject clazz, jstring keyJ) { return SystemProperties_getSS(env, clazz, keyJ, NULL); } static JNINativeMethod method_table[] = { { "native_get", "(Ljava/lang/String;)Ljava/lang/String;", (void*) SystemProperties_getS }, { "native_get", "(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;", (void*) SystemProperties_getSS }, { "native_get_int", "(Ljava/lang/String;I)I", (void*) SystemProperties_get_int }, { "native_get_long", "(Ljava/lang/String;J)J", (void*) SystemProperties_get_long }, { "native_get_boolean", "(Ljava/lang/String;Z)Z", (void*) SystemProperties_get_boolean }, { "native_set", "(Ljava/lang/String;Ljava/lang/String;)V", (void*) SystemProperties_set }, }; int register_android_os_SystemProperties(JNIEnv *env) { return AndroidRuntime::registerNativeMethods( env, "android/os/SystemProperties", method_table, NELEM(method_table)); } };
可以看到SystemProperties_getSS中调用了property_get(),property_get()是libcutils提供的一个api,property_get()又调用了libc中的 __system_property_get()函数来访问系统共享内存中的数据。
Build类获取到的系统信息来源
在Android系统启动时,“init”守护进程(源代码位于:device/system/init)将启动一个属性服务并分配一段共享内存来存储各项属性。属性服务启动后调用libc中的__system_property_init()函数。__system_property_init()函数将依次读取。/default.prop; /system/build.prop; /system/default.prop; /data/local.prop四个文件,将四个文件中配置的各项属性读入到共享内存中。Build类中的常量大都来源于几个配置文件。/system/build.prop是其中最重要的一个配置文件,大多数Build中的常量都是从这个配置文件中获取到的。/system/build.prop文件是Android系统在编译时由MakeFile生成,MakeFile中会调用Makefile中调用build/tools/buildinfo.sh脚本,将相关配置写入到build.prop文件中。
build.prop文件修改
从Build类获取到的系统信息来源可以看到,大多数Build中的常量都是从/system/build.prop文件中获取到的。因此,修改这个配置文件可以达到修改Build中某些常量值的目的。/system/build.prop文件默认权限为644,修改此文件需要root权限。可以在root后的手机上通过RE文件管理器来修改。
由于build.prop只在开机时读取,修改完成后配置并不会立刻生效,只有重启系统才会生效。修改完build.prop,在重启系统之前一定要将文件权限还原为644,否则在Android4.1以后的系统将无法启动。这是因为在android4.1以后在system\core\init\util.c的read_file()函数中增加如下一段安全检测代码。
[code]if ((sb.st_mode & (S_IWGRP | S_IWOTH)) != 0) { ERROR("skipping insecure file '%s'\n", fn); goto oops; }
如果文件权限检测不通过开机时就会一直停留在启动界面,无法进入系统。这时只能通过刷机,或在有adb的recovery模式下通过adb shell来修改文件权限。
Build.SERIAL
Build.SERIAL是设备的序列号,此属性是通过读取系统“ro.serialno”属性获取的,但“ro.serialno”属性并不存在于任何属性文件中。而是在系统启动时由bootloader通过cmdline传入的。参考:
/article/1697842.html
https://android.googlesource.com/platform/build/+/986567d/tools/buildinfo.sh
相关文章推荐
- Android系统信息获取-Build
- (转)Android Build类获取系统信息
- Android开发之系统信息——获取Android手机中SD卡内存信息
- Android JNI 练手实例(获取系统信息,附源码)
- Android开发之系统信息——获取Android手机中SD卡内存信息
- Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)
- Android获取系统已安装应用软件程序(apk)信息
- Android开发之系统信息——获取Android手机中SD卡内存信息
- Android:系统信息(内存、cpu、sd卡、电量、版本)的获取
- Android 系统信息(内存、cpu、sd卡、电量、版本)获取
- Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)
- android系统信息(内存、cpu、sd卡、电量、版本)获取
- android系统中获取imei号和其他手机信息
- Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)
- Android 获取系统或SDCARD剩余空间信息
- Android 获取系统或SDCARD剩余空间信息
- Android 获取系统或SDCARD剩余空间信息
- android系统信息(内存,cpu,sd卡,电量,版本)的获取
- android系统信息(内存、cpu、sd卡、电量、版本)获取
- Android中获取系统内存信息以及进程信息-----ActivityManager的使用(一)