Android FrameWork AMS+WMS+PMS详解(上)

本文详细介绍了Android系统的启动过程,从Linux内核启动到用户空间的init进程,再到Zygote进程及SystemServer进程的创建。重点分析了Zygote进程如何孵化SystemServer进程,并深入探讨了SystemServer进程中AMS、PMS和WMS等核心组件的创建过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.Android 系统启动过程

 

1.图解

从下层到上层共包括四层,分别是linux内核层、系统运行库层、应用框架层和应用层。

 

 

2.启动过程

<1> 启动bootloader。

<2> 加载系统内核。

<3> 启动init进程。

<4> 继续。

 

第一二步都是Linux内核相关的知识。这里暂时不说。咱们从第三部 启动init进程 起讲起。

 

 

 

 

 

 

二.init进程&Zygote进程&SystemServer进程

 

1.简介

init进程是Linux内核启动完成后在用户空间启动的第一个进程。主要负责初始化工作、启动属性服务、解析init.rc文件。并启动Zygote进程

Zygote进程是一个进程孵化器,负责创建虚拟机实例应用程序进程、系统服务进程等等。

Zygote进程是使用socket来进行跨进程通信的,所以会创建一个名为zygote的socket。

init进程启动后,通过fork和execve来启动Zygote进程。

然后app_main.cpp中(frameworks/base/cmds/app_process/app_main.cpp)

//启动Zygote,进入ZygoteInit.main函数
runtime.start("com.android.internal.os.ZygoteInit", args, zygote);

这样 就到了Java层的代码的ZygoteInit类。路径如下

com.android.internal.os.ZygoteInit

 

ZygoteInit类 main方法部分源码(XXX\Android\Sdk\sources\android-30\com\android\internal\os)

public static void main(String argv[]) {



    //初始化native方法
    Zygote.initNativeState(isPrimaryZygote);


    //是否要创建SystemServer
    boolean startSystemServer = false;

    String socketName = "zygote";
    String abiList = null;
    boolean enableLazyPreload = false;
    for (int i = 1; i < argv.length; i++) {
        if ("start-system-server".equals(argv[i])) {
            startSystemServer = true;
        } else if ("--enable-lazy-preload".equals(argv[i])) {
            enableLazyPreload = true;
        } else if (argv[i].startsWith(ABI_LIST_ARG)) {
            abiList = argv[i].substring(ABI_LIST_ARG.length());
        } else if (argv[i].startsWith(SOCKET_NAME_ARG)) {
            socketName = argv[i].substring(SOCKET_NAME_ARG.length());
        } else {
            throw new RuntimeException("Unknown command line argument: " + argv[i]);
        }
    }

    
    //fork并启动SystemServer进程
    if (startSystemServer) {
        
        Runnable r = forkSystemServer(abiList, zygoteSocketName, zygoteServer);
     
    }




}

也就是说,ZygoteInit类 main方法 核心功能是 执行 forkSystemServer方法

 

forkSystemServer方法部分源码

private static Runnable forkSystemServer(String abiList, String socketName,
            ZygoteServer zygoteServer) {




      String args[] = {
                "--setuid=1000",
                "--setgid=1000",
                "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1018,1021,1023,"
                        + "1024,1032,1065,3001,3002,3003,3006,3007,3009,3010,3011",
                "--capabilities=" + capabilities + "," + capabilities,
                "--nice-name=system_server",
                "--runtime-args",
                "--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,
                "com.android.server.SystemServer",
        };



      parsedArgs = new ZygoteArguments(args);

}

也就是说 forkSystemServer方法 核心功能是通过   com.android.server.SystemServer  启动SystemServer进程  

 

 

小结1

到这里   init进程    到   Zygote进程(Socket通信)      SystemServer进程

 

 

 

下面我们看一下SystemServer类。

 

SystemServer类部分源码(XXX\Android\Sdk\sources\android-30\com\android\server)

public final class SystemServer {

    //上下文对象
    private Context mSystemContext;

    //系统管理 用来生成 AMS    WMS和PMS都是通过自己类的main方法获取的
    private SystemServiceManager mSystemServiceManager;
    
    //AMS
    private ActivityManagerService mActivityManagerService;
    
    //WMS
    private WindowManagerGlobalLock mWindowManagerGlobalLock;
    
    //PMS
    private PackageManagerService mPackageManagerService;


   public static void main(String[] args) {
       new SystemServer().run();
   }

   
   private void run() {
    
     
     //创建系统上下文
     createSystemContext();

     //创建系统Manager
     mSystemServiceManager = new SystemServiceManager(mSystemContext);
            mSystemServiceManager.setStartInfo(mRuntimeRestart,
                    mRuntimeStartElapsedTime, mRuntimeStartUptime);
     //启动根服务
     startBootstrapServices();
    
     //启动核心服务
     startCoreServices();
    
     //启动其他服务
     startOtherServices();

   }




    //创建系统上下文 实际上是创建ActivityThread类
    private void createSystemContext() {
        ActivityThread activityThread = ActivityThread.systemMain();
        mSystemContext = activityThread.getSystemContext();
        mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);

        final Context systemUiContext = activityThread.getSystemUiContext();
        systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
    }



    //启动根服务
    private void startBootstrapServices(@NonNull TimingsTraceAndSlog t) {
    
       //创建AMS
       mActivityManagerService = ActivityManagerService.Lifecycle.startService(
                mSystemServiceManager, atm);
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);


       //创建PMS
       mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
       mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
      
    }


    //启动核心服务
    private void startCoreServices(@NonNull TimingsTraceAndSlog t) {

       mActivityManagerService.setUsageStatsManager(
                LocalServices.getService(UsageStatsManagerInternal.class));

    }


    //启动其他服务
    private void startOtherServices(@NonNull TimingsTraceAndSlog t) {
       
       //AMS准备就绪
       mActivityManagerService.systemReady()

       //创建WMS
       WindowManagerService wm = null;
       wm = WindowManagerService.main(context, inputManager,
                    mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
                    !mFirstBoot, mOnlyCore, new PhoneWindowManager());

    }


}


 

 

