初识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";
}
相关推荐
丘狸尾2 小时前
[cisco 模拟器] ftp服务器配置
android·运维·服务器
van叶~4 小时前
探索未来编程:仓颉语言的优雅设计与无限可能
android·java·数据库·仓颉
Crossoads8 小时前
【汇编语言】端口 —— 「从端口到时间:一文了解CMOS RAM与汇编指令的交汇」
android·java·汇编·深度学习·网络协议·机器学习·汇编语言
li_liuliu9 小时前
Android4.4 在系统中添加自己的System Service
android
C4rpeDime11 小时前
自建MD5解密平台-续
android
鲤籽鲲13 小时前
C# Random 随机数 全面解析
android·java·c#
m0_5485147716 小时前
2024.12.10——攻防世界Web_php_include
android·前端·php
凤邪摩羯17 小时前
Android-性能优化-03-启动优化-启动耗时
android
凤邪摩羯17 小时前
Android-性能优化-02-内存优化-LeakCanary原理解析
android
喀什酱豆腐17 小时前
Handle
android