Android系统启动过程分析

425 阅读2分钟

主要流程

  1. Zygote进程:android系统的根进程,主要作用:可以作用Zygote进程fork出SystemServer进程和各种应用进程。

  2. SystemService进程:主要是在这个进程中启动系统的各项服务,比如ActivityManagerService,PackageManagerService,WindowManagerService服务等等。

  3. Launcher桌面程序:就是我们平时看到的桌面程序,它其实也是一个android应用程序,只不过这个应用程序是系统默认第一个启动的应用程序.SystemService进程启动后,由Zygote进程创建。

Zygote是怎么启动的?

  • init进程fork出zygote进程
  • 启动虚拟机,注册jni函数(为切换java做准备)
  • 预加载系统资源
  • 启动SystemServer
  • 进入Socket Loop

SystemServer是怎么启动的?

/frameworks/base/core/java/com/android/internal/os/ZygoteInit.java:

private static boolean startSystemServer(String abiList, String socketName)
            throws MethodAndArgsCaller, RuntimeException {
        String args[] = {
            "com.android.server.SystemServer",//启动类 SystemServer
        };
        pid = Zygote.forkSystemServer(...);
        ZygoteConnection.Arguments parsedArgs = null;
        handleSystemServerProcess(parsedArgs);
        return true;
    }
    
private static void handleSystemServerProcess(...) {
        ...
        RuntimeInit.zygoteInit(parsedArgs.targetSdkVersion, parsedArgs.remainingArgs, cl);
}

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

public static final void zygoteInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
            throws ZygoteInit.MethodAndArgsCaller {
        commonInit();//常规初始化
        nativeZygoteInit();//启用binder机制,启用binder线程
        applicationInit(targetSdkVersion, argv, classLoader);//调用java类SystemServer的入口函数
    }
private static void applicationInit(int targetSdkVersion, String[] argv, ClassLoader classLoader)
            throws ZygoteInit.MethodAndArgsCaller {
        invokeStaticMain(args.startClass, args.startArgs, classLoader);
    }

/frameworks/base/services/java/com/android/server/SystemServer.java

private static final long SNAPSHOT_INTERVAL = 60 * 60 * 1000; // 1hr
public static void main(String[] args) {
        new SystemServer().run();
    }

public SystemServer() {
        // Check for factory test mode.
        mFactoryTestMode = FactoryTest.getMode();
    }
private void run() {
        Looper.prepareMainLooper();
        // 加载“android_servers.so”库,该库包含源码在frameworks/base/services/目录下
        // Initialize native services.
        System.loadLibrary("android_servers");
        //初始化系统Context
        createSystemContext();
        //Start services.
        //启动各种系统服务
        startBootstrapServices();//启动引导服务
        startCoreServices();//启动核心服务
        startOtherServices();
        
        Looper.loop();
    }

系统服务怎么发布的,让应用程序可见?

/frameworks/base/services/core/java/com/android/server/SystemService.java

 protected final void publishBinderService(String name, IBinder service) {
     publishBinderService(name, service, false);
 }
//用同名的publishBinderService,多了一个参数
 protected final void publishBinderService(String name, IBinder service,
         boolean allowIsolated) {
     ServiceManager.addService(name, service, allowIsolated);
 }
  • 最后还是将系统服务的Binder注册到ServiceManager 来实现的,SystemService只是做简单的封装。

系统服务跑在什么线程?

  1. 工作线程
  2. binder线程

系统服务如何解决相互依赖的?

  1. 分批启动(上层Service先启动)
  2. 分阶段启动(告诉已经启动的Service到了什么阶段可以做哪些初始化)

Launcher 启动

ActivityManagerService.java

public void systemReady(...) {
    startHomeActivityLocked(currentUserId, "systemReady");
}

packages\apps\Launcher2\src\com\android\launcher2\LauncherModel.java

public void startLoader(Context context, boolean isLaunching) {
        ...
        //LoaderTask初始化
        mLoaderTask = new LoaderTask(context, isLaunching);
        sWorker.post(mLoaderTask);
        ...
}

PackageManager.java

public abstract List<ResolveInfo> queryIntentActivitiesAsUser(Intent intent,
            @ResolveInfoFlags int flags, @UserIdInt int userId);

参考