android的启动流程学习

第一部分:

1.启动一个app,从framework层中的init.rc进程方法开始,在这个方法里有一个参数pid,代表的是主线程还是子线程来的,1是主线程,通过这个来创建我们的孵化器Zygote

2.Zygote的作用主要分为两个方面:

   a:创建SystemServer: 1.ActivityManagerService 2.WindowManagerService  3.PowerManagerService 4.InputyManagerService

   b:孵化应用进程

3.Zygote是由init.rc这个方法创建的,创建好后,会调用ZygoteInit.java这个类,这个类中的Main中主要做了以下操作

 a:先预加载apk资源

   preloadClasses();
   preloadResources();
   preloadSharedLibraries();

   preloadTextResources();
  WebViewFactory.prepareWebViewInZygote();

b:判断startSystemServer这个boolean类,判断是否要启动SystemServer,这个Boolean主要是在main方法的这个里面获取

   

boolean startSystemServer = false;
String zygoteSocketName = "zygote";
String abiList = null;
boolean enableLazyPreload = false;
for (int i = 1; i < argv.length; i++) {
  if ("start-system-server".equals(argv[i])) {
     startSystemServer = true;
  } else if ("--enable-lazy-preload".equals(argv[i])) {
     enableLazyPreload = true;
  } else if (argv[i].startsWith(ABI_LIST_ARG)) {
     abiList = argv[i].substring(ABI_LIST_ARG.length());
  } else if (argv[i].startsWith(SOCKET_NAME_ARG)) {
     zygoteSocketName = argv[i].substring(SOCKET_NAME_ARG.length());
  } else {
     throw new RuntimeException("Unknown command line argument: " + argv[i]);
  }
}

 

 c:接下来这个方法中还进行了socket服务的创建,最后执行runSelectLoopMode进行线程阻塞,等待

4.创建好的SystemServer中做了那些操作呢

   


try {
   t.traceBegin("StartServices");
   startBootstrapServices(t);//引导服务
   startCoreServices(t);//核心服务
   startOtherServices(t);//其他一般服务
} catch (Throwable ex) {
   Slog.e("System", "******************************************");
   Slog.e("System", "************ Failure starting system services", ex);
   throw ex;
} finally {
   t.traceEnd(); // StartServices
}

   a: 启动引导服务,比如ActivityManagerService 2.WindowManagerService  3.PowerManagerService

   b:核心服务,比如电池状态管理等

   c:其他一般服务,比如:InputyManagerService

最后接下来就是启动桌面应用了.

第二部分Launcher启动过程

  Android的入口类其实是ActivityThread并不是Application

1.从源码可以观察到,其实Activity,service,bordercast,provider等都是有它来进行管理,并且loop和handler,以及application

 

一个activity的创建,从ActivityThread中的main方法开始,这里直接创建了loop.prepareMainLoop(),looper.loop()直接开始在主线程中进行轮训工作,并且通过attch(Application thread)方法想AMSZ中注册自己,同时传递ApplicationThread对象,以便实现

跨进程调度.

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值