【读书笔记】Zygote 和 System 进程的启动过程
来源:互联网 发布:卖跑步装备的淘宝店 编辑:程序博客网 时间:2024/06/01 12:11
· 这是《Android 系统源代码情景分析》 一书中第 11 章, Zygote 和 System 进程的启动过程,的读书摘要;
一、Zygote 进程的过程
Zygote 进程是由 Android 系统的第一个进程脚本 init 启动的;
Zygote 进程是通过复制自身的方式来创建 System 进程和应用程序的;
Android 系统中,所有的应用程序进程,以及用来运行系统关键服务的 System 进程都是 Zygote 进程负责创建的;
1、reigsterZyogteSocket()
创建一个 Server 段的本地 Socket,用来等待 ActivityManagerService 请求 Zygote 创建新的应用程序进程;
2、startSystemServer()
启动 System 进程,以便它可以将系统关键服务启动起来;
方法 Zygote.forkSystemServer() 创建子进程也就是 Android 系统的 System 进程;
System 进程的用户 ID 和用户组 ID 均为 1000, 并且它还具有用户组1001~1010, 1018以及3001~3003 的权限;
方法 handleSystemServiceProcess(...) 启动 System 进程
3、runSelectLoop()
等待 ActivityManagerService 请求 Zygote 进程创建新的应用程序进程;
至此, Zygote 进程的启动已经完成。
二、System 进程启动过程
commonInit() 设置 System 进程的时区,键盘布局等通用信息;
zygoteInitNative() 在 native 层启动一个 Bindler 线程池;
applicationInit(...) 调用 inovkeStaticMain(...) 方法, invokeStaticMain(...) 通过类加载器,加载com.android.server.SystemServer, 进入 SystemServer.main() 方法, 启动 SystemServer
SystemServer.main() 方法会调用 System.run() 方法,在此方法里面启动一些相关的 Service;
private void run() { ... // Prepare the main looper thread (this thread). // 将线程的优先级设为前台线程,不能后台取消, 启动 主线程的 Looper android.os.Process.setThreadPriority(android.os.Process.THREAD_PRIORITY_FOREGROUND); android.os.Process.setCanSelfBackground(false); Looper.prepareMainLooper(); // Initialize native services. System.loadLibrary("android_servers"); nativeInit(); // Check whether we failed to shut down last time we tried. // This call may not return. performPendingShutdown(); // Initialize the system context. // 创建化系统的 context createSystemContext(); // Create the system service manager. // 创建 系统服务管理 mSystemServiceManager = new SystemServiceManager(mSystemContext); LocalServices.addService(SystemServiceManager.class, mSystemServiceManager); // Start services. // 启动服务 try { startBootstrapServices(); startCoreServices(); startOtherServices(); } catch (Throwable ex) { Slog.e("System", "******************************************"); Slog.e("System", "************ Failure starting system services", ex); throw ex; } // Loop forever. // 进入 Looper Looper.loop(); ... }
创建系统的 context
// 创建系统的 context private void createSystemContext() { ActivityThread activityThread = ActivityThread.systemMain(); mSystemContext = activityThread.getSystemContext(); mSystemContext.setTheme(android.R.style.Theme_DeviceDefault_Light_DarkActionBar); }
启动根服务
/** * Starts the small tangle of critical services that are needed to get * the system off the ground. These services have complex mutual dependencies * which is why we initialize them all in one place here. Unless your service * is also entwined in these dependencies, it should be initialized in one of * the other functions. */ private void startBootstrapServices() { // Wait for installd to finish starting up so that it has a chance to // create critical directories such as /data/user with the appropriate // permissions. We need this to complete before we initialize other services. Installer installer = mSystemServiceManager.startService(Installer.class); // Activity manager runs the show. // Activity 管理 mActivityManagerService = mSystemServiceManager.startService(ActivityManagerService.Lifecycle.class).getService(); mActivityManagerService.setSystemServiceManager(mSystemServiceManager); mActivityManagerService.setInstaller(installer); // Power manager needs to be started early because other services need it. // Native daemons may be watching for it to be registered so it must be ready // to handle incoming binder calls immediately (including being able to verify // the permissions for those calls). // 电池服务管理 mPowerManagerService = mSystemServiceManager.startService(PowerManagerService.class); // Now that the power manager has been started, let the activity manager // initialize power management features. mActivityManagerService.initPowerManagement(); // Display manager is needed to provide display metrics before package manager // starts up. // 显示服务 mDisplayManagerService = mSystemServiceManager.startService(DisplayManagerService.class); // We need the default display before we can initialize the package manager. mSystemServiceManager.startBootPhase(SystemService.PHASE_WAIT_FOR_DEFAULT_DISPLAY); ... // Start the package manager. // 启动 package 管理 mPackageManagerService = PackageManagerService.main(mSystemContext, installer, mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore); mFirstBoot = mPackageManagerService.isFirstBoot(); mPackageManager = mSystemContext.getPackageManager(); ServiceManager.addService(Context.USER_SERVICE, UserManagerService.getInstance()); // Initialize attribute cache used to cache resources from packages. AttributeCache.init(mSystemContext); // Set up the Application instance for the system process and get started. // 启动 ActivityMangerService mActivityManagerService.setSystemProcess(); }
启动一些核心服务
/** * Starts some essential services that are not tangled up in the bootstrap process. */ private void startCoreServices() { // Manages LEDs and display backlight. // 启动屏幕灯光 mSystemServiceManager.startService(LightsService.class); // Tracks the battery level. Requires LightService. // 启动电池服务 mSystemServiceManager.startService(BatteryService.class); // Tracks application usage stats. mSystemServiceManager.startService(UsageStatsService.class); mActivityManagerService.setUsageStatsManager(LocalServices.getService(UsageStatsManagerInternal.class)); // Update after UsageStatsService is available, needed before performBootDexOpt. mPackageManagerService.getUsageStatsIfNoPackageUsageInfo(); // Tracks whether the updatable WebView is in a ready state and watches for update installs. // 更新 WebView mSystemServiceManager.startService(WebViewUpdateService.class); }
startOtherService()
启动网络,蓝牙,电话等其他 Service;
0 0
- 【读书笔记】Zygote 和 System 进程的启动过程
- Zygote和System进程的启动过程
- Zygote和System进程的启动过程
- Zygote和System进程的启动过程
- Zygote和System进程的启动过程
- Zygote和System进程的启动过程
- (二)Zygote和System进程的启动过程
- Zygote进程启动System Server进程的过程
- Init进程启动Zygote进程的过程
- Zygote进程启动过程的源代码分析
- Android启动过程的Zygote进程
- 读书:《Android系统源代码情景分析》- 简述Zygote进程和System进程的启动
- Zygote进程的启动
- Android Zygote进程启动过程
- Android Zygote进程启动过程
- Android系统源码阅读(14):Zygote和System进程的启动
- zygote 和 app 的启动过程
- Zygote的启动过程
- 220. Contains Duplicate III
- 原始套接字编程(1)
- matlab-线性代数 创建N阶单位矩阵
- coreeek 和 sphinx 的配置与使用
- 打卡阅读
- 【读书笔记】Zygote 和 System 进程的启动过程
- VS2012 将两个项目合并在一个项目中使用
- matlab-线性代数 创建对角矩阵
- 下载的asp源码怎么使用?
- 第29课 Master HA彻底解密
- go example之旅(上)
- Sphinx 安装记录
- matlab-线性代数 创建范德蒙矩阵
- 浮动元素float的详细内幕