初识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";
}
相关推荐
2501_9159090620 分钟前
手机崩溃日志导出的工程化体系,从系统级诊断到应用行为分析的多工具协同方法
android·ios·智能手机·小程序·uni-app·iphone·webview
木风小助理29 分钟前
MySQL内存监控深度解析与故障排查实践
android·adb
灰鲸广告联盟40 分钟前
APP广告变现定制化解决方案,助力收益提升与用户体验平衡
android·flutter·搜索引擎·ux
帅得不敢出门1 小时前
精简Android SDK(AOSP)的git项目提高git指令速度
android·java·开发语言·git·elasticsearch
2501_937189231 小时前
神马 9.0 2025 最新版源码系统:安全加固 + 二次开发友好
android·源码·开源软件·源代码管理·机顶盒
モンキー・D・小菜鸡儿2 小时前
Android 中 StateFlow 的使用
android·kotlin
二川bro2 小时前
字符串特性解析:Python不可变性引发的错误
android·开发语言·python
2501_937154932 小时前
酷秒神马 9.0 2025 版:微服务架构
android·源码·源代码管理·机顶盒
我又来搬代码了3 小时前
【Android】【Compose】Compose知识点复习(一)
android·前端·kotlin·android studio
fatiaozhang95273 小时前
九联UNP-SJA8-国科GK6323V100C-2+8G-安卓9.0-原厂强刷固件包-可救砖及开ADB教程
android·adb·电视盒子·刷机固件·机顶盒刷机·机顶盒刷机固件·九联unp-sja8