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

本文详细剖析了Android应用启动的过程,从AMS发送socket请求开始,经过Zygote处理请求,启动binder线程池,直到应用进程启动完成。重点讨论了Zygote如何处理socket请求,以及binder线程池的启动机制。通过对启动流程的了解,有助于开发者在面试中应对相关问题。
摘要由CSDN通过智能技术生成

简要回顾

先回顾一下Android系统的启动过程:

init进程fork出Zygote进程后,Zygote进程会创建一个服务端socket,等待AMS发起socket请求。

同时,由Zygote进程fork出的SystemServer进程会启动各项系统服务,其中就包含了AMS,AMS会启动Launcher桌面,此时就可以等待用户点击App图标来启动应用进程了。

然后看下系统服务的启动,不管是由init进程启动的独立进程的系统服务如SurfaceFlinger,还是由SystemServer进程启动的非独立进程的系统服务如AMS,都是在ServiceManager进程中完成注册和获取的,在跨进程通信上使用了Android的binder机制。

ServiceManager进程本身也是一个系统服务,经过启动进程、启动binder机制、发布自己和等待请求4个步骤,就可以处理其他系统服务的获取和注册需求了。

AMS发送socket请求

Android应用进程的启动是被动式的,在Launcher桌面点击图标启动一个应用的组件如Activity时,如果Activity所在的进程不存在,就会创建并启动进程。

点击App图标后经过层层调用会来到ActivityStackSupervisor的startSpecificActivityLocked方法。

//ActivityStackSupervisor.java
final ActivityManagerService mService;

void startSpecificActivityLocked(...) {
    //查找Activity所在的进程,ProcessRecord是用来封装进程信息的数据结构
    ProcessRecord app = mService.getProcessRecordLocked(...);
    //如果进程已启动,并且binder句柄IApplicationThread也拿到了,那就直接启动Activity
    if (app != null && app.thread != null) {
        realStartActivityLocked(r, app, andResume, checkConfig);
        return;
    }
    //否则,让AMS启动进程
    mService.startProcessLocked(...);
} 

app.thread并不是线程,而是一个binder句柄。应用进程使用AMS需要拿到AMS的句柄IActivityManager,而系统需要通知应用和管理应用的生命周期,所以也需要持有应用进程的binder句柄IApplicationThread。

也就是说,他们互相持有彼此的binder句柄,来实现双向通信。

那IApplicationThread句柄是怎么传给AMS的呢?Zygote进程收到socket请求后会处理请求参数,执行ActivityThread的入口函数main。

//ActivityThread.java
public static void main(String[] args) {
    //创建主线程的looper
    Looper.prepareMainLooper();
    //ActivityThread并不是线程,只是普通的java对象
    ActivityThread thread = new ActivityThread();
    //告诉AMS,应用已经启动好了
    thread.attach(false);
    //运行looper,启动消息循环
    Looper.loop();
}

private void attach(boolean system) {
    //获取AMS的binder句柄IActivityManager
    final IActivityManager mgr = ActivityManager.getService();
    //告诉AMS应用进程已经启动,并传入应用进程自己的binder句柄IApplicationThread
    mgr.attachApplication(mAppThread);
} 

所以对于AMS来说:

1.AMS向Zygote发起启动应用的socket请求,Zygote收到请求fork出进程,返回进程的pid给AMS;

2.应用进程启动好后,执行入口main函数,通过attachApplication方法告诉AMS已经启动,同时传入应用进程的binder句柄IApplicationThread。

完成这两步,应用进程的启动过程才算完成。

下面看AMS的sta

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值