PropertyService(二)

本文深入探讨Java中的SystemProperties.set方法如何通过JNI调用到native层处理属性设置。详细介绍了Java层的合规性检查,native层的lambda表达式封装,以及通过PropertyServiceConnection和SocketWriter进行socket通信与init进程交互的机制。文章以一张UML图总结了 SetProperty的整体流程结构。
摘要由CSDN通过智能技术生成

承接上篇文章继续分析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) {
   
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值