首页 > 编程语言 >android开发基于Android10分析请求Zygote执行Fork一个新的应用程序的过程

android开发基于Android10分析请求Zygote执行Fork一个新的应用程序的过程

时间:2024-07-17 20:41:41浏览次数:11  
标签:Fork zygoteState Process Android10 Zygote result new wpc

android开发基于Android10分析请求Zygote执行Fork一个新的应用程序的过程

```
ActivityTaskManagerService.activityPaused

ActivityStack.activityPausedLocked

RootActivityContainer.resumeFocusedStacksTopActivities

ActivityStackSupervisor.startSpecificActivityLocked


void startSpecificActivityLocked(ActivityRecord r, boolean andResume, boolean checkConfig) {
    // Is this activity's application already running?
	//先mProcessNames缓存中查找是否存在这个进程
    final WindowProcessController wpc =
            mService.getProcessController(r.processName, r.info.applicationInfo.uid);
	
	if (wpc != null && wpc.hasThread()) {
        try {
            realStartActivityLocked(r, wpc, andResume, checkConfig); //如果已经存在,直接启动
            return;
        } catch (RemoteException e) {
            Slog.w(TAG, "Exception when starting activity " + r.intent.getComponent().flattenToShortString(), e);
        }
		return;
    }		
	ActivityManagerInternal::startProcess //否则执行startProcess进行fork一个子进程
}

ActivityManagerService.startProcessLocked();

ProcessList.startProcessLocked(); // Process management

Process.start(entryPoint ...);

ZYGOTE_PROCESS.start(...);

ZygoteProcess.startViaZygote();

ZygoteProcess.zygoteSendArgsAndGetResult();

ZygoteProcess.attemptZygoteSendArgsAndGetResult();

private Process.ProcessStartResult attemptZygoteSendArgsAndGetResult(
        ZygoteState zygoteState, String msgStr) throws ZygoteStartFailedEx {
    try {
        final BufferedWriter zygoteWriter = zygoteState.mZygoteOutputWriter;
        final DataInputStream zygoteInputStream = zygoteState.mZygoteInputStream;
        zygoteWriter.write(msgStr);	//往zygote socket server写参数
        zygoteWriter.flush();

        Process.ProcessStartResult result = new Process.ProcessStartResult();
        result.pid = zygoteInputStream.readInt();	//从zygote socket server读取fork出来的子进程pid
        result.usingWrapper = zygoteInputStream.readBoolean();
        if (result.pid < 0) {
            throw new ZygoteStartFailedEx("fork() failed");
        }
        return result;
    } catch (IOException ex) {
        zygoteState.close();
        Log.e(LOG_TAG, "IO Exception while communicating with Zygote - "
                + ex.toString());
        throw new ZygoteStartFailedEx(ex);
    }
}

ActivityManagerService.handleProcessStartedLocked();//mService.mPidsSelfLocked.put(app);//ProcessRecord缓存起来

//新进程创建,走android.app.ActivityThread类main方法,然后走attachApplication,接着回到ActivityManagerService
ActivityManagerService.attachApplication

ActivityTaskManagerInternal.LocalService.attachApplication();

RootActivityContainer.attachApplication(wpc)

ActivityStackSupervisor.realStartActivityLocked

clientTransaction.addCallback(LaunchActivityItem.obtain(new Intent(r.intent)..)
if (andResume) {
	lifecycleItem = ResumeActivityItem.obtain(dc.isNextTransitionForward());
} else {
	lifecycleItem = PauseActivityItem.obtain();
}
clientTransaction.setLifecycleStateRequest(lifecycleItem);
mService.getLifecycleManager().scheduleTransaction(clientTransaction);

//LaunchActivityItem
client.handleLaunchActivity(r, pendingActions, null /* customIntent */);
```

标签:Fork,zygoteState,Process,Android10,Zygote,result,new,wpc
From: https://www.cnblogs.com/yongfengnice/p/18308245

相关文章

  • Java中的Fork/Join框架详解
    Java中的Fork/Join框架详解大家好,我是微赚淘客系统3.0的小编,是个冬天不穿秋裤,天冷也要风度的程序猿!在Java中,Fork/Join框架是一种用于并行处理任务的强大工具,特别适用于那些可以递归地分解成更小任务的场景。Fork/Join框架基于“工作窃取”算法,允许空闲的线程从那些繁忙的线程那......
  • git 如何 fork 一个仓库的所有分支
    假设要fork的仓库名称为a,你的本地仓库名称为b克隆a仓库的[email protected]:username/a.gitcda添加b仓库为上游(upstream)远程仓库[email protected]:username/b.git获取所有分支gitfetchupstream查看所有分支gitbranch......
  • git fork模式、合并commit、多条commit修改指定的commit
    1、fork项目在github页面上,点击fork按钮,将B的项目拷贝一份到A自己的代码仓库中.2.克隆A自己的代码仓库到本地.gitcloneAgitremoteaddupstream <upsteam-url>:添加一个upstream远程仓库,指向一个公共的代码仓库,通常是原始项目的仓库(B)使用gitremote查看,可以看到有u......
  • git 同步主仓库到fork仓库
    #1.克隆你的fork仓库(如果你还没有克隆)gitclone<your-fork-repo-url> #2.进入仓库目录cd<your-fork-repo-directory> #3.添加主仓库作为一个新的远程仓库(如果你还没有添加)gitremoteaddupstream<main-repo-url> #4.获取主仓库的最新更改gitfetchupstream #5.......
  • 记录一次代码中的ForkJoinPool.getCommonPoolParallelism()
    @Configuration@Slf4jpublicclassThreadPoolConfig{privatestaticfinalintCORE_POOL_SIZE=6;privatestaticfinalintMAX_POOL_SIZE=12;privatestaticfinalintKEEP_ALIVE_TIME=60;privatestaticfinalintQUEUE_CAPACITY=......
  • python系列&AI系列:cannot import name ‘ForkProcess‘ from ‘multiprocessing.conte
    cannotimportname‘ForkProcess‘from‘multiprocessing.context‘问题解决cannotimportname‘ForkProcess‘from‘multiprocessing.context‘问题解决问题描述问题原因解决方案cannotimportname‘ForkProcess‘from‘multiprocessing.context‘问......
  • 【Linux】fork()函数详解|多进程
    ......
  • Java并行世界的钥匙:一文带你了解Java ForkJoin并行框架
    Fork/Join框架是Java7引入的一个并行计算框架,主要用于处理可以通过递归分解成更细小的任务的场景。其基本结构和工作流程可以从以下几个方面进行详细解析:核心类ForkJoinPool:这是一个线程池类,用于执行ForkJoinTask任务。ForkJoinWorkerThread:这是执行任务的具体线程实体......
  • github fork后对上游仓库的做rebase
    想对上游仓库做更新同步先添加上游仓库gitremoteaddupstreamhttps://github.com/原始作者/原始仓库.git其中这里的upstream是一个命名,和origin同理然后gitfetchupstream拉取下upstream的远端顺便说一下gitfetch和gitpull的区别:gitfetch操作是从远程仓......
  • Github Fork仓库的冲突与同步管理
    在使用Github进行协作开发时,fork一个仓库并在本地进行开发是常见的工作流程。然而,当源仓库(上游仓库)有了更新时,如何同步这些更新并解决可能的合并冲突是一个关键问题。本文将详细介绍如何管理这些操作。步骤一:Fork并克隆仓库首先,fork你感兴趣的源仓库,并将其克隆到本地:gitclon......