Android中一个应用进程是怎么样启动的?

Android应用进程启动流程解析
1. 触发进程启动

应用进程的启动通常由以下场景触发:

  • 用户点击桌面图标:启动主Activity。

  • 启动其他组件:如Service、BroadcastReceiver、ContentProvider。

  • 跨进程调用:其他应用通过Binder调用需创建新进程。

核心入口为 ActivityManagerService (AMS),负责统一调度进程生命周期。


2. AMS分配进程与权限校验

当组件需要启动时,AMS执行以下关键步骤:

  1. 进程检查

    • 若目标应用进程已存在(如后台保活),直接复用。

    • 若不存在,进入创建流程。

  2. 权限校验

    • 检查调用方权限(如START_ACTIVITY权限)。

    • 验证目标组件的AndroidManifest声明(如<activity>exported属性)。

  3. 进程分配决策

    • 根据android:process属性决定是否创建独立进程(默认与包名相同)。


3. 向Zygote发起进程创建请求

AMS通过Socket通信向Zygote发起进程创建:

  1. 构造启动参数

    • 目标类名:android.app.ActivityThread

    • 应用信息:包名、用户ID、APK路径等。

    • 虚拟机参数:堆大小、JNI库路径等。

  2. Socket通信

    • AMS通过LocalSocket向Zygote进程(/dev/socket/zygote)发送请求数据。

    • Zygote主线程通过ZygoteServer.runSelectLoop()接收请求。


4. Zygote fork子进程

Zygote收到请求后,执行以下操作:

  1. 解析参数

    • 验证UID/GID权限,确保安全隔离。

  2. fork子进程

    • 调用fork()创建子进程,继承Zygote预加载的类、资源及虚拟机状态。

  3. 子进程特化

    • 关闭无用资源:如父进程的Socket连接。

    • 设置进程名:com.example.app(通过Process.setArgV0())。

    • 调用ActivityThread.main():进入应用进程主逻辑。


5. 应用进程初始化

子进程执行ActivityThread.main(),完成以下初始化:

  1. 绑定到AMS

    • 通过attachApplication()将进程信息注册到AMS,建立Binder通信链路(IApplicationThread)。

  2. 创建Application对象(由AMS发送bindApplication后调用)

    • 反射创建目标应用类(android.app.Application)。

    • 调用Application.onCreate()生命周期。

  3. 启动目标组件

    • AMS通过Binder通知应用进程启动目标组件(如Activity的onCreate())。

    • 主线程初始化Looper,进入消息循环(Looper.loop())。

Q1:为什么Android用Zygote fork进程而不是直接启动新进程?

  • :Zygote预加载公共资源(类、主题、库),fork可继承这些资源,节省内存和启动时间。

Q2:应用进程如何绑定到AMS?

  • :通过ActivityThread.attach()发送Binder句柄(IApplicationThread)给AMS,AMS通过此接口控制应用进程的生命周期。

Q3:AMS和zygote通信为什么不采用binder机制?

  • 1.Binder依赖ServiceManager注册:Binder通信需要服务端(Zygote)先在ServiceManager中注册Binder对象,客户端(AMS)才能通过ServiceManager获取其引用。然而,Zygote和ServiceManager均由Init进程启动,二者属于并行启动的独立进程,无法保证Zygote在启动时ServiceManager已就绪。若Zygote尝试注册Binder时ServiceManager尚未初始化完成,将导致注册失败,AMS无法通过Binder与Zygote通信。

  • 2.Socket的独立性:Socket通信不依赖ServiceManager,Zygote启动后直接监听Socket请求,无需等待其他服务初始化,避免了时序依赖问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

xzkyd outpaper

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值