以前知道AMS、PMS这些概念及其功能,开发的过程中也会用到,就是不知道其来源,好奇心害死猫,扒着扒着扒到系统开机启动这个知识层面上来了,好吧,那今天就说说这个吧! Android系统的启动,主要是指Android手机关机后,长按电源键后,Android手机开机的过程。从系统角度看,Android的启动程序可分为: 其中启动Android系统过程又有以下过程: android启动过程图示: 我们知道,Android系统是基于Linux内的。而在Linux系统中,所有的进程都是init进程的子孙进程,也就是说,所有的进程都是直接或者间接地由init进程fork出来的。 系统启动的时候执行系统启动脚本system/core/rootdir/init.rc文件,进而触发app_process程序(system/bin/app_process,它的源代码位于frameworks/base/cmds/app_process/app_main.cpp文件中,入口函数是main)创建Zygote进程,Zygote进程负责后续Android应用程序框架层的其它进程的创建和启动工作。 Zygote进程最大意义是作为一个Socket的Server端,接收着四面八方的进程创建请求。Android中所有的应用进程的创建都是通过Binder机制请求SystemServer进程,SystemServer进程发送socket消息给Zygote进程,统一由Zygote进程创建出来的。 SystemServer也是一个进程,而且是由zygote进程fork出来的。SystemServer主要用于开启系统重要的一些相关服务,例如:ActivityManagerService(AMS)、PackageManagerService(PMS)、WindowManagerService(WMS)等等,是不是都很熟悉呢?所以SystemServer和Zygote重要级别可以说是平分秋色了。 在zygote开启的时候,会调用ZygoteInit.main()进行初始化: 接下来看一下startSystemServer具体做了什么 这个方法主要是为了开启SystemServer,这里做了三件事: 上边也说了SystemServer主要用于开启系统重要的一些相关服务,例如:ActivityManagerService(AMS)、PackageManagerService(PMS)、WindowManagerService(WMS)等等,我们看一下代码具体的内部走法: SystemServer初始化过程中主要做了以下几个重大工作: 系统级上下文和我们常用的Context是有区别的,主要是用于服务端(系统级主题和其他服务相关的引导),Context到底是个什么玩意?我在前边的一篇文章中也有总结,这里在阐述一遍,Context英文原意是上下文的意思,在平时开发中涉及到的四大组件及资源操作基本上都离不开Context对象。 服务三连开发者我们最关心的就是引导服务,因为这里面开启的都是我们在日常开发中最容易用到的几个服务: Launcher即桌面,是Android智能设备的窗口,用户使用最频繁的软件之一。Launhcer是Android所有应用的入口,也提供窗口小部件等功能。 Launcher本身就是一个APP,一个提供桌面的APP,Laucher有很多和普通APP不同的地方: Launcher是由ActivityManagerService启动的,在SystemServer.java的startOtherServices()方法里面的调用 mActivityManagerService.systemReady()进行Launcher的启动之旅,在 ActivityManagerService和PackageManagerService一样,都是在开机时由SystemServer组件启动,Launcher在启动的时候会通过PackageManagerServic把系统中已经安装好的应用程序以快捷图标的形式展示在桌面上,这样用户就可以使用这些应用程序了。另外程序安装的时候SystemServer组件会通过PackageManagerServic来安装应用程序,应用程序安装好了以后会以通知的形式通知launcher展示应用图标,卸载同理。 本篇简单分析了一下系统从开机启动到桌面展示这个过程,这里简单总结一下: 开机启动我们重在了解过程,明确知道系统几个重要的服务,了解过程中虽然很枯燥但是对开发很有帮助,例如以后的插件化学习,下篇我会着重分析一下Launcher的构造以及Activity的启动过程,加油,期待。系统开机启动过程
zygote
SystemServer
什么时候开启SystemServer
public static void main(String argv[]) { ...ignore some code... //在加载首个zygote的时候,会传入初始化参数,一旦捕获到参数是“start-system-server”,即可开启fork SystemServer指令 boolean startSystemServer = false; for (int i = 1; i < argv.length; i++) { if ("start-system-server".equals(argv[i])) { startSystemServer = 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)) { socketName = argv[i].substring(SOCKET_NAME_ARG.length()); } else { throw new RuntimeException("Unknown command line argument: " + argv[i]); } } ...ignore some code... //开始fork我们的SystemServer进程 if (startSystemServer) { startSystemServer(abiList, socketName); } ...ignore some code... }
/** * Prepare the arguments and fork for the system server process. */ private static boolean startSystemServer(String abiList, String socketName) throws MethodAndArgsCaller, RuntimeException { ...ignore some code... //上面ZygoteInit.main(String argv[])里面的argv就是通过这种方式传递进来的 /* Hardcoded command line to start the system server */ String args[] = { "--setuid=1000", "--setgid=1000", "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1032,3001,3002,3003,3006,3007", "--capabilities=" + capabilities + "," + capabilities, "--runtime-init", "--nice-name=system_server", "com.android.server.SystemServer", }; int pid; try { parsedArgs = new ZygoteConnection.Arguments(args); ZygoteConnection.applyDebuggerSystemProperty(parsedArgs); ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs); //fork SystemServer /* Request to fork the system server process */ pid = Zygote.forkSystemServer( parsedArgs.uid, parsedArgs.gid, parsedArgs.gids, parsedArgs.debugFlags, null, parsedArgs.permittedCapabilities, parsedArgs.effectiveCapabilities); } catch (IllegalArgumentException ex) { throw new RuntimeException(ex); } /* For child process */ if (pid == 0) { if (hasSecondZygote(abiList)) { waitForSecondaryZygote(socketName); } handleSystemServerProcess(parsedArgs); } return true; }
SystemServer进程初始化
public final class SystemServer { //zygote的主入口 public static void main(String[] args) { new SystemServer().run(); } public SystemServer() { // Check for factory test mode. mFactoryTestMode = FactoryTest.getMode(); } private void run() { ...ignore some code... //创建主线程looper 在当前线程运行 android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND); android.os.Process.setCanSelfBackground(false); Looper.prepareMainLooper(); //加载本地系统服务库,并进行初始化 System.loadLibrary("android_servers"); nativeInit(); // 创建系统上下文 createSystemContext(); //初始化SystemServiceManager对象,下面的系统服务开启都需要调用SystemServiceManager.startService(Class<T>),这个方法通过反射来启动对应的服务 mSystemServiceManager = new SystemServiceManager(mSystemContext); //开启服务 try { startBootstrapServices(); startCoreServices(); startOtherServices(); } catch (Throwable ex) { Slog.e("System", "******************************************"); Slog.e("System", "************ Failure starting system services", ex); throw ex; } ...ignore some code... } //初始化系统上下文对象mSystemContext,并设置默认的主题,mSystemContext实际上是一个ContextImpl对象。调用ActivityThread.systemMain()的时候,会调用ActivityThread.attach(true),而在attach()里面,则创建了Application对象,并调用了Application.onCreate()。 private void createSystemContext() { ActivityThread activityThread = ActivityThread.systemMain(); mSystemContext = activityThread.getSystemContext(); mSystemContext.setTheme(android.R.style.Theme_DeviceDefault_Light_DarkActionBar); } //在这里开启了几个核心的服务,因为这些服务之间相互依赖,所以都放在了这个方法里面。 private void startBootstrapServices() { ...ignore some code... //初始化ActivityManagerService mActivityManagerService = mSystemServiceManager.startService( ActivityManagerService.Lifecycle.class).getService(); mActivityManagerService.setSystemServiceManager(mSystemServiceManager); //初始化PowerManagerService,因为其他服务需要依赖这个Service,因此需要尽快的初始化 mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class); // 现在电源管理已经开启,ActivityManagerService负责电源管理功能 mActivityManagerService.initPowerManagement(); // 初始化DisplayManagerService mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class); //初始化PackageManagerService mPackageManagerService = PackageManagerService.main(mSystemContext, mInstaller, mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore); //开启消息循环 Looper.loop(); ...ignore some code... } }
Launcher
systemReady
方法执行过程中调了用startHomeActivityLocked
方法,方法内部通过getHomeIntent
拿到Launcher对应的Intent,最后调用startHomeActivity
来启动Launcher。 boolean startHomeActivityLocked(int userId, String reason) { if (mFactoryTest == FactoryTest.FACTORY_TEST_LOW_LEVEL && mTopAction == null) { // We are running in factory test mode, but unable to find // the factory test app, so just sit around displaying the // error message and don't try to start anything. return false; } Intent intent = getHomeIntent(); ActivityInfo aInfo = resolveActivityInfo(intent, STOCK_PM_FLAGS, userId); if (aInfo != null) { intent.setComponent(new ComponentName( aInfo.applicationInfo.packageName, aInfo.name)); // Don't do this if the home app is currently being // instrumented. aInfo = new ActivityInfo(aInfo); aInfo.applicationInfo = getAppInfoForUser(aInfo.applicationInfo, userId); ProcessRecord app = getProcessRecordLocked(aInfo.processName, aInfo.applicationInfo.uid, true); if (app == null || app.instrumentationClass == null) { intent.setFlags(intent.getFlags() | Intent.FLAG_ACTIVITY_NEW_TASK); mStackSupervisor.startHomeActivity(intent, aInfo, reason); } } return true; }
总结
参考:
本网页所有视频内容由 imoviebox边看边下-网页视频下载, iurlBox网页地址收藏管理器 下载并得到。
ImovieBox网页视频下载器 下载地址: ImovieBox网页视频下载器-最新版本下载
本文章由: imapbox邮箱云存储,邮箱网盘,ImageBox 图片批量下载器,网页图片批量下载专家,网页图片批量下载器,获取到文章图片,imoviebox网页视频批量下载器,下载视频内容,为您提供.
阅读和此文章类似的: 全球云计算