应用的主线程和binder线程是如何启动的

【安卓源码】Binder机制3 -- Binder线程池 Binder本身是C/S架构,就可能存在多个Client会同时访问Server的情况。在这种情况下,如果Server只有一个线程处理响应,就会导致客户端的请求可能需要排队而导致响应过慢的现象发生。解决这个问题的方法就是引入多线程。【多个客户端不同线程去请求,服务端需要使用多线程机制,binder线程池,创建多个线程去回复多个客户端的请求】Binder机制的设计从最底层–驱动层,就考虑到了对于多线程的支持。 阅读详情

kernel启动后,init进程会通过init rc配置脚本启动编译为app_process的二进制可执行文件,启动后的进程名为zygote。
zygote会启动虚拟机环境,然后fork出system_server进程,进入Java世界。
system_server是Android的系统进程,各大服务AMS、PMS、WMS等都运行在这个进程中。

1 system_server 进程发送fork请求

启动四大组件时,如果应用进程不存在,就会走到AMS创建应用进程的过程,这个进程是从zygote fork出来的。
frameworks/base/services/core/java/com/android/server/am/ProcessList.java

boolean startProcessLocked(HostingRecord hostingRecord, String entryPoint, ProcessRecord app,  
		int uid, int[] gids, int runtimeFlags, int zygotePolicyFlags, int mountExternal,  
		String seInfo, String requiredAbi, String instructionSet, String invokeWith,  
		long startTime) {
	...
	if (mService.mConstants.FLAG_PROCESS_START_ASYNC) {
		// 默认是异步启动
		mService.mProcStartHandler.post(() -> handleProcessStart(  
		     app, entryPoint, gids, runtimeFlags, zygotePolicyFlags, mountExternal,  
			 requiredAbi, instructionSet, invokeWith, startSeq));  
		return true;
	} else {
		// 启动进程
		final Process.ProcessStartResult startResult = startProcess(hostingRecord,  
				 entryPoint, app,
				 uid, gids, runtimeFlags, zygotePolicyFlags, mountExternal, seInfo,  
				 requiredAbi, instructionSet, invokeWith, startTime);
		// 进程启动后的处理
		handleProcessStartedLocked(app, startResult.pid, startResult.usingWrapper, startSeq, false);
		...
	}
}

private Process.ProcessStartResult startProcess(HostingRecord hostingRecord, String entryPoint,  
		ProcessRecord app, int uid, int[] gids, int runtimeFlags, int zygotePolicyFlags,  
		int mountExternal, String seInfo, String requiredAbi, String instructionSet,  
		String invokeWith, long startTime) {

	Process.ProcessStartResult startResult;
	if (hostingRecord.usesWebviewZygote()) {
		// 启动webview
	    startResult = startWebView(entryPoint,
				app.processName, uid, uid, gids, runtimeFlags, mountExternal,
				app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,
				app.info.dataDir, null, app.info.packageName, app.mDisabledCompatChanges,
				new String[]{PROC_START_SEQ_IDENT + app.startSeq});
	} else if (hostingRecord.usesAppZygote()) {
	} else {
		startResult = mService.handlePreForkStartProcess(preforkArgs);  
		if (startResult == null) {
			// 启动进程
			startResult = Process.start(entryPoint,  
				 app.processName, uid, uid, gids, runtimeFlags, mountExternal,  
				 app.info.targetSdkVersion, seInfo, requiredAbi, instructionSet,  
				 app.info.dataDir, invokeWith, app.info.packageName, zygotePolicyFlags,  
				 isTopApp, app.mDisabledCompatChanges, pkgDataInfoMap,  
				 whitelistedAppDataInfoMap, bindMountAppsData, bindMountAppStorageDirs,  
				 new String[]{PROC_START_SEQ_IDENT + app.startSeq});  
		}
	}
}

为了减轻AMS的压力,默认为异步启动,异步启动的过程和同步启动差不多。

创建过程就是向zygote发送指令并获得结果。

