精华内容
下载资源
问答
  • Android init进程

    2016-08-01 15:58:29
    Android系统在启动的过程中,kernel会启动第一个进程init,它是一个由内核启动的用户级进程,实现了内核空间到用户空间的转变。 一、Linux操作系统  整个linux操作系统可以分为三层次,从最底层到最上层依次是:...

      相关源码:

    /system/core/init/Init.h
    /system/core/init/Init.cpp
    /system/core/init/Init_parser.h
    /system/core/init/Init_parser.cpp
    /system/core/init/Signal_handler.h
    /system/core/init/Signal_handler.cpp

            Android系统在启动的过程中,kernel会启动第一个进程:init,它是一个由内核启动的用户级进程,实现了内核空间到用户空间的转变。

    一、Linux操作系统     

             整个linux操作系统可以分为三层次,从最底层到最上层依次是:硬件-->内核空间-->用户空间,如下图:


     PS:

    (1) 内核空间中存放的是内核代码和数据,而进程的用户空间中存放的是用户程序的代码和数据;

    (2)内核态与用户态:

            a、当一个任务(进程)执行系统调用而陷入内核代码中执行时,称进程处于内核运行态(内核态)。

                  当进程处于内核态时,执行的内核代码会使用当前进程的内核栈,每个进程都有自己的内核栈;

            b、当进程在执行用户自己的代码时,则称其处于用户运行态(用户态)。

                  当正在执行用户程序而突然被中断程序中断时,此时用户程序也可以象征性地称为处于进程的内核态。


    二、init 进程

          Android的init 进程(system/core/init/init.c)主要功能:

    1)、分析init.rc启动脚本文件(system/core/rootdir),根据文件内容执行相应的功能;

    2)、当一些关键进程死亡时,重启该进程;

    3)、提供Android系统的属性服务;

           在init中启动起来的服务按照init.rc中的先后顺序,大致有:

    (1)console: start a shell,code path: system/bin/sh,其源码中包含常用的shell命令,如ls,cd等。
    (2)adbd: start adb daemon,通常带有disabled的选项,表明需要按名字启动,code path:system/bin/adb。
    (3)servicemanager:这个服务管理着系统内所有binder services。code path: frameworks/base/cmds/servicemanager。
    (4)Vold: android 的udev,code path: system/vold。
    (5)Netd: start ntd daemon, code path: system/netd。
    (6)Debuggerd: start debug system, code path: system/core/debuggerd。
    (7)zygote: ['zaigəut]这是一个非常重要的服务,稍后详解。start Android Java Runtime and start systemserver。code path:frameworks/base/cmds/app_process。
    (8)media: add AudioFlinger,AudioPolicyService,MediaPlayerService and CameraService to servicemanager,
    (9)启动管理binder通讯的机制,依靠ProcessState 和IPCThreadState类来完成binder机制。Code path :frameworks/base/media/mediaserver。
    (10)bootanim: 开机动画和铃声,code path:frameworks/base/cmds/bootanimation。
    等等。





    展开全文
  • android init进程 init.rc

    2015-02-02 14:29:55
    Init进程android系统起来之后启动的第一个进程,代码入口在 system/core/init/init.c main() 函数。 关于init进程,请参考 Android Init进程分析:blog.csdn.net/justmantao/article/details/8751810?utm_source=...

    Init进程是android系统起来之后启动的第一个进程,代码入口在 system/core/init/init.c  main() 函数。

    关于init进程,请参考 Android Init进程分析http://blog.csdn.net/justmantao/article/details/8751810?utm_source=tuicool

    参考:Android启动过程深入解析:blog.jobbole.com/67931/



    Init进程会解析init.rc文件(system/core/rootdir/init.rc

    参考:Android init.rc脚本解析:http://blog.csdn.net/justmantao/article/details/8753862

    Android init.rc文件解析过程详解(一):http://blog.csdn.net/mk1111/article/details/16357327 init.rc文件结构介绍

    init.rc文件基本组成单位是section, section分为三种类型,分别由三个关键字(所谓关键字即每一行的第一列)来区分,这三个关键字是 on、service、import。

    1、on类型的section表示一系列命令的组合, 例如:

    on init
        export PATH /sbin:/system/sbin:/system/bin
        export ANDROID_ROOT /system
        export ANDROID_DATA /data
    这样一个section包含了三个export命令,命令的执行是以section为单位的,所以这三个命令是一起执行的,不会单独执行, 那什么时候执行呢? 这是由init.c的main()所决定的,main()里在某个时间会调用

    action_for_each_trigger("init", action_add_queue_tail);
    这就把 "on init" 开始的这样一个section里的所有命令加入到一个执行队列,在未来的某个时候会顺序执行队列里的命令,所以调用action_for_each_trigger() 的先后决定了命令执行的先后。

    2、service类型的section表示一个可执行程序,例如:

    service surfaceflinger /system/bin/surfaceflinger
        class main
        user system
        group graphics drmrpc
        onrestart restart zygote
    surfaceflinger 作为一个名字标识了这个service,
    /system/bin/surfaceflinger 表示可执行文件的位置,class、user、group、onrestart这些关键字所对应的行都被称为options,options是用来描述的service一些特点,不同的service有着不同的options。

    service类型的section标识了一个service(或者说可执行程序), 那这个service什么时候被执行呢?
    是在 class_start 这个命令被执行的时候,这个命令行总是存在于某个on类型的section中,
    "class_start core"这样一条命令被执行,就会启动类型为core的所有service。如:

    on boot
        ...
        class_start core
        class_start main
    所以可以看出android的启动过程主要就是on类型的section被执行的过程。
    3、import类型的section表示引入另外一个.rc文件,例如:

    import init.test.rc
    相当包含另外一些section, 在解析完init.rc文件后继续会调用init_parse_config_file来解析引入的.rc文件。

    展开全文
  • init进程是Linux启动之后,用户空间的第一个进程,进程号为1。 引入init进程 步骤如下 启动电源,加载引导程序BootLoader到ROM中 BootLoader把系统OS拉起来并运行 Linux内核启动,首先在系统文件中寻找init.rc文件...

    init进程是Linux启动之后,用户空间的第一个进程,进程号为1。

    引入init进程

    步骤如下

    1. 启动电源,加载引导程序BootLoader到RAM中
    2. BootLoader把系统OS拉起来并运行
    3. Linux内核启动,首先在系统文件中寻找init.rc文件,并启动init进程
    4. init进程启动,主要用来初始化、启动属性服务和Zygote进程

    init进程的入口

    来看下init进程的启动入口 system/core/init/init.cpp

    int main(int argc, char** argv) {
    	//...
    	//创建和挂在启动所需的文件目录
    	 mount("tmpfs", "/dev", "tmpfs", MS_NOSUID, "mode=0755");
         mkdir("/dev/pts", 0755);
         mkdir("/dev/socket", 0755);
         mount("devpts", "/dev/pts", "devpts", 0, NULL);
         #define MAKE_STR(x) __STRING(x)
         mount("proc", "/proc", "proc", 0, "hidepid=2,gid=" MAKE_STR(AID_READPROC));
         // Don't expose the raw commandline to unprivileged processes.
         chmod("/proc/cmdline", 0440);
         gid_t groups[] = { AID_READPROC };
         setgroups(arraysize(groups), groups);
         mount("sysfs", "/sys", "sysfs", 0, NULL);
         mount("selinuxfs", "/sys/fs/selinux", "selinuxfs", 0, NULL);
         mknod("/dev/kmsg", S_IFCHR | 0600, makedev(1, 11));
         mknod("/dev/random", S_IFCHR | 0666, makedev(1, 8));
         mknod("/dev/urandom", S_IFCHR | 0666, makedev(1, 9));
        //...
    	//对属性服务进行初始化
        property_init();
    	
    	//...
    	//用于设置子进程信号处理函数,如果子进程(Zygote进程)异常退出,
    	//init进程会调用该函数中设定的信号处理函数来进行处理
        signal_handler_init();
    	//...
    	//启动属性服务
        start_property_service();
    	//解析init.rc配置文件
        parser.ParseConfig(bootscript);
        //...
        return 0;
    }
    

    PS: 信号处理 -SIGCHID
    父进程 fork出 子进程,如果子进程挂了,那么父进程会收到SIGCHLD信号,这时候它会做一些处理,比如Zygote进程如果挂了,那么init进程会收到SIGCHLD信号,会去重启Zygote进程,从而防止init进程的子进程成为僵尸进程。

    解析init.rc

    再来看下init.rc的解析
    init.rc是一个配置文件,是android初始化语言(Android Init Language)编写的脚本。

        //...
    on init //设置出发前
        export ANDROID_ROOT /system 动作出发之后要执行的动作
        export ANDROID_DATA /data
        export EXTERNAL_STORAGE /sdcard
    

    需要注意的是,Android8.0对init.rc文件进行了拆分,每个服务对应一个rc文件,我们要分析的Zygote启动脚本则在init.zygoteXX.rc中定义

    来看下system/core/rootdir/init.zygote64.rc

    service zygote /system/bin/app_process64 -Xzygote /system/bin --zygote --start-system-server
    		/*分别对应: service的名字,执行程序路径,传递的参数*/
        class main //入口函数
        priority -20
        user root
        group root readproc reserved_disk
        socket zygote stream 660 root system
        onrestart write /sys/android_power/request_state wake
        onrestart write /sys/power/state on
        onrestart restart audioserver
        onrestart restart cameraserver
        onrestart restart media
        onrestart restart netd
        onrestart restart wificond
        writepid /dev/cpuset/foreground/tasks //service的修饰符,影响什么时候、如何启动Service
    

    解析Service类型语句

    init.rc中的Action类型语句和Service类型语句 (比如上面实例的配置) 都有相应的类来进行解析。
    Action类型语句采用ActionParser来进行解析,Service类型语句采用ServcieParser来进行解析。

    init启动Zygote

    再来看下如何启动Service,这里主要来看Zygote这个Service。

    通过system/core/init/service.cpp,最终会调用frameworks/base/cmds/app_process/app_main.cpp

    int main(int argc, char* const argv[])
    {
    	if (zygote) {
    	    runtime.start("com.android.internal.os.ZygoteInit", args, zygote); //启动Zygote进程
    	} 
    	//...
    }
    

    属性服务

    属性服务类似于Windows中注册表,采用键值对的形式来记录用户、软件的一些使用信息。
    即使系统或者软件重启,还是能够根据之前注册表中的记录,进行相应的初始化操作。

    之前init.cpp中,这两句就是来初始化服务配置并启动属性服务。

    property_init(); //初始化服务配置
    start_property_service() //启动属性服务
    

    init进程启动小结

    init进程启动主要做了以下三件事:

    1. 创建和挂载启动所需的文件目录
    2. 初始化和启动属性服务
    3. 解析init.rc配置文件并启动Zygote进程
    展开全文
  • Android init进程作为用户空间第一个进程,做了很多系统初始化工作,其核心分为两块:一是属性,二是init.rc。此外,在具体的项目过程中,常和init进程打交道,里面有不少技术细节值得我们研究清楚。 属性key-...

    Android init进程作为用户空间第一个进程,做了很多系统初始化工作,其核心分为两块:一是属性,二是init.rc。此外,在具体的项目过程中,常和init进程打交道,里面有不少技术细节值得我们研究清楚。

    • 属性key-value大小限制
    bionic/libc/include/sys/System_properties.h
    #define PROP_NAME_MAX   32
    #define PROP_VALUE_MAX  92

    key最大为32个字节,末位\0还要占一个字节,所以真正用于key的最大字串为31。即key = persist.system.donotallow.secsim(32Bytes) 时,会报错。
    同理value最大为91Bytes。

    • 属性前缀的作用
      通常,属性都带有前缀,如ro.config、persist.xxx等。
      对于ro前缀,只读属性,即第一次设置之后,以后都不能再改变。
        if(pi != 0) {
            /* ro.* properties may NEVER be modified once set */
            if(!strncmp(name, "ro.", 3)) return -1;

    persist前缀属性在初始加载属性时须注意,default属性未加载完成时,不能将其写入文件中,以免覆盖文件中的属性值。
    对于persist前缀,在设置属性的同时,还会将其写到/data/property/persist.xxx文件中,在系统重启时,将该属性值恢复到上机关机时的状态。那么什么时候加载的这些persist属性?

    on property:vold.decrypt=trigger_load_persist_props
        load_persist_props
    void load_persist_props(void)
    {
        load_override_properties();
        /* Read persistent properties after all default values have been loaded. */
        load_persistent_properties();
    }

    加载时机要控制好,一是在默认属性都加载完成后;二是等data分区挂载好之后,毕竟persist属性存储在data分区中。

    • tcp的buffer size和接收窗口大小在init中设置,在tcp调优过程中,可以在init.rc中进行修改。

    • 系统中的可执行路径(PATH)在init.environ.rc中设置

    on init
        export PATH /sbin:/vendor/bin:/system/sbin:/system/bin:/system/xbin
    • usb的各种functions通过属性sys.usb.config触发,在init.usb.rc中实现,所以控制usb function可以在framework层设置属性即可,没有必须在通过JNI到native层控制。
    # Used to disable USB when switching states
    on property:sys.usb.config=none
        stop adbd
        write /sys/class/android_usb/android0/enable 0
        write /sys/class/android_usb/android0/bDeviceClass 0
        setprop sys.usb.state ${sys.usb.config}
    
    # adb only USB configuration
    # This should only be used during device bringup
    # and as a fallback if the USB manager fails to set a standard configuration
    on property:sys.usb.config=adb
        write /sys/class/android_usb/android0/enable 0
        write /sys/class/android_usb/android0/idVendor 18d1
        write /sys/class/android_usb/android0/idProduct D002
        write /sys/class/android_usb/android0/functions ${sys.usb.config}
        write /sys/class/android_usb/android0/enable 1
        start adbd
        setprop sys.usb.state ${sys.usb.config}
    • ueventd进程被init进程唤起之后,去解析ueventd.rc,可以看到一些常见的设备,同时Android系统特有的设备ashmem、binder也在其中。这里会记录设备节点信息,而这些设备不一定会创建节点。
    on early-init
        start ueventd
    ueventd.rc
    /dev/null                 0666   root       root
    /dev/zero                 0666   root       root
    /dev/full                 0666   root       root
    /dev/ptmx                 0666   root       root
    /dev/tty                  0666   root       root
    /dev/random               0666   root       root
    /dev/urandom              0666   root       root
    # Make HW RNG readable by group system to let EntropyMixer read it.
    /dev/hw_random            0440   root       system
    /dev/ashmem               0666   root       root
    /dev/binder               0666   root       root
    • 各native deamon基本都在init进程启动。对于服务可以配置不同的参数,决定服务的启动情况:
      disable: 不自动启动
      oneshot: 只启动一次
    service vold /system/bin/vold
        class core
        socket vold stream 0660 root mount
        ioprio be 2
    
    service bootanim /system/bin/bootanimation
        class main
        user graphics
        group graphics
        disabled
        oneshot
    
    service media /system/bin/mediaserver
        class main
        user media
        group audio camera inet net_bt net_bt_admin net_bw_acct  mediadrm
        ioprio rt 4

    以media服务为例,init进程调用service_start:

    pid = fork();
        if (pid == 0) { // son
            if (properties_inited()) {
                get_property_workspace(&fd, &sz);
                sprintf(tmp, "%d,%d", dup(fd), sz);
                add_environment("ANDROID_PROPERTY_WORKSPACE", tmp);
            }
    
            for (ei = svc->envvars; ei; ei = ei->next)
                add_environment(ei->name, ei->value);
    
            for (si = svc->sockets; si; si = si->next) {
                int socket_type = (
                        !strcmp(si->type, "stream") ? SOCK_STREAM :
                            (!strcmp(si->type, "dgram") ? SOCK_DGRAM : SOCK_SEQPACKET));
                int s = create_socket(si->name, socket_type,
                                      si->perm, si->uid, si->gid, si->socketcon ?: scon);
                if (s >= 0) {
                    publish_socket(si->name, s);
                }
            }
    
            setsid();
            setpgid(0, getpid());
    
            execve(svc->args[0], (char**) arg_ptrs, (char**) ENV);
            }
            _exit(127);
        }

    init进程启动服务主要包括:
    1)把属性内存区域的文件描述符加入到环境变量ANDROID_PROPERTY_WORKSPACE中,因此启动的服务可以与属性进行通信。
    2)创建服务配置的unix socket套接字。
    3)设置会话id和进程组id
    4)执行指定的服务程序

    这样一个deamon就正常启动了。

    展开全文
  • Android init进程中鲜为人知的charger mode 模式 标签: androidsystemlinuxclass手机平台 2012-02-26 09:45 8683人阅读 评论(10) 收藏 举报  分类: Linux 内核 Kernel(13) Android(16)...
  • Android Init进程详解

    2015-04-03 15:56:11
    init进程 init是一个由内核启动的用户级进程 init是Linux系统中用户空间的第一个进程。由于Android是基于Linux内核的,所以init也是Android系统中用户空间的第一个进程。 adb shell ps中init的PID为1,PPID为0 ...
  • Android init进程启动

    万次阅读 2012-07-12 23:30:38
    一、Android Init.c执行流程Android中的内核启动后,kernel会启动第一个用户级别的进程init,它是一个由内核启动的用户级进程。内核自行启动(已经被载入内存,开始运行,并已初始化所有的设备驱动程序和数据结构...
  • Android Init进程源码分析

    千次阅读 2016-08-18 19:12:40
    Init 进程源码分析 基于Linux内核的android系统,在内核启动完成后将创建一个Init用户进程,实现了内核空间到用户空间的转变。在Android 启动过程介绍一文中介绍了...init进程首先启动启动android的服务大管家
  • Android init进程(长文)

    千次阅读 2017-03-31 15:44:11
    android init
  • Android init进程——属性服务

    千次阅读 2015-08-05 14:33:16
    目录目录 概述 属性服务 属性服务初始化 创建存储空间 __system_property_area_init init_workspace 客户端进程访问属性内存区域 ...由于Android是基于Linux内核的,所以init也是Android系统中用户空
  • Android init进程——解析配置文件

    千次阅读 2015-04-21 14:30:09
    目录目录 init解析配置文件 关键字定义 kw_is 解析 K_import K_on command执行 ...init解析配置文件在解析service服务是如何启动之前,让我们先来学习一下init进程是如何解析init.rc等配置文件的。init进程
  • Android init进程启动过程分析

    万次阅读 2013-03-16 13:58:49
    田海立@CSDN2013-3-16 本文分析Androidinit进程的执行过程,只是分析init进程启动的流水,具体细节在今后的各个专题中再分别详细分析。本文虽是后面各个专题的基础,读者初看可能理解不深,可以在阅读后面各个...
  • Android init进程分析

    千次阅读 2012-12-27 12:59:55
    <!-- @page {margin:0.79in} p ...Android中的内核启动后,kernel会启动第一个用户级别的进程init,它是一个由内核启动的用户级进程,它的进程号是1,它以一个守护进程的方式运行,主要提供
  • 1. init 进程是android 启动后由内核启动的第一用户级进程,init 进程是系统的守护进程,init进程有四个作用依次为:子进程终止处理,生成设备驱动节点,分析及运行init.rc 文件和init.*.rc 文件, 初始化属性服务。...
  • android init
  • android init进程分析 基本流程

    千次阅读 2015-07-07 11:02:10
    android设备上电,引导程序引导进入boot(通常是uboot),加载initramfs、kernel镜像,启动kernel后,进入用户态程序。第一个用户空间程序是init, PID固定是1.在android系统上,init的代码位于/...init进程的系统初始化
  • android init进程解析init.rc过程

    千次阅读 2013-09-09 09:47:08
    调试android设备驱动时经常需要修改init.rc和init.hardware.rc文件,init.rc经常修改,然而里面定义的trigger事件执行,谁先谁后一直没有特别在意,跟踪代码之后做个小结 文件路径:/system/core/init/*.*,里面有个...
  • android init进程分析 ueventd

    千次阅读 2015-07-07 11:04:53
    ueventd实际和init是同一个binary,只是走了不同分支,可参看前一部分。 ueventd的整体代码比较简单,主要是三部分:  解析ueventd.rc 初始化设备信息 循环polling uevent消息 主函数及相关功能如下如下: int ...
  • Android init进程——源码分析

    千次阅读 2014-11-07 14:50:21
    概述 Android本质上是一个基于Linux内核的操作系统,与Ubuntu类似
  • Init是内核 kernel 初始化完成后启动的第一个进程进程ID为1。 Init的源代码在system/core/init/目录。 参考: Ø androidinit过程分析 Ø Androidinit过程详解(一) Ø Androidinit过程(二);...
  • 1. 启动动画在执行init启动脚本中到surface flinger启动完成后,开始执行启动动画(bootanimation)之间。(启动动画在cupcake版本还只是surfaceflinger的一个线程,到donut上已经升级到和surface flinger一样的进程了)...
  • android init进程启动的大致流程

    千次阅读 2012-08-30 11:00:36
    参考Android源码的版本:4.0.4;init源码目录:system/core/init/;解析init脚本代码:init_parser.c;init脚本支持的关键字:keywords.h;...纵观init源码,会发现init进程在启动的时候,会执行init脚本和一些内置的a

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 38,305
精华内容 15,322
关键字:

androidinit进程