承接上篇文章继续分析Java层SetProperty的过程,以及native层的处理。
这边用到的文件有:
frameworks/base/core/java/android/os/SystemProperties.java
frameworks/base/core/jni/android_os_SystemProperties.cpp
system/core/base/properties.cpp
bionic/libc/bionic/system_property_set.cpp
Java中我们常用的SystemProperties.set(key, value)来设置属性,由此调用的SystemProperties的set,是一个静态方法,所以引入了jar包后可以直接使用set方法。
/**
* Set the value for the given {@code key} to {@code val}.
*
* @throws IllegalArgumentException if the {@code val} exceeds 91 characters
* @hide
*/
@UnsupportedAppUsage
public static void set(@NonNull String key, @Nullable String val) {
if (val != null && !val.startsWith("ro.") && val.length() > PROP_VALUE_MAX) {
throw new IllegalArgumentException("value of system property '" + key
+ "' is longer than " + PROP_VALUE_MAX + " characters: " + val);
}
if (TRACK_KEY_ACCESS) onKeyAccess(key);
native_set(key, val);
}
从注释了解到是设置给到的key以及对应的value,可以理解成一个map键值对。Java层的处理也很简单,简单做了合规性检查后就调用了jni接口到native层。
jni对应的函数中首先封装了一个lambda表达式。然后分别对key和value对应的字符串做了格式转换,最后提取出为标准string,再调用android::base::SetProperty(key, val);
void SystemProperties_set(JNIEnv *env, jobject clazz, jstring keyJ,
jstring valJ)
{
auto handler = [&](const std::string& key, bool) {
std::string val;
if (valJ != nullptr) {