// frameworks/base/core/java/android/os/Process.java
start {
	// frameworks/base/core/java/android/os/ZygoteProcess.java
	start {
		startViaZygote {
			// 1 准备参数
			// 2 
			zygoteSendArgsAndGetResult(openZygoteSocketIfNeeded(abi), zygotePolicyFlags, argsForZygote) {
				if (shouldAttemptUsapLaunch(zygotePolicyFlags, args)) {  
			        return attemptUsapSendArgsAndGetResult(zygoteState, msgStr);
			    }

				return attemptZygoteSendArgsAndGetResult(zygoteState, msgStr); {
					// 发送指令
					zygoteWriter.write(msgStr);  
					zygoteWriter.flush();

					
					Process.ProcessStartResult result = new Process.ProcessStartResult();  
					result.pid = zygoteInputStream.readInt();  
					result.usingWrapper = zygoteInputStream.readBoolean();  
  
					if (result.pid < 0) {  
					    throw new ZygoteStartFailedEx("fork() failed");  
					}  
  
					return result;
				}
			}
		}
	}
}

2 zygote进程响应fork请求

zygote是由init进程启动的。
zygote启动后,进入com.android.internal.os.ZygoteInit的main方法

public static void main(String argv[]) {
	...
	if (startSystemServer) {
		// 启动system_server
		Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);
		if (r != null) {
		    r.run(); 
			return;
		}
	}
	// 进入循环,等待fork请求
	caller = zygoteServer.runSelectLoop(abiList);

	...

	// fork后在子进程
	if (caller != null) {  
	    caller.run();  
	}
}

frameworks/base/core/java/com/android/internal/os/ZygoteServer.java

Runnable runSelectLoop(String abiList) {
	...
	while (true) {
		...
		while (-pollIndex >= 0) {
		
			ZygoteConnection connection = peers.get(pollIndex);
			// 处理命令,fork进程
			final Runnable command = connection.processOneCommand(this);

			if (mIsForkChild) {
				return command;
			}
		}
	}
}
frameworks/base/core/java/com/android/internal/os/ZygoteConnection.java
Runnable processOneCommand(ZygoteServer zygoteServer) {
	// 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.mWhitelistedDataInfoList,  
			parsedArgs.mBindMountAppDataDirs, parsedArgs.mBindMountAppStorageDirs);

	if (pid == 0) {
		// 子进程处理,即应用进程,当前线程是应用的主线程,即UI线程
		return handleChildProc(parsedArgs, childPipeFd, parsedArgs.mStartChildZygote);
	} else {
		handleParentProc(pid, serverPipeFd);
		return null;
	}
}

3 fork过程

frameworks/base/core/java/com/android/internal/os/Zygote.java

static int forkAndSpecialize(int uid, int gid, int[] gids, int runtimeFlags,  
		int[][] rlimits, int mountExternal, String seInfo, String niceName, int[] fdsToClose,  
		int[] fdsToIgnore, boolean startChildZygote, String instructionSet, String appDataDir,  
		boolean isTopApp, String[] pkgDataInfoList, String[] whitelistedDataInfoList,  
		boolean bindMountAppDataDirs, boolean bindMountAppStorageDirs) {
	ZygoteHooks.preFork();

	int pid = nativeForkAndSpecialize(...);

	ZygoteHooks.postForkCommon();  
	return pid;
}

frameworks/base/core/jni/com_android_internal_os_Zygote.cpp

static jint com_android_internal_os_Zygote_nativeForkAndSpecialize(...) {

	pid_t pid = ForkCommon(env, false, fds_to_close, fds_to_ignore, true); {
		// 调用system call fork
		pid_t pid = fork();
		if (pid == 0) {
			// 子进程的一些处理。比如重新打开所有的fd。
		} else {
		}
	}
  
	if (pid == 0) {
		// 子进程的一些处理。比如设置selinux context, 设置线程名等。并且会调用Zygote的callPostForkChildHooks
		SpecializeCommon(env, uid, gid, gids, runtime_flags, rlimits,  
				capabilities, capabilities,  
				mount_external, se_info, nice_name, false,  
				is_child_zygote == JNI_TRUE, instruction_set, app_data_dir,  
				is_top_app == JNI_TRUE, pkg_data_info_list,  
				whitelisted_data_info_list,  
				mount_data_dirs == JNI_TRUE,  
				mount_storage_dirs == JNI_TRUE);
	}
	return pid;
}

4 子进程处理

handleChildProc

