Android四大组件之Activity(五)——AMS:针对新启动的Activity创建一个新的进程

1、使用的是Android 7.1.2的源代码:

https://pan.baidu.com/s/1XcVD68cC_2wKtm8jJkdNQA
przv

2、感谢IT先森的系列博客:

Android应用进程创建流程大揭秘
Android四大组件之bindService源码实现详解
Android四大组件之Activity启动流程源码实现详解概要
Activity启动流程(一)发起端进程请求启动目标Activity
Activity启动流程(二)system_server进程处理启动Activity请求
Activity启动流程(三)-Activity Task调度算法复盘分析
Activity启动流程(四)-Pause前台显示Activity,Resume目标Activity
Activity启动流程(五)请求并创建目标Activity进程
Activity启动流程(六)注册目标Activity进程到system_server进程以及创建目标Activity进程Application
Activity启动流程(七)初始化目标Activity并执行相关生命周期流程

3、理解Android进程创建流程:http://gityuan.com/2016/03/26/app-process-create/

继续上一篇:Android四大组件之Activity(四)—— 启动模式(launchMode) + Pause上一个Activity

AMS请求Zygote创建目标Activity所属进程_相关伪代码:

ActivityStackSupervisor.startSpecificActivityLocked
   AMS.startProcessLocked
      AMS.startProcessLocked
    	 AMS.newProcessRecordLocked
    		addProcessNameLocked(r);//将ProcessRecord信息在AMS中存储起来
    	 AMS.startProcessLocked
            //final String entryPoint = "android.app.ActivityThread";
            Process.start(entryPoint, ··· ···)
            Process.startViaZygote()	
            	Process.zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi), argsForZygote); 

AMS请求Zygote创建目标Activity所属进程_相关子流程:

  • AMS请求Zygote创建目标Activity所属进程
  • Zygote孵化目标Activity所属进程
  • 初始化目标Activity所属进程
  • 注册目标Activity所属进程到system_server
  • 目标Activity所属进程创建Application实例对象

进程:每个App在启动之前必须先创建一个进程,该进程是由Zygote fork出来的,进程具有独立的资源空间,用于承载 App 上运行的各种 Activity/Service 等组件。大多数情况下,一个 App 就运行在一个进程中,除非在AndroidManifest.xml中 配置 android:process 属性,或通过 native 代码fork进程。

system_server进程:用于管理整个Java framework层,包含ActivityManager、PowerManager等各种系统服务。system_server进程以及所有的App进程都是Zygote的子进程。

Zygote进程:Android系统的首个Java进程,Zygote进程是所有Java进程的父进程。

1、AMS.startProcessLocked

//[ActivityManagerService.java]
	//这个参数够多的,真是够多的
    final ProcessRecord startProcessLocked(String processName, //目标Activity对应的进程名,通常上是包名
    									   ApplicationInfo info,//Activity所属App的Application信息
            							   boolean knownToBeDead, //这个参数具体意义不明,传递过来的值为true
            							   int intentFlags, //参数的值为0
            							   String hostingType, //这个参数意义不明,参数值为"activity"
            							   ComponentName hostingName,//启动目标Activity时解析intent时得到的
            							   boolean allowWhileBooting, //是否允许在开启启动时,参数未false
            							   boolean isolated, //参数为false,这个值的意思是该进程是否是隔离的
            							   int isolatedUid, //指定隔离进程的UID
            							   boolean keepIfLarge,//参数意义不明,传递的值为true
            							   String abiOverride, //是否覆盖目标Activity所属app安装时的abi,abi通常影响so库的选择,取值为null
            							   String entryPoint, //参数意义不明,取值为null
            							   String[] entryPointArgs, //参数意义不明,取值为null
            							   Runnable crashHandler) //参数意义不明,取值为null
    {
   
        ...
        ProcessRecord app;
        if (!isolated) {
   //当不是隔离进程时
        	/*
	        	获取AMS中是否存在目标Activity所属进程的ProcessRecord记录,在非isolated模式下AMS可以重用先前的ProcessRecord记录
	        	这里小伙们肯定有个疑问就是为啥startSpecificActivityLocked中检查了一次,这里又检查一次,
	        	而和startSpecificActivityLocked处理不同的是这里并没有因为ProcessRecord的存在而停止后续的脚步呢
	        	好吗,此处的逻辑感觉有点不是很清晰啊
                
                在startSpecificActivityLocked中已经调用过一次getProcessRecordLocked来看目的Activity的进程是否存在
        	*/
            app = getProcessRecordLocked(processName, info.uid, keepIfLarge);
			// 启动参数中,带有FLAG_FROM_BACKGROUND标志,表示进程需要后台启动
            if ((intentFlags & Intent.FLAG_FROM_BACKGROUND) != 0) {
   
            	// 后台启动一个BadProcess,直接退出
                if (mAppErrors.isBadProcessLocked(info)) {
   
                    return null;
                }
            } else {
   
                //清理进程Crash消息
                mAppErrors.resetProcessCrashTimeLocked(info);
                if (mAppErrors.isBadProcessLocked(info)) {
   
                	// 前台启动,则需要将宿主进程从坏的进程中剔除
                    mAppErrors.clearBadProcessLocked(info);
                    if (app != null) {
   
                        app.bad = false;
                    }
                }
            }
        } else {
   
            app = null;
        }
		
		/*
			此处涉及到了超自然现象,看注释的意思是对于大小核的架构的设备的话,此时使用cpuset将前台任务迁移到大核上
			这个已经超过本人的能力范畴之外了,pass
		*/
		nativeMigrateToBoost();
        mIsBoosted = true;
		...
		
		// 当进程已经被分配了PID时
        if (app != null && app.pid > 0) {
   
        	// 进程还处于启动的过程中
            if ((!knownToBeDead && !app.killed) || app.thread == null) {
   
                app.addPackage(info.packageName, info.versionCode, mProcessStats);
                return app;
            }

			/*
				这个地方要怎么理解呢,可能前面目标Activity所属App进程被创建过
				但是已经over了再启动时需要对其做一些清理工作
			*/
            killProcessGroup(app.uid, app.pid);
            handleAppDiedLocked(app, true, true);
        }

        String hostingNameStr = hostingName != null
                ? hostingName.flattenToShortString() : null;

        if (app == null) {
   
        //
        	//在AMS中创建ProcessRecord信息记录
            app = newProcessRecordLocked(info, processName, isolated, isolatedUid);//-->1 进入这里
            if (app == null) {
   
                return null;
            }
            //设置crashHandler
            app.crashHandler = crashHandler;
        } else {
   
            app.addPackage(info.packageName, info.versionCode, mProcessStats);
        }

		// 如果系统还未启动,则需要将待启动进程先保持住,等系统启动后,再来启动这些进程
		//final ArrayList<ProcessRecord> mProcessesOnHold = new ArrayList<ProcessRecord>();
        if (!mProcessesReady
                && !isAllowedWhileBooting(info)
                && !allowWhileBooting) {
   
            if (!mProcessesOnHold.contains(app)) {
   
                mProcessesOnHold.add(app);
            }
            return app;
        }

        //又调用另外一个重载的startProcessLocked
        startProcessLocked(
                app, hostingType, hostingNameStr, abiOverride, entryPoint, entryPointArgs);//2 -->进入这里
        
        return (app.pid != 0) ? app : null;
    }

2、AMS.newProcessRecordLocked

//[ActivityManagerService.java]
/**
* @param0,info,值为Activity B所属App的Application信息
* @param1,customProcess,值为Activity B对应的进程名,通常上是包名
* @param2,isolated,参数为false,这个值的意思是该进程是否是隔离的
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值