相关文章推荐
拉风的猕猴桃  ·  You have JVM Property ...·  11 月前    · 
不要命的茶叶  ·  ESI-QE-Orbitrap-MS / ...·  1 年前    · 

1. 系统属性值类型及特点

①以“ ro. ”开头,具有只读属性。一旦设置,属性值不能再改变。

②以“ persist. ”开头。当设置这个属性值时,其值将写入 /data/property

③以“ net. ”开头。当设置这个属性值时,“ net.change ”属性将会自动设置,以加入到最后修改的属性名

④属性“ ctrl.start ”和“ ctrl.stop ”是用来启动和停止服务的。

2. 使用 adb 操作系统属性值

adb shell prop 可以查看安卓系统的系统属性

adb shell getprop 属性名                获取单个系统属性值

adb shell setprop 属性名 新的属性值             设置新的属性值(对于非只读属性)

3.build.prop 文件生成过程

build/core/Makefile 相关变量定义:

intermediate_system_build_prop := $(call intermediates-dir-for,ETC, system_build_prop)/build.prop
	   //  obj下的路径out/target/product/~/obj/ETC/system_build_prop_intermediates/build.prop
INSTALLED_BUILD_PROP_TARGET := $(TARGET_OUT)/build.prop 
                                      // system下的路径,即out/target/product/~/system/builg.prop
BUILDINFO_SH := build/tools/buildinfo.sh

build.prop 文件中的系统属性值主要包括三个部分— buildinfo.sh 文件中的值, systen.prop 文件中的值以及 ADDITIONAL_BUILD_PROPERTIES

相关 Makfile 中的 target:

(1) system/build.prop

$(INSTALLED_BUILD_PROP_TARGET): $(intermediate_system_build_prop)
$(INSTALLED_RECOVERYIMAGE_TARGET)
@echo "Target build info: $@"
$(hide) cat $(intermediate_system_build_prop) > $@
								// 将etc下build.prop中的值写入system下的build.prop文件中
ifdef INSTALLED_RECOVERYIMAGE_TARGET
$(hide) echo ro.expect.recovery_id=`cat $(RECOVERYIMAGE_ID_FILE)`
echo "# ADDITIONAL_BUILD_PROPERTIES" >> $@; \ echo "#" >> $@; ) $(hide) $(foreach line,$(ADDITIONAL_BUILD_PROPERTIES), \ echo "$(line)" >> $@;) $(hide) cat $(INSTALLED_ANDROID_INFO_TXT_TARGET) | grep 'require version-' | sed -e 's/require version-/ro.build.expect./g' >> $@ $(hide) build/tools/post_process_props.py $@ $(PRODUCTS.$(INTERNAL_PRODUCT).PRODUCT_SYSTEM_PROPERTY_BLACKLIST)

(3)build/tools/buildinfo.sh

buildinfo.sh 中主要是 echo 一些属性:

echo "ro.build.id=$BUILD_ID"
echo "ro.build.display.id=$BUILD_DISPLAY_ID"
echo "ro.build.version.incremental=$BUILD_NUMBER"
echo "ro.build.version.sdk=$PLATFORM_SDK_VERSION"
echo "ro.build.version.preview_sdk=$PLATFORM_PREVIEW_SDK_VERSION"
echo "ro.build.version.codename=$PLATFORM_VERSION_CODENAME"
echo "ro.build.version.all_codenames=$PLATFORM_VERSION_ALL_CODENAMES"
........
echo "ro.product.model=$PRODUCT_MODEL"
echo "ro.product.brand=$PRODUCT_BRAND"
echo "ro.product.name=$PRODUCT_NAME"
echo "ro.product.device=$TARGET_DEVICE"
echo "ro.product.board=$TARGET_BOOTLOADER_BOARD_NAME"

4. 系统属性值的使用

Java 文件中

获取系统属性值,例如:

String newBuildId = SystemProperties.get("ro.build.id", null);

修改系统属性值,例如:

private static final String PROPERTY_BOOT_SOUNDS = "persist.sys.bootanim.play_sound";
SystemProperties.set(PROPERTY_BOOT_SOUNDS, mBootSounds.isChecked() ? "1" : "0");

Native 代码

获取系统属性值,例如:

property_get("bluetooth.mock_stack", value, "");

设置系统属性值:

property_set("ctl.start", "surfaceflinger");
property_set("persist.sys.actionsafe.width", actionsafeWidth);

5. 系统属性值设置分析

开机导入的 cache 属性主要是通过 frameworks/base/core/java/android/os/SystemProperties.java 的接口定义

