首页 > 编程语言 >android应用程序启动流程分析

android应用程序启动流程分析

时间:2022-10-12 13:13:26浏览次数:46  
标签:调用 流程 应用程序 className ex parsedArgs main android

android应用程序启动流程

当在launcher进程(home进程)中点击一个应用的图标时其会调用startActivity,然后会通过Binder与system_server系统进程跨进程通讯。system_server会调用Process.start开始启动一个新进程。Process.start会先调用Porcess.StartViaZygote函数


Porcess.StartViaZygote函数会进一步调用Process.zygoteSendArgsAndGetResult函数打开一个socket连接。

在zygote进程中会监控此socket连接,监听返回后会调用

if (parsedArgs.mInvokeWith != null || parsedArgs.mStartChildZygote
                        || !multipleOK || peer.getUid() != Process.SYSTEM_UID) {
                    // Continue using old code for now. TODO: Handle these cases in the other path.
                    //调用forkAndSpecialize去fork一个新进程
                    pid = Zygote.forkAndSpecialize(parsedArgs.mUid, parsedArgs.mGid,
                            parsedArgs.mGids, parsedArgs.mRuntimeFlags, rlimits,
                            parsedArgs.mMountExternal, parsedArgs.mSeInfo, parsedArgs.mNiceName,
                            fdsToClose, fdsToIgnore, parsedArgs.mStartChildZygote,
                            parsedArgs.mInstructionSet, parsedArgs.mAppDataDir,
                            parsedArgs.mIsTopApp, parsedArgs.mPkgDataInfoList,
                            parsedArgs.mAllowlistedDataInfoList, parsedArgs.mBindMountAppDataDirs,
                            parsedArgs.mBindMountAppStorageDirs);

                    try {
                        if (pid == 0) {
                            // in child
                            //如果是子进程就调用handleParentProc()
                            zygoteServer.setForkChild();

                            zygoteServer.closeServerSocket();
                            IoUtils.closeQuietly(serverPipeFd);
                            serverPipeFd = null;

                            return handleChildProc(parsedArgs, childPipeFd,
                                    parsedArgs.mStartChildZygote);
                        } else {
                            // In the parent. A pid < 0 indicates a failure and will be handled in
                            // handleParentProc.
                            IoUtils.closeQuietly(childPipeFd);
                            childPipeFd = null;
                            handleParentProc(pid, serverPipeFd);
                            return null;
                        }
                    } finally {
                        IoUtils.closeQuietly(childPipeFd);
                        IoUtils.closeQuietly(serverPipeFd);
                    }
                } 

handlerChildProc最终会调用findStaticMain去加载android.app.ActivityThread类并通过反射调用其对应的静态main方法

protected static Runnable findStaticMain(String className, String[] argv,
            ClassLoader classLoader) {
        Class<?> cl;

        try {
            //加载android.app.ActivityThread类
            cl = Class.forName(className, true, classLoader);
        } catch (ClassNotFoundException ex) {
            throw new RuntimeException(
                    "Missing class when invoking static main " + className,
                    ex);
        }

        Method m;
        try {
            //得到android.app.ActivityThread类的静态main方法Method对象
            m = cl.getMethod("main", new Class[] { String[].class });
        } catch (NoSuchMethodException ex) {
            throw new RuntimeException(
                    "Missing static main on " + className, ex);
        } catch (SecurityException ex) {
            throw new RuntimeException(
                    "Problem getting static main on " + className, ex);
        }
        //最后通过反射调用android.app.ActivityThread类的静态main方法
        return new MethodAndArgsCaller(m, argv);  
    }

标签:调用,流程,应用程序,className,ex,parsedArgs,main,android
From: https://www.cnblogs.com/revercc/p/16784167.html

相关文章

  • 中国汉字,日本汉字 学习Android App推荐
    JapaneseKanjiStudyhttps://play.google.com/store/apps/details?id=com.mindtwisted.kanjistudy HanpingCantoneseDictionaryhttps://play.google.com/store/ap......
  • 毛绒玩具CPC认证流程
    毛绒玩具,是由毛绒面料与​​pp棉​​及其他纺织材料为主要面料,内部填塞各种填充物而制成的玩具,也可以称为软性玩具、填充玩具。当前我们习惯性的把布绒玩具业称为毛绒玩具。......
  • maxcomputeSQL工作流程
    MaxCompute向用户提供了完善的数据导入方案以及多种经典的分布式计算模型,能够更快速的解决用户海量数据计算问题,有效降低企业成本,并保障数据安全提交一个SQL语句,发送REST......
  • [Android开发学iOS系列] ViewController
    iOSViewController写UIKit的代码,ViewController是离不开的.本文试图讲讲它的基本知识,不是很深入且有点杂乱,供初级选手和跨技术栈同学参考.WhatisaViewContro......
  • android的双亲委派模型
    javaJVM中有三个初始的类加载器:引导类加载器BootStrapClassLoader,扩展类加载器ExterntionsClassLoader,应用程序类加载器ApplicationClassLoader。引导类加载器BootStrap......
  • 软著申请流程详解
    软著申请流程详解文章目录​​软著申请流程详解​​​​前言​​​​一、为什么要申请软著​​​​二、如何申请软著​​​​1.注册中国版权保护中心账号​​​​2.账号实......
  • Android Fragment生命周期和用法解析
    Fragment生命周期图:Fragment与Activity生命周期对比图:2  生命周期分析1.当一个fragment被创建的时候,它会经历以下状态.onAttach()onCreate()onCreateView()onActivityC......
  • Springboot项目打war,jar包流程
    Springboot项目打jar包流程1、在POM中确定MAVEN打包插件已经引入<build>   <plugins>       <plugin>           <groupId>org.springframework.b......
  • mac Big Sur 打开应用提示,您没有权限来打开应用程序
    终端输入codesign--force--deep--sign-/Applications/{AppName.app}注意{AppName.app}替换为无法打开的应用程序名,将尝试强制签署应用程序并为你提供运行它的权限 ......
  • 【框架】IDEA创建SSM框架流程
    创建模块添加全新模块使用模板创建,选择webapp,之后next框架信息→next→finish框架完整化打开创建好的框架,再选择结构点击OK导入jar包以及对应坐标参考:<?x......