Android14 Activity 启动过程详解 5 之创建目标 Activity 进程

152 阅读4分钟

通俗易懂讲解Android应用进程创建机制

一、进程创建的触发场景

想象你正在经营一家连锁奶茶店(Android系统),当顾客(用户)有以下需求时,就需要开设新的分店(进程):

  1. 首次打开App:相当于顾客第一次光顾,需要新建门店
  2. 启动独立服务:比如外卖专项服务,需要单独厨房(Service进程)
  3. 内容提供器共享:多家分店共享中央仓库(ContentProvider)
  4. 广播接收处理:限时活动需要临时快闪店(BroadcastReceiver)

二、进程创建的幕后流程(分六步详解)

1. 总部下令(AMS决策)

  • 当需要创建新进程时,系统大管家ActivityManagerService(AMS)会:

    • 检查目标应用是否已安装
    • 验证调用者权限
    • 确定目标进程名(如com.tencent.mm:push)

2. 联系中央厨房(Zygote通信)

  • AMS通过Socket向Zygote进程发送"孵化请求"

  • 请求包内容:

    json
    	{
    
    	  "app": "com.example.myapp",
    
    	  "uid": 10086,
    
    	  "targetSdk": 30,
    
    	  "seInfo": "default",
    
    	  "abi": "arm64-v8a"
    
    	}
    

3. 中央厨房孵化(Zygote进程)

  • Zygote像中央厨房般高效运作:

    java
    	// Zygote进程核心代码片段
    
    	public static Runnable runSelectLoop(String abiList) {
    
    	    while (true) {
    
    	        // 1. 监听Socket请求
    
    	        // 2. 解析进程参数
    
    	        // 3. 执行fork()系统调用
    
    	        pid = forkAndSpecializeCommon(...);
    
    	        
    
    	        if (pid == 0) {
    
    	            // 在子进程执行
    
    	            handleChildProc(...);
    
    	            zygoteInit(abiList, targetSdkVersion, seInfo, ...);
    
    	            return;
    
    	        }
    
    	    }
    
    	}
    
    • 预加载核心类(3000+常用类)
    • 初始化虚拟机
    • 配置运行时参数

4. 新店装修(进程初始化)

  • 新进程会执行标准化装修流程:

    mermaid
    	graph TD
    
    	A[fork子进程] --> B(初始化ClassLoader)
    
    	B --> C(加载系统服务)
    
    	C --> D(创建ApplicationThread)
    
    	D --> E(绑定AMS)
    
    	E --> F(执行ActivityThread)
    

5. 申请营业执照(Binder注册)

  • 新进程通过Binder向AMS报道:

    java
    	// ActivityThread核心代码
    
    	public final void attach(boolean system, long sequ) {
    
    	    // 创建进程记录
    
    	    ProcessRecord app = mProcessRecord;
    
    	    
    
    	    // 注册到AMS
    
    	    try {
    
    	        ActivityManagerNative.getDefault().attachApplication(mAppThread);
    
    	    } catch (RemoteException ex) {
    
    	    }
    
    	}
    

6. 正式开业(执行入口方法)

  • 最终执行Application的入口方法:

    java
    	// ApplicationThread核心逻辑
    
    	private void handleBindApplication(...) {
    
    	    // 1. 创建Application实例
    
    	    app = data.info.makeApplication(data.restrictedBackupMode, null);
    
    	    
    
    	    // 2. 初始化组件
    
    	    mInstrumentation.callApplicationOnCreate(app);
    
    	    
    
    	    // 3. 启动主Activity
    
    	    Activity a = mInstrumentation.newActivity(...);
    
    	    a.attach(...);
    
    	}
    

三、关键角色解析(奶茶店版)

系统组件角色比喻核心职责
Zygote中央厨房预置基础食材(类),快速孵化分店
AMS总部运营中心统筹所有分店运营
Process分店营业执照标识进程身份,记录资源使用
Application分店经理管理店内运营(初始化组件)
ActivityThread店长日志本记录生命周期事件

四、进程创建优化技巧(实战经验)

1. 冷启动优化

  • 预加载关键资源:

    xml
    	<!-- AndroidManifest.xml -->
    
    	<application
    
    	  android:name=".MyApplication"
    
    	  android:usesCleartextTraffic="true"
    
    	  android:largeHeap="true"
    
    	  android:vmSafeMode="true">
    
  • 使用异步初始化:

    java
    	public class MyApplication extends Application {
    
    	    @Override
    
    	    public void onCreate() {
    
    	        super.onCreate();
    
    	        new Thread(() -> {
    
    	            // 耗时初始化操作
    
    	        }).start();
    
    	    }
    
    	}
    

2. 进程保活策略

  • 使用1像素Activity保活(需谨慎):

    java
    	// 在Service中启动透明Activity
    
    	Intent intent = new Intent(this, KeepAliveActivity.class);
    
    	intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
    
    	startActivity(intent);
    
  • 配置前台服务:

    java
    	NotificationChannel channel = new NotificationChannel(...);
    
    	Notification notification = new Notification.Builder(this, channel.getId())
    
    	    .setContentTitle("后台服务")
    
    	    .setSmallIcon(R.drawable.ic_service)
    
    	    .build();
    
    	startForeground(1, notification);
    

3. 多进程通信优化

  • 使用AIDL接口:

    aidl
    	// IDataManager.aidl
    
    	package com.example.myapp;
    
    	interface IDataManager {
    
    	    void setData(in String key, in String value);
    
    	    String getData(in String key);
    
    	}
    
  • 配置共享UserId:

    xml
    	<manifest
    
    	  ...
    
    	  android:sharedUserId="com.example.shared">
    

五、系统级优化机制

  1. 进程复用策略

    • 相同uid的进程优先复用
    • 最近最少使用(LRU)算法管理进程缓存
    • 配置processLimit限制最大进程数
  2. 内存回收机制

    • OOM_ADJ分级管理:

      	FOREGROUND_APP_ADJ (0)
      
      	VISIBLE_APP_ADJ (100)
      
      	PERCEPTIBLE_APP_ADJ (200)
      
      	SERVICE_ADJ (300)
      
      	HOME_APP_ADJ (400)
      
      	BACKUP_APP_ADJ (500)
      
      	HEAVY_WEIGHT_APP_ADJ (600)
      
      	SERVICE_B_ADJ (700)
      
      	CACHED_APP_MIN_ADJ (900)
      
      	CACHED_APP_MAX_ADJ (1000)
      
    • 低于CACHED_APP_MIN_ADJ的进程可能被回收

  3. 启动加速技术

    • Zygote预加载优化
    • 进程快照(Snapshots)技术
    • 预分配虚拟机实例

六、设计哲学总结

  1. 安全边界设计

    • 每个进程拥有独立虚拟机实例
    • 通过Binder进行跨进程通信
    • 权限分级管理(签名/系统/普通)
  2. 性能平衡艺术

    • 冷启动(全新进程)vs 热启动(复用进程)
    • 内存占用与响应速度的权衡
    • 进程优先级与系统负载的动态调整
  3. 可扩展架构

    • 通过Intent Filter实现组件解耦
    • 支持多进程架构(android:process)
    • 提供丰富的进程间通信机制(AIDL/Messenger/Bundle)

通过这种精心设计的进程创建机制,Android系统实现了:

  • 百万级应用的高效管理
  • 跨应用组件的无缝协作
  • 资源消耗与用户体验的完美平衡

理解这些底层机制,可以帮助开发者:

  1. 优化应用启动速度(提升30%+)
  2. 设计合理的多进程架构
  3. 避免进程相关的稳定性问题
  4. 实现更高效的后台服务

参考资料