Android Framework--启动流程

5 篇文章 0 订阅
5 篇文章 0 订阅

init进程

init进程是Android系统的第一个进程,是所以Android进程的祖先,主要完成两件事

  • 解析配置文件init.rc
  • 维护一个属性服务property.server
    init进程源码在system/core/init目录下,入口为init.cpp的main()函数,

init进程启动服务

init进程通过解析init.rc文件(遵守Android Init Language规范);获得需要启动的服务所在路径,启动服务所需要的参数,名称等,并将信息添加至一个链表中.
通过fork+execve创建一个新的进程并让服务运行于新进程.并将pid添加至链表对应位置.
main()函数中,还通过注册子进程退出信号监听来重启异常退出的服务,根据pid在链表中查询是哪个进程退出.杀死该进程所以子进程,并重启该进程.
init进程主要启动的服务

  1. ServiceManager
  2. zygote进程
  3. surfacefligner
  4. media

Zygote进程

Zygote是所有Java进程的祖先.源码在freamwork/base/cmds/app_process/app_main.cpp中,入口为main()函数;
zygote在启动时候传入的两个参数是--zygote--start-sytem-server;代表着此进程是启动zygote及启动sytemserver.将会进入AndroidRuntime的start()方法,进行初始化java虚拟机及注册jni函数等.之后执行
com.android.internal.os.ZygoteInit的java类中的main()方法.

//freamwork/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);
    	} 
    }
    ....
void AndroidRuntime::start(const char* className, const Vector<String8>& options, bool zygote){
	...
	//执行ZygoteInit main方法
	jmethodID startMeth = env->GetStaticMethodID(startClass, "main",
            "([Ljava/lang/String;)V");
     ...
    env->CallStaticVoidMethod(startClass, startMeth, strArray);
    ...
    }

ZygoteInit.java

ZygoteInitmain()方法中,通过registerZygoteSocket(socketName);注册socket;
通过preload() 预加载资源,(通过Class.forName(“xxx”)将常用类加载进来等)

	//package: com.android.internal.os.ZygoteInit
    public static void main(String argv[]) {
    try {
      boolean startSystemServer = false;
      
       if ("start-system-server".equals(argv[i])) {
           startSystemServer = true;
        }
      //创建socket链接  
      registerZygoteSocket(socketName);
      //预加载资源
       preload();
       //启动sytemserver
       if (startSystemServer) {
            startSystemServer(abiList, socketName);
        }
        //循环等待socket客户端发过来的请求
       runSelectLoop(abiList);
       //通过抛异常的方式去执行方法,目的为清空之前的栈,通常为子进程systemServer及app进程
        } catch (MethodAndArgsCaller caller) {
            caller.run();
            }
	}

通过捕获异常的方式执行子进程的方法调用,清空方法栈,让子线程以为程序入口为ZygoteInit main().(SystemServer进程为SystemServer.java 的main(),其他app进程为ActivityThread.java的main())

preload();预加载意义为当fork()新进程时,子进程会继承zygote的资源,子进程便省去了启动虚拟机,加载资源等操作,会延长开机启动时间

static void preload() {
		...
  		preloadClasses();
        preloadResources();
        preloadOpenGL();
        preloadSharedLibraries();
        preloadTextResources();
        ...

启动sytemService

在ZygoteInit.java的main()方法中,如果是Zygote启动,会传入参数,启动systemserver,

private static boolean startSystemServer(String abiList, String socketName)
            throws MethodAndArgsCaller, RuntimeException {
        int pid;
           pid = Zygote.forkSystemServer(
           parsedArgs.uid, parsedArgs.gid,
           parsedArgs.gids,
           parsedArgs.debugFlags,
           null,
           parsedArgs.permittedCapabilities,
           parsedArgs.effectiveCapabilities);
        if (pid == 0) {
            handleSystemServerProcess(parsedArgs);
        }
        return true;
    }

通过forkSystemServer 创建子进程,在子进程(systemserver)中执行handleSystemServerProcess(..)

private static void handleSystemServerProcess(
            ZygoteConnection.Arguments parsedArgs)
            throws ZygoteInit.MethodAndArgsCaller {
            
            RuntimeInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);
        }

    }
  public static final void zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
            throws ZygoteInit.MethodAndArgsCaller {
         //打开binder,启动线程池,
        nativeZygoteInit();
        //继续执行
        applicationInit(targetSdkVersion, argv, classLoader);
    }
   private static void applicationInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
            throws ZygoteInit.MethodAndArgsCaller {
            //继续
        invokeStaticMain(args.startClass, args.startArgs, classLoader);
    }
    private static void invokeStaticMain(String className, String[] argv, ClassLoader classLoader)
            throws ZygoteInit.MethodAndArgsCaller {
       //className="com.android.server.SystemServer"由ZygoteInit的startSystemServer()传递过来
         cl = Class.forName(className, true, classLoader);
         //抛出异常,交由ZygoteInit的main()方法执行,目的为清空之前的方法栈
        throw new ZygoteInit.MethodAndArgsCaller(m, argv);
    }

抛出需要执行的方法的异常,在ZygoteInit.java的main()中捕获,并通过反射调用SystemServer.java的main方法

SystemServer启动系统服务

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值