本文转载自微信公众号「Android开发编程」,动流作者Android开发编程。程和转载本文请联系Android开发编程公众号。源码
Android中有四大组件:Activity、详解Service、进阶BroadcastReceiver、动流ContentProvider。程和我们最常接触也是源码用户直接感受到的就是Activity了,今天来就说说Android启动的详解执行过程和工作原理。
Activity是一种 展示型组件,用于展示给用户一个可以交互的页面。Activity是Android中最重要的组件,对用户来说,所有的Activity就是一个App的全部,而其他组件用户是不能直接感知的;
今天我们就来分析总结下app启动流程的场景和知识点
SystemServer也是一个进程,而且是由zygote进程fork出来的
在zygote开启的时候,会调用ZygoteInit.main()进行初始化
- public static void main(String argv[]) {
- ...ignore some code...
- //在加载首个zygote的时候,会传入初始化参数,使得startSystemServer = true
- 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...
- }
startSystemServer()做了些什么
- /**留着这个注释,就是为了说明SystemServer确实是被fork出来的
- * 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出来的 -_-|||
- /* 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;
- }
- 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...
- //加载本地系统服务库,并进行初始化
- 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", "
(责任编辑:综合)
搭载局域控光技术 三星UA55MUC30S智能HDR电视售4299元
微软发布 Windows Server vNext 预览版 25324,系统托盘回归秒数显示
中国擎天软件(01297.HK)年度纯利大增 每股基本盈利为人民币42.21分
金通灵(300091.SZ):南通科创未减持公司股份 减持计划期限届满