private Runnable handleChildProc(ZygoteArguments parsedArgs, FileDescriptor pipeFd, boolean isZygote) {
	
	Zygote.setAppProcessName(parsedArgs, TAG);
	
	if (parsedArgs.mInvokeWith != null) {  
		// 调用pm,am命令时走到这里
		WrapperInit.execApplication(parsedArgs.mInvokeWith,  
				parsedArgs.mNiceName, parsedArgs.mTargetSdkVersion,  
				VMRuntime.getCurrentInstructionSet(),  
				pipeFd, parsedArgs.mRemainingArgs);
	} else {
		if (!isZygote) {
			// 应用进程会走到这里,进入了ZygoteInit类的zygoteInit方法
			return ZygoteInit.zygoteInit(parsedArgs.mTargetSdkVersion,
					parsedArgs.mDisabledCompatChanges,
					parsedArgs.mRemainingArgs, null /* classLoader */);
		} else {
		    return ZygoteInit.childZygoteInit(parsedArgs.mTargetSdkVersion,
					parsedArgs.mRemainingArgs, null /* classLoader */);
		}
	}
}

zygoteInit

public static final Runnable zygoteInit(int targetSdkVersion, long[] disabledCompatChanges,  
		String[] argv, ClassLoader classLoader) {

	// runtime的一些初始化。比如uncaughtExceptionHandler设置,处理应用crash
	RuntimeInit.commonInit();  
	// 进入ART的onZygoteInit,在那里启动第一个binder线程
	ZygoteInit.nativeZygoteInit();
	// 应用初始化。比如设置targetSdk,和最重要的,进入ActivityThread的main方法。
	return RuntimeInit.applicationInit(targetSdkVersion, disabledCompatChanges, argv, classLoader);
}

nativeZygoteInit

这个方法在frameworks/base/core/jni/AndroidRuntime.cpp中

static void com_android_internal_os_ZygoteInit_nativeZygoteInit(JNIEnv* env, jobject clazz)  
{
    gCurRuntime->onZygoteInit();
}

onZygoteInit

frameworks/base/cmds/app_process/app_main.cpp

virtual void onZygoteInit()  
{
    sp<ProcessState> proc = ProcessState::self();
	ALOGV("App process: starting thread pool.\n");
	// 启动第一个binder线程
	proc->startThreadPool();
}

spawnPooledThread

接下来的调用流程如下

startThreadPool
	|--> spawnPooledThread(true)
		|--> sp<Thread> t = new PoolThread(isMain);  
			 t->run(name.string());
				 |--> createThreadEtc
					 |--> androidCreateThreadEtc
						 |--> gCreateThreadFn
							 |--> javaCreateThreadEtc
								 |--> androidCreateRawThreadEtc
									 |--> pthread_create

joinThreadPool

调用pthread_create创建线程, 入口函数是Thread的_threadLoop,接着进入PoolThread的threadLoop
frameworks/native/libs/binder/ProcessState.cpp

virtual bool threadLoop()
{
	// 当前线程加入到binder线程池, mIsMain为true
    IPCThreadState::self()->joinThreadPool(mIsMain);  
	return false;
}

getAndExecuteCommand

frameworks/native/libs/binder/IPCThreadState.cpp

void IPCThreadState::joinThreadPool(bool isMain) {
	// 如果是第一个binder线程,进入looper,否则,注册到looper
	mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER);
	
	do {
		// 进入循环,不断获取命令并执行
		result = getAndExecuteCommand();
	} while (result != -ECONNREFUSED && result != -EBADF)

	mOut.writeInt32(BC_EXIT_LOOPER);  
	talkWithDriver(false);
}


status_t IPCThreadState::getAndExecuteCommand() {

	// 通过ioctl和binder驱动通信,响应client请求
	result = talkWithDriver();

	if (result >= NO_ERROR) {
		...
		cmd = mIn.readInt32();
		...
		// 执行命令
		result = executeCommand(cmd);
		...
	}
}

status_t IPCThreadState::executeCommand(int32_t cmd) {
	switch ((uint32_t)cmd) {
		case BR_TRANSACTION_SEC_CTX:  
		case BR_TRANSACTION:
		{
			// 函数调用流程

			binder_transaction_data_secctx tr_secctx;
			binder_transaction_data& tr = tr_secctx.transaction_data;
			// 读参数信息
			result = mIn.read(&tr, sizeof(tr));

			// 执行服务端相应的函数
			error = reinterpret_cast<BBinder*>(tr.cookie)->transact(tr.code, buffer, &reply, tr.flags);
		}
		break;

		case BR_SPAWN_LOOPER:
			// 当没有空闲的binder线程时,驱动会请求这个命令。服务端新建一个线程并加入binder线程池。
			// 应用进程最多16个,system_server最多32个。
			mProcess->spawnPooledThread(false);  
			break;
	}
}

Conclusion

