Android系统属性-Settings.system和SystemProperties
Java代码--应用层
方法:SystemProperties.get 或者 SystemProperties.set
如果属性名称以“ro.”开头,那么这个属性被视为只读属性。一旦设置,属性值不能改变。
如果属性名称以“persist.”开头,当设置这个属性时,其值也将写入/data/property。
这个系统属性全局都能用,包括jni和底层的C。
在c++中就是对应JAVA的两个函数就是property_set, property_get,其实JAVA是通过JNI调用这两个函数的。
java:
import android.os.SystemProperties;
SystemProperties.set("persist.sys.language", "en");
String lang= SystemProperties.get("persist.sys.language");
//获取方法:
String wwt = SystemProperties.getString("persist.sys.wwt", "1");
//设置方法:
SystemProperties.set("persist.sys.wwt", "0");
C:
#include <cutils/properties.h>
property_set("persist.sys.language.no", "1");
char wwt[PROPERTY_VALUE_MAX];
property_get("persist.sys.language.no", wwt, "0");
int i = atoi(wwt);
在adb shell可以通过以下的命名读取和修改
#getprop persist.sys.language.no
#setprop persist.sys.language.no 0
//ro.telephony.default_network 是ro属性的值,可以被修改,是因为它被过滤了.
// 其它想修改的 ,可以参考它
/system/core/init/property_service.cpp
static uint32_t PropertySet(const std::string& name, const std::string& value, std::string* error) {
size_t valuelen = value.size();
if (!IsLegalPropertyName(name)) {
*error = "Illegal property name";
return PROP_ERROR_INVALID_NAME;
}
if (auto result = IsLegalPropertyValue(name, value); !result.ok()) {
*error = result.error().message();
return PROP_ERROR_INVALID_VALUE;
}
prop_info* pi = (prop_info*) __system_property_find(name.c_str());
if (pi != nullptr) {
// ro.* properties are actually "write-once".
if (StartsWith(name, "ro.")) {
//例如这里排除了ro.telephony.default_network
if(!StartsWith(name, "ro.telephony.default_network")){
*error = "Read-only property was already set";
return PROP_ERROR_READ_ONLY_PROPERTY;
}
}
__system_property_update(pi, value.c_str(), valuelen);
} else {
int rc = __system_property_add(name.c_str(), name.size(), value.c_str(), valuelen);
if (rc < 0) {
*error = "__system_property_add failed";
return PROP_ERROR_SET_FAILED;
}
}
// Don't write properties to disk until after we have read all default
// properties to prevent them from being overwritten by default values.
if ((persistent_properties_loaded && StartsWith(name, "persist.")) || (StartsWith(name, "ro.telephony.default_network"))) {
WritePersistentProperty(name, value);
}
// If init hasn't started its main loop, then it won't be handling property changed messages
// anyway, so there's no need to try to send them.
auto lock = std::lock_guard{accept_messages_lock};
if (accept_messages) {
PropertyChanged(name, value);
}
return PROP_SUCCESS;
}
分类:
Android
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!