zoukankan      html  css  js  c++  java
  • android 属性系统代码分析

    Android为了储存关于全局系统设置的信息,使用了一个系统属性公共缓冲区,这个缓冲区的内容是(属性,值)对的列表,对外提供get和set服务。可以说,属性区域相当于一般应用的配置文件。
    属性系统首先得有个固定地址空间,在system/core/init/init.c里调用property_init()函数初始化。在system/core/init目录下有
    property_service.c和property_service.h两个文件予以这个属性系统的支持,属性系统使用的存储空间是通过android的内存管理

    系统ashmem 来分配的。其中system/core/init/init.c中用到的设置和获取的服务函数(property_set(),property_get())都是

    在system/core/initproperty_service.c实现的。至于这两个服务函数的具体有效范围还有待进一步的研究,因为在

    system/core/libcutils/properties.c 中在不同的情况下分别进行此两个接口的实现,暂时也没有研究其使用。

    init.c使用的property_get是个包装函数,其实现是调用__system_property_find()函数,这个函数在
    bionic/libc/bionic/system_properties.c中实现。

    并且在init.c中导入了一个很有用的环境变量:ANDROID_PROPERTY_WORKSPACE

    这个环境变量也十分特殊,其由文件描述符和大小组成。也正是因为这个环境变量所以在

    bionic/libc/bionic/system_properties.c 中才有可能通过__system_properties_init()[此函数被
    bionic/libc/bionic/libc_init_common.c的__libc_init_common()调用进行初始化]进行初始化libc中的属性系统地址,才可能正常的通过
    __system_property_find()获取属性值。
     
    __libc_init_common()被bionic/libc/bionic/libc_init_dynamic.c(或者libc_init_static.c)调用,且其被调用函数的说明如下:

     

    代码
    /* We flag the __libc_preinit function as a constructor to ensure
     * that its address is listed in libc.so's .init_array section.
     * This ensures that the function is called by the dynamic linker
     * as soon as the shared library is loaded.
     
    */
    void __attribute__((constructor)) __libc_prenit(void);

    void __libc_prenit(void)
    {
    ...
    __libc_init_common(elfdata);
    ...
    }


    getprop

    setprop

  • 相关阅读:
    vlc的应用之三:动态调用vlc-0.9.4的libvlc.dll【转】
    Linux 下搭建流媒体服务器
    linux bash Shell特殊变量:Shell $0, $#, $*, $@, $?, $$和命令行参数
    lftp mirror 上传目录
    rxvt-unicode配置
    在命令行上 使用 mutt, fetchmail, maildrop, msmtp 收发邮件
    在命令行上 Ubuntu 下使用 mutt 和 msmtp 发送 Gmail 邮件
    git查看各个branch之间的关系图
    在Ubuntu Server是配置iptables防火墙
    Ubuntu 14.04 配置iptables防火墙
  • 原文地址:https://www.cnblogs.com/leaven/p/1948143.html
Copyright © 2011-2022 走看看