简单的说,应用线程启动过程如下
1 启动四大组件时,如果应用进程不存在,AMS会请求zygote fork进程。
2 fork完成后,子进程的主线程就是应用的主线程,之后会调用ActivityThread的main方法,进入应用的生命周期。
3 主线程的初始化过程中,会调用到onZygoteInit,新建一个线程,这个线程会加入到binder pool,进入getAndExecuteCommand的循环。
4 当应用没有空闲的binder线程使用,并且binder线程不超过16个时,binder驱动会发送BR_SPAWN_LOOPER给上层的binder线程,然后新建一个线程并加入binder pool。

Binder通信过程中的用户空间线程池的管理 在Binder通信机制里,客户端与服务端之间的通信是在专门的IPC通信线程中进行的。这些线程构成一个线程池。线程的创建和销毁是在用户空间进行的,而对线程的控制是在驱动层进行的,即驱动控制线程池中线程的生命,而线程本身则是运行在用户空间的。驱动层是通过BR_SPAWN_LOOPER向用户空间发送创建新线程的命令。 线程池的大小可以设置。默认情况下,线程池只有一个主线程,它在进程生命周期期间是不会退 阅读详情

相关推荐

Android APP应用启动过程分析_android系统fork一个进程到application创建中间做了什么

在Android中,所有应用都是一个独立的进程。每个应用进程都是由Zygote进程fork出来的。应用启动是一个跨进程的复杂工作,应用启动流程主要是围绕着SystemServer的ActivityManagerService和应用进程的ActivityThread展开的。APP应用的启动流程内容比较多,可以通过Launcher响应屏幕点击、APP进程的创建、Application初始化、UI布局和绘制这四部分来理解。

2401_86391822的博客 1469

Binder 服务调用 和主线程的关系(1)

1.Binder服务的调用对象和Binder服务处于同一进程       在这种情况下,Binder 服务的调用对象调用服务方法的代码所在线程和 Binder服务执行所调用的方法的代码所在的线程,属于同一个线程。这个可以通过打印log 去验证。比如 应用程序A,的某个Activity在 AsyncTask 中访问 Binder 服务,这个Binder服务在应用程序A中的android.app.S

lsdmx2016的总结 4596

android进阶解密 第三章 应用程序进程启动过程

一.ams发送启动应用程序请求时序图如下: 1.在startProcessLocked中得到要创建进程的用户id(app.uid),并将用户id传到下一个流程(Process.start)中。 2.zygoteSendArgsAmdGetResult(openZygoteSockedIfNeeded(abi),argsForZygote)中调用了openZygoteSocketIfNeed...

龚礼鹏的博客 707

Android基础之Binder分析

我见过很多技术leader在面试的时候,遇到处于迷茫期的大龄程序员,比面试官年龄都大。这些人有一些共同特征:可能工作了5、6年,还是每天重复给业务部门写代码,工作内容的重复性比较高,没有什么技术含量的工作。问到这些人的职业规划时,他们也没有太多想法。其实30岁到40岁是一个人职业发展的黄金阶段,一定要在业务范围内的扩张,技术广度和深度提升上有自己的计划,才有助于在职业发展上有持续的发展路径,而不至于停滞不前。不断奔跑,你就知道学习的意义所在!

2401_84537603的博客 1322

VLA-JEPA:具身智能中潜空间世界模型的工程落地实践

世界模型是具身智能实现环境理解与因果推演的核心基础,其本质是在状态空间中建模‘动作→结果’的动力学规律。传统基于像素或文本的世界模型因高维、非平稳、弱语义等缺陷,在真实机器人场景中鲁棒性差、部署成本高。JEPA(联合嵌入预测架构)通过构建物理约束的潜空间,将视觉-语言-动作(VLA)信号统一编码为低维、可微、可解释的状态表征,显著提升模型对抖动、遮挡、光照突变等干扰的适应能力,并支持实时闭环控制。该范式已在UR5e、Franka等多构型机械臂及Jetson边缘平台完成实测验证,成为VLA系统从实验室走向产线

weixin_34357928的博客 336

Unity物理驱动3D汽车实现:从刚体控制到参数调优

在游戏开发中,刚体物理是实现真实物体运动与交互的核心技术。通过Unity的物理引擎,开发者可以模拟重力、碰撞、摩擦力等物理行为,为游戏世界注入真实感。其技术价值在于能够以符合物理规律的方式驱动游戏对象,避免穿墙、无视惯性等问题,从而提升游戏体验的真实性和沉浸感。这一原理广泛应用于角色控制、车辆模拟、物体破坏等场景。本文以3D小汽车为例,详细解析了如何通过Rigidbody组件施加力与扭矩,并利用C#脚本实现玩家输入逻辑,完成一辆可操控、能碰撞的物理驱动汽车。文中重点探讨了AddForce与角速度控制两种方案