小结2

由此可见,SystemServer类核心功能有

<1> 创建系统上下文对象。详解如下。

<2> 创建SystemServiceManager对象使用该对象 创建下面的 AMS

<3> 创建ActivityManagerService对象。详解如下。

<4> 创建PackageManagerService对象。详解如下。

<5> 创建WindowManagerService对象。详解如下。

 

 

创建系统上下文方法详解

//SystemServer类的全局变量
private Context mSystemContext;

private void createSystemContext() {
    ActivityThread activityThread = ActivityThread.systemMain();
    mSystemContext = activityThread.getSystemContext();
    mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);

    final Context systemUiContext = activityThread.getSystemUiContext();
    systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
}

由此可见,此方法中。

<1> 调用ActivityThread类的systemMain()方法获取ActivityThread类对象。

<2> 调用ActivityThread类的getSystemContext()方法获取上下文对象。

 

 

小结3

<1> ActivityThread类的创建时机是SystemServer类的run方法。

<2> 创建ActivityThread类调用的是ActivityThread类的静态方法systemMain()。

 

ActivityThread类的静态方法systemMain()源码

public static ActivityThread systemMain() {
    // The system process on low-memory devices do not get to use hardware
    // accelerated drawing, since this can add too much overhead to the
    // process.
    if (!ActivityManager.isHighEndGfx()) {
         ThreadedRenderer.disable(true);
    } else {
        ThreadedRenderer.enableForegroundTrimming();
    }
    ActivityThread thread = new ActivityThread();
    thread.attach(true, 0);
    return thread;
}

 

 

创建SystemServiceManager对象方法详解

mSystemServiceManager = new SystemServiceManager(mSystemContext);

 

 

创建ActivityManagerService对象方法详解

SystemServer类中几个方法


//startBootstrapServices方法
private void startBootstrapServices() {


   mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);


 

   mActivityManagerService.initPowerManagement();



   mActivityManagerService.setSystemProcess();

}



//startCoreServices方法
private void startCoreServices() {

   
  
mActivityManagerService.setUsageStatsManager(LocalServices.getService(UsageStatsManagerInternal.class));

}



//startOtherServices方法
private void startOtherServices() {


   mActivityManagerService.installSystemProviders();

   final Watchdog watchdog = Watchdog.getInstance();
   watchdog.init(context, mActivityManagerService);

   mActivityManagerService.setWindowManager(wm);


   networkPolicy = new NetworkPolicyManagerService(context, mActivityManagerService,
                        networkManagement);


   mActivityManagerService.enterSafeMode();


   mActivityManagerService.showSafeModeOverlay();


   mPowerManagerService.systemReady(mActivityManagerService.getAppOpsService());

   
   mActivityManagerService.systemReady()

   
   mActivityManagerService.startObservingNativeCrashes();

}

 

 

 

小结4

<1> 使用 SystemServiceManager对象  创建ActivityManagerService对象

<2> 其他的讲解:https://blog.youkuaiyun.com/weixin_37730482/article/details/72846744

 

 

 

创建PackageManagerService对象方法详解

SystemServer类中几个方法


//isFirstBootOrUpgrade方法
private boolean isFirstBootOrUpgrade() {
    return mPackageManagerService.isFirstBoot() || mPackageManagerService.isUpgrade();
}



//startBootstrapServices方法
private void startBootstrapServices() {

   mPackageManagerService = PackageManagerService.main(mSystemContext, installer,
                mFactoryTestMode != FactoryTest.FACTORY_TEST_OFF, mOnlyCore);
   mFirstBoot = mPackageManagerService.isFirstBoot();



   OtaDexoptService.main(mSystemContext, mPackageManagerService);
}



//startOtherServices方法
private void startOtherServices() {

   mPackageManagerService.updatePackagesIfNeeded();


   mPackageManagerService.performFstrimIfNeeded();


   mPackageManagerService.systemReady();


   mPackageManagerService.waitForAppDataPrepared();


   
}

 

 

小结5

<1> 使用 PackageManagerService类的main方法创建PackageManagerService对象

<2> 其他的讲解:https://blog.youkuaiyun.com/weixin_37730482/article/details/72846744

 

 

 

 

创建WindowManagerService对象方法详解

SystemServer类中几个方法



//startOtherServices方法
private void startOtherServices() {



   WindowManagerService wm = null;


   wm = WindowManagerService.main(context, inputManager,
                    mFactoryTestMode != FactoryTest.FACTORY_TEST_LOW_LEVEL,
                    !mFirstBoot, mOnlyCore, new PhoneWindowManager());



   ServiceManager.addService(Context.WINDOW_SERVICE, wm, /* allowIsolated= */ false,
                    DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PROTO);



   mActivityManagerService.setWindowManager(wm);


   wm.onInitReady();

   
   inputManager.setWindowManagerCallbacks(wm.getInputMonitor());
   

   wm.displayReady();


   statusBar = new StatusBarManagerService(context, wm);


   final boolean safeMode = wm.detectSafeMode();


   wm.systemReady();


   final Configuration config = wm.computeNewConfiguration(DEFAULT_DISPLAY);


   
}

 

 

小结6

<1> 使用 WindowManagerService类的main方法创建WindowManagerService对象

<2> 其他的讲解:https://blog.youkuaiyun.com/weixin_37730482/article/details/72846744

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值