• 从Android源码看属性系统:init.c开始追溯

    Android 属性系统
    服务器君一共花费 22.471 ms 进行了 2 次数据库查询,努力地为您提供了这个页面。
    广告很萌的

    Android 属性系统通过系统服务提供系统配置和状态的管理。为了让运行中的所有进程共享系统运行时所需要的各种设置值,系统会开辟一个属性存储区域,并提供访问该内存区域的 API。所有进程都可以访问属性值,但是只有 init 进程可以修改属性值,其他进程若想修改属性值,需要向 init 进程发出请求,最终由 init 进程负责修改属性值。

    Android 属性系统的初始化

    init 进程(源码位于/system/init/init.c)主要完成:

    1. 解析 init.rc 文件并执行相应动作和服务;
    2. 生成设备驱动节点;
    3. 处理子进程终止;
    4. 提供属性服务。

    分析 Android 属性系统,这里只关注属性服务。在 init.c 的 main 函数中调用 queue_builtin_action()将 property_init_action 函数放入特定的列表中,如下:

    int main(int argc, char **argv)
    {
    	……
    
        INFO("property init\n");
        property_load_boot_defaults();
    
        init_parse_config_file("/init.rc");
    
        action_for_each_trigger("early-init", action_add_queue_tail);
    
        queue_builtin_action(wait_for_coldboot_done_action, "wait_for_coldboot_done");
        queue_builtin_action(mix_hwrng_into_linux_rng_action, "mix_hwrng_into_linux_rng");
        queue_builtin_action(keychord_init_action, "keychord_init");
        queue_builtin_action(console_init_action, "console_init");
    
    	……
    }
    

    queue_builtin_action 函数定义在 init_parser.c 中(/system/init/init_parser.c),如下:

    void queue_builtin_action(int (*func)(int nargs, char **args), const char *name)
    {
        action* act = (action*) calloc(1, sizeof(*act));
        trigger* cur_trigger = (trigger*) calloc(1, sizeof(*cur_trigger));
        cur_trigger->name = name;
        list_init(&act->triggers);
        list_add_tail(&act->triggers, &cur_trigger->nlist);
        list_init(&act->commands);
        list_init(&act->qlist);
    
        command* cmd = (command*) calloc(1, sizeof(*cmd));
        cmd->func = func;
        cmd->args[0] = const_cast<char*>(name);
        cmd->nargs = 1;
        list_add_tail(&act->commands, &cmd->clist);
    
        list_add_tail(&action_list, &act->alist);
        action_add_queue_tail(act);
    }
    
    

    上述代码涉及到两个结构体 action 和 command。这两个结构体都定义在 init.h 头文件中(/system/init/init.h)中。

    struct command
    {
    	/* list of commands in an action */
        struct listnode clist;
    
        int (*func)(int nargs, char **args);
    
        int line;
        const char *filename;
    
        int nargs;
        char *args[1];
    };
    
    struct trigger {
        struct listnode nlist;
        const char *name;
    };
    
    struct action {
    	/* node in list of all actions */
        struct listnode alist;
    	/* node in the queue of pending actions */
        struct listnode qlist;
    	/* node in list of actions for a trigger */
        struct listnode tlist;
    
        unsigned hash;
    
    	/* list of actions which triggers the commands*/
        struct listnode triggers;
        struct listnode commands;
        struct command *current;
    };
    

    command 结构体中的 func 指向一个函数 ,该函数在后续 init 进程调用 execute_one_command 时会被调用。

    两个结构体中都包含 listnode 结构体,该结构体定义在 list.h 头文件中(/system/include/cutils/list.h),如下代码所示,结构体中包含指向 listnode 的 next 和 prev。

    struct listnode
    {
        struct listnode *next;
        struct listnode *prev;
    };
    

    指针,因此由 listnode 可以构成一个双向链表。

更多 推荐条目

Welcome to NowaMagic Academy!

现代魔法 推荐于 2013-02-27 10:23   

本章最新发布
随机专题
  1. [PHP程序设计] PHP与函数式编程 1 个条目
  2. [Python程序设计] Django模板系统 11 个条目
  3. [Python程序设计] Tornado 服务器环境配置 3 个条目
  4. [智力开发与知识管理] 整体性学习步骤 9 个条目
  5. [PHP程序设计] PHP数组的遍历 7 个条目
  6. [Python程序设计] 写几个简单的Tornado程序吧 5 个条目
  7. [移动开发] Android Studio的使用技巧 4 个条目
  8. [PHP程序设计] PHP数组探索 4 个条目
  9. [移动开发] 刷机与root相关 2 个条目
  10. [Python程序设计] urls.py设置技巧 8 个条目
  11. [移动开发] Android属性系统Property 9 个条目
  12. [移动开发] 使用support-v7 ActionBar前的那些坑 3 个条目
窗口 -- [博客]