Build类常量列表

Build类中的常量列表
Build类可以用来获取Android系统的相关信息。Build类中定义了一系列的public static final的常量,和两个静态内部类(VERSION和VERSION_CODES),两个静态类中又分别包含了一些其他的public static final的常量。所有Build类中定义的常量列举如下(字段含义仅供参考)。这些常量中Build.TIME是long类型,Build.VERSION_SDK_INT是int类型,其他都是String类型。


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类代码代码如下。

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代码如下。

<!-- 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()函数中增加如下一段安全检测代码。

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传入的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值