weixin_34380948的博客 501

Binder线程处理请求

一、用户空间创建Binder线程 startThreadPool调用流程: 调用方法: ProcessState::self()->startThreadPool(); 1、startThreadPool()的主要作用是:(ProcessState.cpp) 调用spawnPooledThread( true) 2、spawnPooledThread

barbie gan的专栏 2030

IPMItool 控制风扇转速

然后手动设置风扇,最后一位0x1e为设置30%的转速(16进制)。最后4位 0x0f 表示15%,0x0a,表示10%,不建议小于10%,因为10%已经很静音了 如果再小怕不能控温,烧毁硬件。首先停止服务器的自动风扇控制,最后一位0x00表示停止自动风扇控制,0x01为开启自动风扇控制。首先开启主板上的ipmi 设置好 用户名密码。此过程可以在网上搜索,有很多的资料可以参考。解压只有在目录里面有ipmltool。下面是一些常用的修改温度命令。

m0_37970303的博客 5061

Android中主线程、ActivityThread、ApplicationThread的区别

AMS → Binder驱动 → ApplicationThread(Binder线程池) → ActivityThread.H(主线程) → 组件生命周期。Android应用进程均由Zygote进程fork生成,继承Zygote预加载的类路径和资源(如Android框架类)。接收AMS的IPC调用(如启动Activity),转发给主线程Handler执行。,无消息时休眠释放CPU,有消息(如VSync信号、点击事件)时被唤醒。该进程承载主线程(即UI线程),负责运行。),默认最大线程数16。

qq_45906596的博客 1803

Qwen3-Embedding选型指南:0.6B/4B/8B三版本性能对比与场景匹配建议

本文深入解析阿里开源的Qwen3-Embedding系列模型(0.6B/4B/8B)的性能差异与适用场景,提供从边缘计算到云端部署的实战选型建议。通过实测数据对比响应延迟、内存占用和多语言精度等核心指标,帮助技术团队根据业务需求选择最优模型版本,并分享边缘设备优化与云端成本测算策略。

qsc901234567的博客 892

QGIS插件实战:用百度地图AOI数据做个城市公园分析,从下载到出图全记录

本文详细介绍了如何利用QGIS的百度地图AOI插件进行城市公园分析,从插件安装、数据获取到空间分析与可视化全流程。通过实战案例演示了公园面积统计、服务范围缓冲区分析及专题地图制作,帮助用户高效完成城市绿地评估工作。

weixin_30790841的博客 556

搞懂Android应用启动过程,再也不怕面试官了

文章会持续更新的。绝对干货!!!Android进阶学习全套手册关于实战,我想每一个做开发的都有话要说,对于小白而言,缺乏实战经验是通病,那么除了在实际工作过程当中,我们如何去更了解实战方面的内容呢?实际上,我们很有必要去看一些实战相关的电子书。

2401_84048586的博客 453

Mac用户必看:Typora最新版永久激活+弹窗屏蔽保姆级教程(附崩溃解决方案)

本文为Mac用户提供了一份详尽的Typora最新版永久激活与弹窗屏蔽教程。通过修改关键JS文件,实现软件激活状态并彻底关闭成功提示弹窗。文章深入剖析了操作原理,并重点提供了解决由此引发的多文档崩溃问题的实用临时方案,同时客观讨论了该方法的局限性与潜在风险。

wine的专栏 2370

深入Android架构(从线程到AIDL)_09 认识Android的主线程

当我们启动某一支AP时, Android就会诞生新进程(Process),并且将该AP程序加载这新诞生的进程里。每个进程在其诞生时刻,都会诞生一个主线程,又称为UI线程。

soarfeng的专栏 1168

Qt Creator牵手DeepSeek,开启AI开发新征程

Qt Creator 是一款功能强大的跨平台集成开发环境(IDE),专为 Qt 应用程序开发量身定制。它支持在编程过程中使用 GitHub Copilot 等编码助手,能帮助开发者为桌面、移动端和嵌入式平台创建软件。在代码编辑方面,Qt Creator 具备代码补全、语法突出显示、重构等功能,内置文档也随手可得,极大提高了代码编写的效率和准确性。

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 7189

