初识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";
}
相关推荐
sun0077008 小时前
android ndk编译valgrind
android
AI视觉网奇9 小时前
android studio 断点无效
android·ide·android studio
jiaxi的天空9 小时前
android studio gradle 访问不了
android·ide·android studio
No Silver Bullet10 小时前
android组包时会把从maven私服获取的包下载到本地吗
android
catchadmin10 小时前
PHP serialize 序列化完全指南
android·开发语言·php
tangweiguo0305198712 小时前
Kable使用指南:Android BLE开发的现代化解决方案
android·kotlin
00后程序员张14 小时前
iOS App 混淆与资源保护:iOS配置文件加密、ipa文件安全、代码与多媒体资源防护全流程指南
android·安全·ios·小程序·uni-app·cocoa·iphone
柳岸风16 小时前
Android Studio Meerkat | 2024.3.1 Gradle Tasks不展示
android·ide·android studio
编程乐学16 小时前
安卓原创--基于 Android 开发的菜单管理系统
android
whatever who cares18 小时前
android中ViewModel 和 onSaveInstanceState 的最佳使用方法
android