Files:android_2.3/bionic/libc/include/sys/_system_properties.handroid_2.3/system/core/init/init.candroid_2.3/system/core/init/property_service.candroid_2.3/system/core/libcutils/properties.c
-------init.c
int main(int argc, char **argv){...    struct pollfd ufds[4];....../************ int property workspace and start property service *****************/    queue_builtin_action(property_init_action, "property_init");...    queue_builtin_action(set_init_properties_action, "set_init_properties");...    queue_builtin_action(property_service_init_action, "property_service_init");...    for(;;) {        int nr, i, timeout = -1;        execute_one_command();        restart_processes();//prepare to poll property socket fd        if (!property_set_fd_init && get_property_set_fd() > 0) {            ufds[fd_count].fd = get_property_set_fd();            ufds[fd_count].events = POLLIN;            ufds[fd_count].revents = 0;            fd_count++;            property_set_fd_init = 1;        } ....        nr = poll(ufds, fd_count, timeout);        if (nr <= 0)            continue;        for (i = 0; i < fd_count; i++) {            if (ufds[i].revents == POLLIN) {                if (ufds[i].fd == get_property_set_fd())//dispose property event.                    handle_property_set_fd();                else if (ufds[i].fd == get_keychord_fd())                    handle_keychord();                else if (ufds[i].fd == get_signal_fd())                    handle_signal();            }        }    }}/********** init property workspace **********//static int property_init_action(int nargs, char **args){    INFO("property init\n");    property_init();    return 0;}/***************** start property service*******************/static int property_service_init_action(int nargs, char **args){    /* read any property files on system or data and     * fire up the property service.  This must happen     * after the ro.foo properties are set above so     * that /data/local.prop cannot interfere with them.     */    start_property_service();    return 0;}
------ property_service.c
void property_init(void){    init_property_area();    load_properties_from_file(PROP_PATH_RAMDISK_DEFAULT);}static int init_property_area(void){    prop_area *pa;    if(pa_info_array)        return -1;    if(init_workspace(&pa_workspace, PA_SIZE))        return -1;    fcntl(pa_workspace.fd, F_SETFD, FD_CLOEXEC);    pa_info_array = (void*) (((char*) pa_workspace.data) + PA_INFO_START);    pa = pa_workspace.data;    memset(pa, 0, PA_SIZE);    pa->magic = PROP_AREA_MAGIC;    pa->version = PROP_AREA_VERSION;        /* plug into the lib property services */    __system_property_area__ = pa;    property_area_inited = 1;    return 0;}// create unix socket and listenvoid start_property_service(void){    int fd;    load_properties_from_file(PROP_PATH_SYSTEM_BUILD);    load_properties_from_file(PROP_PATH_SYSTEM_DEFAULT);    load_properties_from_file(PROP_PATH_LOCAL_OVERRIDE);    /* Read persistent properties after all default values have been loaded. */    load_persistent_properties();    fd = create_socket(PROP_SERVICE_NAME, SOCK_STREAM, 0666, 0, 0);    if(fd < 0) return;    fcntl(fd, F_SETFD, FD_CLOEXEC);    fcntl(fd, F_SETFL, O_NONBLOCK);    listen(fd, 8);    property_set_fd = fd;}void handle_property_set_fd(){    prop_msg msg;    int s;    int r;    int res;    struct ucred cr;    struct sockaddr_un addr;    socklen_t addr_size = sizeof(addr);    socklen_t cr_size = sizeof(cr);    if ((s = accept(property_set_fd, (struct sockaddr *) &addr, &addr_size)) < 0) {        return;    }    /* Check socket options here */    if (getsockopt(s, SOL_SOCKET, SO_PEERCRED, &cr, &cr_size) < 0) {        close(s);        ERROR("Unable to recieve socket options\n");        return;    }    r = recv(s, &msg, sizeof(msg), 0);    close(s);    if(r != sizeof(prop_msg)) {        ERROR("sys_prop: mis-match msg size recieved: %d expected: %d\n",              r, sizeof(prop_msg));        return;    }    switch(msg.cmd) {    case PROP_MSG_SETPROP:        msg.name[PROP_NAME_MAX-1] = 0;        msg.value[PROP_VALUE_MAX-1] = 0;        if(memcmp(msg.name,"ctl.",4) == 0) {            if (check_control_perms(msg.value, cr.uid, cr.gid)) {                handle_control_message((char*) msg.name + 4, (char*) msg.value);            } else {                ERROR("sys_prop: Unable to %s service ctl [%s] uid: %d pid:%d\n",                        msg.name + 4, msg.value, cr.uid, cr.pid);            }        } else {            if (check_perms(msg.name, cr.uid, cr.gid)) {                property_set((char*) msg.name, (char*) msg.value);            } else {                ERROR("sys_prop: permission denied uid:%d  name:%s\n",                      cr.uid, msg.name);            }        }        break;    default:        break;    }}
//do property setint property_set(const char *name, const char *value){printf("simba property_service property_set: %s value: %s\n", name, value);    prop_area *pa;    prop_info *pi;    int namelen = strlen(name);    int valuelen = strlen(value);    if(namelen >= PROP_NAME_MAX) return -1;    if(valuelen >= PROP_VALUE_MAX) return -1;    if(namelen < 1) return -1;    pi = (prop_info*) __system_property_find(name);    if(pi != 0) {        /* ro.* properties may NEVER be modified once set */        if(!strncmp(name, "ro.", 3)) return -1;        pa = __system_property_area__;        update_prop_info(pi, value, valuelen);        pa->serial++;        __futex_wake(&pa->serial, INT32_MAX);    } else {        pa = __system_property_area__;        if(pa->count == PA_COUNT_MAX) return -1;        pi = pa_info_array + pa->count;        pi->serial = (valuelen << 24);        memcpy(pi->name, name, namelen + 1);        memcpy(pi->value, value, valuelen + 1);        pa->toc[pa->count] =            (namelen << 24) | (((unsigned) pi) - ((unsigned) pa));        pa->count++;        pa->serial++;        __futex_wake(&pa->serial, INT32_MAX);    }    /* If name starts with "net." treat as a DNS property. */    if (strncmp("net.", name, strlen("net.")) == 0)  {        if (strcmp("net.change", name) == 0) {            return 0;        }       /*        * The 'net.change' property is a special property used track when any        * 'net.*' property name is updated. It is _ONLY_ updated here. Its value        * contains the last updated 'net.*' property.        */        property_set("net.change", name);    } else if (persistent_properties_loaded &&            strncmp("persist.", name, strlen("persist.")) == 0) {        /*         * Don't write properties to disk until after we have read all default properties         * to prevent them from being overwritten by default values.         */        write_persistent_property(name, value);    }    property_changed(name, value);    return 0;}


-------android_2.3/system/core/libcutils/properties.c

static int send_prop_msg(prop_msg *msg){LOGD("simba properties.c send send_prop_msg ");    int s;    int r;        s = socket_local_client(PROP_SERVICE_NAME,                             ANDROID_SOCKET_NAMESPACE_RESERVED,                            SOCK_STREAM);    if(s < 0) return -1;        while((r = send(s, msg, sizeof(prop_msg), 0)) < 0) {        if((errno == EINTR) || (errno == EAGAIN)) continue;        break;    }    if(r == sizeof(prop_msg)) {        r = 0;    } else {        r = -1;    }    close(s);    return r;}int property_set(const char *key, const char *value){LOGD("simba properties.c property_set key %s ", key);prop_msg msg;    unsigned resp;    if(key == 0) return -1;    if(value == 0) value = "";        if(strlen(key) >= PROP_NAME_MAX) return -1;    if(strlen(value) >= PROP_VALUE_MAX) return -1;        msg.cmd = PROP_MSG_SETPROP;    strcpy((char*) msg.name, key);    strcpy((char*) msg.value, value);    return send_prop_msg(&msg);}


ref :Android的属性系统


更多相关文章

  1. Android判断网络是否可用,调用系统网络设置
  2. 非常不错的资金管理系统android版客户端源码
  3. PHP如何检测手机是什么系统?
  4. 调用android系统自带的功能
  5. Android 监听系统虚拟导航栏按键
  6. android系统关机重启

随机推荐

  1. 关于android服务器推送解决方案的学习
  2. 必应为Android和iOS平台的新版必应应用
  3. Android(安卓)Studio3.0开发JNI流程-----
  4. Android利用LocalSocket实现Java端进程与
  5. android使用adb向AS自带虚拟机里安装apk
  6. 针对 android端模拟教务系统登陆,主要针对
  7. Android(安卓)tv 动画效果faq (放大动画
  8. 实现android上传多张图片和文字给php后台
  9. 用Qt制作的Android独立游戏《吃药了》发
  10. Android(安卓)RadioGroup单选框变成多选