Android 面试 | Android应用启动过程

871 阅读3分钟

Android应用启动过程

Android应用启动过程是一个涉及多个系统组件和底层框架的复杂过程。本文将尽量以简化的方式阐述Android应用启动过程的各个关键阶段,我会从最简单明了的流程图和伪代码了解大概的过程;

先看流程图:

未命名文件 (1).png

一、Android应用启动过程

  1. 启动器(Launcher)发起启动请求:用户点击应用图标后,启动器通过startActivity()方法发起启动请求。
  2. ActivityManagerService处理启动请求:请求传递给AMS,它负责检查合法性等。
  3. 创建新的Task和ActivityRecord:AMS创建Task和ActivityRecord来跟踪管理Activity状态。这一步在我的另外一篇文章描述 Activity启动流程 中有介绍到,感兴趣可以去看看;
  4. 调度Activity启动:AMS将启动请求加入消息队列,由主线程处理。
  5. 启动应用进程:如果应用进程未运行,AMS通过Zygote进程创建新进程。
  6. 创建Activity实例:新进程启动后,创建Application和Activity实例,并调用生命周期方法。
  7. 创建和显示Activity界面onResume()方法被调用,Activity界面创建并显示。
  8. 完成启动:Activity界面显示后,启动过程结束,应用开始运行。

伪代码结合流程图,基本是一目了然。


// 伪代码:Android应用启动过程
// 伪代码主流程
public static void main(String[] args) {
    Launcher launcher = new Launcher();
    String packageName = "com.example.myapp";
    startApp(launcher, packageName);
    // 后续流程由系统自动处理
}

// 启动器(Launcher)发起启动请求
void startApp(Launcher launcher, String packageName) {
    Intent intent = new Intent();
    intent.setComponent(new ComponentName(packageName));
    launcher.startActivity(intent);
}

// ActivityManagerService处理启动请求
void handleStartActivity(ActivityManagerService AMS, Intent intent) {
    if (AMS.isIntentValid(intent)) {
        AMS.createTaskAndActivityRecord(intent);
        AMS.scheduleActivityStart();
    }
}

// 创建新的Task和ActivityRecord
void createTaskAndActivityRecord(ActivityManagerService AMS, Intent intent) {
    Task task = new Task();
    ActivityRecord activityRecord = new ActivityRecord(intent);
    AMS.addTask(task);
    AMS.addActivityRecord(task, activityRecord);
}

// 调度Activity启动
void scheduleActivityStart(ActivityManagerService AMS) {
    AMS.addToMessageQueue(activityRecord);
}

// 主线程处理消息队列中的启动请求
void handleMessageQueue(ActivityManagerService AMS) {
    while (AMS.hasMessagesInQueue()) {
        ActivityRecord activityRecord = AMS.getNextActivityRecord();
        AMS.startApplicationProcess(activityRecord);
    }
}

// 启动应用进程
void startApplicationProcess(ActivityManagerService AMS, ActivityRecord activityRecord) {
    if (!AMS.isAppProcessRunning(activityRecord)) {
        ZygoteProcess.startNewAppProcess(activityRecord);
    }
    AMS.createActivityInstance(activityRecord);
}

// 创建Activity实例
void createActivityInstance(ActivityManagerService AMS, ActivityRecord activityRecord) {
    Application app = new Application();
    Activity activity = new Activity();
    activity.onCreate();
    activity.onStart();
    activity.onResume();
}

// 创建和显示Activity界面
void createAndShowActivityUI(Activity activity) {
    // 设置布局、初始化视图等
    activity.setContentView(R.layout.main);
    // 处理用户输入等
    activity.updateUI();
}

// 完成启动
void completeStart(Activity activity) {
    // Activity界面显示完成
    activity.isRunning = true;
    // 用户可以与应用互动
}



二、关于应用启动过程中各个角色的介绍

  1. Zygote进程:所有应用进程的父进程,预加载Android框架类和资源,快速创建新进程。
  2. ActivityManagerService(AMS):管理系统中的应用进程和Activity,包括生命周期管理。
  3. System Server进程:启动和管理系统服务,如AMS、WMS、PMS等。
  4. Binder机制:Android系统中的跨进程通信机制,基于对象的通信,使用代理模式。

计划是下一篇再完整的讲讲Zygote进程和Binder的一些特殊联系,如果需要请关注点赞,我会尽快更新~

以后每两天之内更新一道Android常见的面试题,以自己的角度去通俗简单易懂形式去说,不深入源码但讲基本原理,以伪代码为核心;如果你比较想问什么问题,可以评论。