【测开求职】面试题:JAVA 吐血整理

本篇文章包含本次测开工程师秋招过程中遇到的所有JAVA面试题,全文两万字,亲测应对各个大厂的面试毫无压力👉

vector的博客 1211

Android 应用程序的启动流程

1.启动进程 点击桌面应用,startActivity()函数最终是由Instrumentation通过Android的Binder跨进程通信机制 发送消息给 system_server 进程;在 system_server 中,启动进程的操作由ActivityManagerService 通过 socket 通信告知 Zygote 进程 fork 子进程(app进程) 开启主线程app 进程启动后,首先是实例化 ActivityThread,并执行其main()函数:创建 ApplicationThre

Chents 824

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Framework - ActivityThread 应用启动UI渲染流程

拥有 main(String[] agrs) 方法,作为程序的入口,是应用程序的初始化类。

HugMua的博客 943

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

安卓app应用启动流程详解,整个启动过程,复杂的底层交互,你知道多少?_用户点击app应用后最先加载的是

1、Zygote进程Android系统启动过程中,会先启动linux内核,然后加载init.rc文件,启动init进程。然后,init进程通过解析init.rc文件fork生成Zygote进程,该进程也是Android系统的首个Java进程。之后Zygote进程负责孵化System Server进程和APP进程。2、SystemServer进程由Zygote进程fork生成,SystemServer是Zygote孵化的第一个进程。

2401_84545468的博客 264

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

Android APP应用启动过程分析_android系统fork一个进程到application创建中间做了什么(1)

当我们点击手机桌面上的应用图标,到手机桌面显示出应用主Activity界面而完成应用启动,看似很简单的过程其实包含了复杂的底层交互。整个启动过程,涉及了Android系统的很多核心知识点。首先,手机桌面就是一个APP应用,名称叫Launcher,是手机厂商提供的,不同的手机厂商开发出了一套自己UI风格的展示桌面。我们点击Launcher桌面的APP应用图标,可以打开其他的APP应用。APP应用的启动过程,分为冷启动和热启动两种。

2401_86391812的博客 1494

android的进程/线程的管理

进程(process)是程序运行的一个实例,以区别于程序这一个静态的概念; 线程:是CPU的调度单位 android中的进程从配置文件mainfest.xml里面有所体现application,四大组件都是他的零件 (1)一个Activity启动后,会出现三个线程  一个activitythread   两个Binder线程 主线程由ZygoteInit启动 (2)Service的启动过

骑毛驴进城28天 306

总结--应用程序进程启动过程

首先要想启动一个应用程序,要保证这个应用程序锁需要的应用进程已经启动。 Zygote的java框架层中会创建一个Server端的Socket,这个Socket用来等待AMS请求Zygote来创建新的应用程序进程,Zygote通过fock自身创建应用程序进程,这样应用程序进程就会获得Zygote进程再启动时创建的虚拟机实例,除了获取虚拟机实例外,还创建了Binder线程池和消息循环,这样运行在应用...

shaoenxiao的博客 788

【Android 性能优化】应用启动优化 ( Perfetto 系统级追踪 | 结合启动流程分析 Trace 文件 )

本文详细介绍了如何使用Perfetto进行Android应用启动性能优化,包括系统级追踪、Trace文件分析和启动流程优化。通过实际案例展示了如何识别和解决启动过程中的性能瓶颈,如Binder通信耗时和CPU资源竞争,帮助开发者显著提升应用启动速度。

weixin_30873847的博客 361

Activity进程和线程之间的关系

1,四大组件并不是程序(进程)的全部,只是他的零件。 2,应用程序启动后,将创建ActivityThread主线程。 3,同一包中的组件将运行在想通的进程空间里面。 4,不同包中的组件可以通过一定的方式运行在同一个进程控件里面。(在配置文件相应组件里面设置android:process属性表明运行在那个进程里面)。 5,一个Activity应用启动后至少会有3个线程:主线程+两个Binde...

weixin_33720956的博客 183

Android Framework-Android进程/线程和程序内存优化

对《深入理解Android内核设计思想(第2版)》Android进程/线程和程序内存优化 进行整理

jifashihan的博客 849

Android Activity的启动流程分析-AMS和ActivityThread Binder通讯模型

文章目录 需要了解

yaoming168的专栏 515
上一篇: 去掉系统原生模块的一种新方法
freerunnig
博客等级 码龄17年 12粉丝 18原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值