private static native void native_set(String key, String def);
    public static void set(String key, String val) {
        if (key.length() > PROP_NAME_MAX) {
            throw new IllegalArgumentException("key.length > " + PROP_NAME_MAX);
        if (val != null && val.length() > PROP_VALUE_MAX) {
            throw new IllegalArgumentException("val.length > " +
                PROP_VALUE_MAX);
        native_set(key, val);

native_set()实际操作通过JNI调用的是cpp文件对应的接口:

frameworks/base/core/jni/android_os_SystemProperties.cpp

static const JNINativeMethod method_table[] = {
"native_set", "(Ljava/lang/String;Ljava/lang/String;)V",
(void*) SystemProperties_set },
int register_android_os_SystemProperties(JNIEnv *env)
    return RegisterMethodsOrDie(env, "android/os/SystemProperties", method_table,
                                NELEM(method_table));
static void SystemProperties_set(JNIEnv *env, jobject clazz,
                                      jstring keyJ, jstring valJ)
    int err;
    const char* key;
    const char* val;
    if (keyJ == NULL) {
        jniThrowNullPointerException(env, "key must not be null.");
        return ;
    key = env->GetStringUTFChars(keyJ, NULL);
    if (valJ == NULL) {
        val = "";       /* NULL pointer not allowed here */
    } else {
        val = env->GetStringUTFChars(valJ, NULL);
    err = property_set(key, val);
    env->ReleaseStringUTFChars(keyJ, key);
    if (valJ != NULL) {
        env->ReleaseStringUTFChars(valJ, val);
    if (err < 0) {
        jniThrowException(env, "java/lang/RuntimeException",
                          "failed to set system property");

system/core/init/property_service.cpp

int property_set(const char* name, const char* value) {
    int rc = property_set_impl(name, value);
    if (rc == -1) {
        ERROR("property_set(\"%s\", \"%s\") failed\n", name, value);
    return rc;

设置keyvalue时,需要鉴定属性值的权限,Android5.0以后的系统中使用SELinux进行权限管理。

system/core/init/property_service.cpp

static int check_mac_perms(const char *name, char *sctx, struct ucred *cr)
{                          									      // 判断请求进程是否有权限修改属性值
    char *tctx = NULL;
    int result = 0;
    property_audit_data audit_data;
    audit_data.name = name;
    audit_data.cr = cr;
    if (selinux_check_access(sctx, tctx, "property_service", "set", reinterpret_cast<void*>(&audit_data)) == 0)
	              // 检查property_contexts中是否定义了目标sctx,将源sctx和目标tctx进行比较,判断是否具有相关权限,sctx是调用set操作进程的sContext
        result = 1;
    freecon(tctx);
    return result;

external/sepolicy/ property_contexts

##########################
# property service keys
net.rmnet0              u:object_r:radio_prop:s0
net.gprs                u:object_r:radio_prop:s0
net.ppp                 u:object_r:radio_prop:s0
		  								 // 表示只有有权限访问Type为radio_prop的资源的进程可以访问
gsm.                    u:object_r:radio_prop:s0
net.                    u:object_r:system_prop:s0
dev.                    u:object_r:system_prop:s0
										// 表示只有有权限访问Type为system_prop的资源的进程可以访问
Zygote是如何创建 Java世界的 frameworks\base\cmds\app_process\app_main.cpp int main(int argc, const char* const argv[]) Zygote进程由init通过fork而来,我们回顾一下init.rc中设置的启动参数: -Xzygote/system/bin --zygote --start-system-server // These are global variabl
manifest.xml:1: parser error : Document is empty [ 27% 2515/9266] target Package: SystemUI (out/target/product/rk3288/obj/APPS/SystemUI_intermediates/package.apk) warning: string 'notifications_off_text' has no default translation. 修改device/rockchip/comm.
usage: getprop [NAME [DEFAULT]] Gets an Android system property, or lists them all.(获取Android系统属性,或列出所有属性。) 基于一台乐视电视的设备执行: adb shell getprop ad...
androidN 需要删除 out/target/product/$(TARGET_PRODUCT)/obj/ETC/system_build_prop_intermediates/build.prop 再编变才能生效
根据 Android system.img编译过程(1),可知$(PRODUCT_OUT)/system.img是由$(systemimage_intermediates)/system.img拷贝过来的。 # 返回out/target/product/${project}obj/PACKAGING/systemimage_intermediates systemimage_intermedi...
Android 9.0 如何在编译出来system目录下面新增wq.prop文件 一、在如下目录下面创建一个脚本文件wqinfo.sh 代码路径:build/make/tools/wqinfo.sh #!/bin/bash echo "persist.sys.custom.test=123" 二、在Makefile文件中添加需要编译的脚本 代码路径:android/build/make/core/Makefile 1、写一个脚本,并且定义一个变量,把该脚本的路径赋给该变量 BUILDINFO_SH :=
安卓代码获取系统属性前言代码实现 大家可能知道,使用adb shell getprop命令可以直接获取系统属性,但有时候需要在JAVA代码中获取系统属性,接下来说一下如何实现。 在build.gradle的android下中添加如下代码,以找到android.os.SystemProperties类: String SDK_DIR = System.getenv("ANDROID_SDK_HOME") if(SDK_DIR == null) { Properties props
每个属性都有一个名称和,他们都是字符串格式。属性被大量使用在Android系统中,用来记录系统设置或进程之间的信息交换。属性是在整个系统中全局可见的。每个进程可以get/set属性属性服务在“init”守护进程中运行。每一个客户端想要设置属性时,必须连接属性服务...
通过反射使用 android.os.SystemProperties 这个类来读取对应系统属性。 因为这个类是隐藏的,应用层无法直接使用,所以这里需要通过反射来解决。 工具类代码 工具类对外提供取方法,内部取逻辑通过反射实现,这就是总体的思路。代码如下: package yanhua.tv.yinhe; import java.lang.reflect
关于system/build.prop文件作用以及修改方法~ 1、ro.product.locale.language=hdpi(或者有的机型是mdpildpi)ro.product.locale.region= 改成ro.product.locale.language=zh ro.product.locale.region=CN 这样开...
Android属性之build.prop生成过程   此部分网上这篇文章分析的不错: http://blog.csdn.net/thl789/article/details/7014300 转载过来        Android的build.prop文件是在Android编译时刻收集的各种property(LCD density/语言/编译时间, etc.),编译完成之后,文件生成在o...