初识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";
}
相关推荐
Ya-Jun4 小时前
常用第三方库精讲:cached_network_image图片加载优化
android·flutter
_一条咸鱼_4 小时前
Android嵌套滑动详解
android·面试·android jetpack
zhishishe7 小时前
工具指南:免费将 PDF 转换为 Word 的 10 个工具
android·windows·pdf·word
孙同学_7 小时前
【MySQL】004.MySQL数据类型
android·数据库·mysql
流浪汉kylin9 小时前
Android 图片选择器改系统
android
前行的小黑炭10 小时前
Android 上下位机开发:串口是什么,为什么android版本都比较低?粘包半包的原因以及处理思路,缓冲区处理,以及超时清空缓冲区....
android
移动开发者1号10 小时前
你知道Android中配置resourcePrefix的作用吗?
android
tangweiguo0305198710 小时前
Android Compose 系统 Scope 的优化实践
android
我命由我1234510 小时前
Android Cordova 开发 - Cordova 快速入门(Cordova 环境配置、Cordova 第一个应用程序)
android·开发语言·前端框架·android studio·h5·安卓·android-studio
老板来根葱11 小时前
应用进程创建二三事
android·源码阅读