初识Android 属性

属性是存储在系统共享内存中的一个个key:value键值对,主要有以下作用:

  • 提供系统公共的信息
  • 进程间通讯
  • 作为rc文件的触发器,用于行为控制

提供系统公共属性

比如获取SDK版本,获取系统语言其实都是通过系统属性得到的

c 复制代码
ro.build.version.sdk=30
ro.product.locale=zh-CN

进程间通讯

比如bootanim进程和systemserver进程通过service.bootanim.exit属性通讯。bootanim进程需要通过检测改属性的值是否为1来退出开机动画,systemserver进程设置该属性来告知bootanim进程。

c 复制代码
service.bootanim.exit=1

行为控制

c 复制代码
on property:ro.debuggable=1
    # Give writes to anyone for the trace folder on debug builds.
    # The folder is used to store method traces.
    chmod 0773 /data/misc/trace
    # Give reads to anyone for the window trace folder on debug builds.
    chmod 0775 /data/misc/wmtrace

当ro.debuggable属性被设置成1时,执行下面的语句。

属性在哪里

系统中默认存在很多属性,可以通过adb命令"getprop" 查看。那这些默认的属性是从哪里来的呢?

这些默认的属性是通过init进程加载prop文件得到的,查看PropertyLoadBootDefaults方法

c 复制代码
void PropertyLoadBootDefaults() {
    // TODO(b/117892318): merge prop.default and build.prop files into one
    // We read the properties and their values into a map, in order to always allow properties
    // loaded in the later property files to override the properties in loaded in the earlier
    // property files, regardless of if they are "ro." properties or not.
    std::map<std::string, std::string> properties;
    if (!load_properties_from_file("/system/etc/prop.default", nullptr, &properties)) {
        // Try recovery path
        if (!load_properties_from_file("/prop.default", nullptr, &properties)) {
            // Try legacy path
            load_properties_from_file("/default.prop", nullptr, &properties);
        }
    }
    load_properties_from_file("/system/build.prop", nullptr, &properties);
    load_properties_from_file("/system_ext/build.prop", nullptr, &properties);
    load_properties_from_file("/vendor/default.prop", nullptr, &properties);
    load_properties_from_file("/vendor/build.prop", nullptr, &properties);
    if (SelinuxGetVendorAndroidVersion() >= __ANDROID_API_Q__) {
        load_properties_from_file("/odm/etc/build.prop", nullptr, &properties);
    } else {
        load_properties_from_file("/odm/default.prop", nullptr, &properties);
        load_properties_from_file("/odm/build.prop", nullptr, &properties);
    }
    load_properties_from_file("/product/build.prop", nullptr, &properties);
    load_properties_from_file("/factory/factory.prop", "ro.*", &properties);

   //省略

可以看出,依次加载以下文件

c 复制代码
/system/etc/prop.default
/system/build.prop
/system_ext/build.prop
/vendor/default.prop
/vendor/build.prop
/odm/etc/build.prop
/product/build.prop
/factory/factory.prop

设置和获取属性

当然,除了上面文件中默认的属性,我们也可以通过命令或者方法来设置属性
adb 命令

getprop获取属性

c 复制代码
console:/ # getprop
[apexd.status]: [ready]
[bpf.progs_loaded]: [1]
[build.version.extensions.r]: [0]

setprop 设置或者改变属性的值

c 复制代码
console:/ # setprop test.a 1

c中的函数

使用property_set和property_get来设置或者获取属性。这些函数是定义在libcutils库的properties.h中,使用时需要在Android.mk或者Android.bp中引入该库并添加头文件

c 复制代码
int property_get(const char* key, char* value, const char* default_value);
int property_set(const char *key, const char *value);

java中的方法

在java中,使用SystemProperties类中的set和get方法来设置和获取属性

c 复制代码
String test= SystemProperties.get("my.test.a");
SystemProperties.set("my.test.a", "0");

c++中的函数

在c++中,使用GetProperty和SetProperty来获取和设置属性,其在system\core\base\include\android-base\properties.h头文件中定义,实现在\system\core\base\properties.cpp文件中

c 复制代码
#include <android-base/properties.h>
std::string prop_val = android::base::GetProperty("sys.boot_completed", "");
if (!android::base::SetProperty("ctl.stop", "mpdecision")){
	LOG(ERROR) << "setprop ctl.start mpdecision failed";
}
相关推荐
阿巴斯甜17 小时前
Android 报错:Zip file '/Users/lyy/develop/repoAndroidLapp/l-app-android-ble/app/bu
android
Kapaseker17 小时前
实战 Compose 中的 IntrinsicSize
android·kotlin
xq952718 小时前
Andorid Google 登录接入文档
android
黄林晴19 小时前
告别 Modifier 地狱,Compose 样式系统要变天了
android·android jetpack
冬奇Lab1 天前
Android触摸事件分发、手势识别与输入优化实战
android·源码阅读
城东米粉儿1 天前
Android MediaPlayer 笔记
android
Jony_1 天前
Android 启动优化方案
android
阿巴斯甜1 天前
Android studio 报错:Cause: error=86, Bad CPU type in executable
android
张小潇1 天前
AOSP15 Input专题InputReader源码分析
android
_小马快跑_2 天前
Kotlin | 协程调度器选择:何时用CoroutineScope配置,何时用launch指定?
android