当前位置:   article > 正文

Android内核分析-Android系统启动过程(四)_thread:main backtrace

thread:main backtrace


前言

在第三章,我们分析了SystemServer的启动流程,也概括性的描述了其启动后做了些什么事情,其中最重要的就是启动了很多SystemService,那么这个章节,我们来具体看看SystemServer进程是如何启动ActivityMangerService的。

SystemServer.run()

一、AMS/ATMS的启动前的一些工作

我们再来看下SystemServer的run方法:

public static void main(String[] args) {
   
    new SystemServer().run();
}
 
private void run() {
   
    ...
    //1.初始化 System Context
    createSystemContext(); 
 
    //2.创建 SystemServiceManager 对象,用来启动后面的服务
    mSystemServiceManager = new SystemServiceManager(mSystemContext); 
    mSystemServiceManager.setStartInfo(mRuntimeRestart,
            mRuntimeStartElapsedTime, mRuntimeStartUptime);
    //把SystemServiceManager添加到本地服务的全局注册表中
    LocalServices.addService(SystemServiceManager.class, mSystemServiceManager);
    // Prepare the thread pool for init tasks that can be parallelized
    //3.准备SystemServer的线程池
    SystemServerInitThreadPool.get();
    ...
    
    //4.启动服务
    startBootstrapServices();  //启动引导服务
    startCoreServices();       //启动核心服务
    startOtherServices();      //启动其他服务
    ...
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

看到这里可能有的同学有点模糊了,从前几个章节的介绍到现在,出现了SystemServer、ServiceManager、SystemServiceManger、SystemService,这里需要给同学们做个概念上的讲解:

SystemServer:这是一个进程,zygote fork的第一个进程,AMS等SystemService都在该进程运行。
SystemService:系统服务类的抽象基础类,AMS等服务往往都自身或内部类继承于该抽象类。
SystemServiceManger:这是一个创建服务实例,启动服务实例,管理服务实例的生命周期的一个类。
ServiceManager:这个类的主要职责是控制用户访问服务,控制服务是否可以使用这一接口(通过注册时的检查权限),只管理Service,并不负责创建和启动服务实例。

这里有篇博客做了比较详细说明:https://blog.csdn.net/b1480521874/article/details/79422909

好了,概念明确后,我们继续接着分析。

1.初始化 System Context:createSystemContext()

private void createSystemContext() {
   
    ActivityThread activityThread = ActivityThread.systemMain();
    
    //获取system context
    mSystemContext = activityThread.getSystemContext();
    //设置系统主题
    mSystemContext.setTheme(DEFAULT_SYSTEM_THEME);
 
    //获取systemui context
    final Context systemUiContext = activityThread.getSystemUiContext();
    //设置systemUI 主题
    systemUiContext.setTheme(DEFAULT_SYSTEM_THEME);
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14

在该方法中,主要完成了几件事:
1.创建了 ActivityThread
2.在ActivityThread中,初始化了 Instrumentation、System Context、Application
3.设置主题

ActivityThread.java

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对象
    ActivityThread thread = new ActivityThread();
    thread.attach(true, 0);
    return thread;
}


private void attach(boolean system, long startSeq) {
   
    mSystemThread = system;
    if (!system) {
   
        //应用进程的处理流程
        ...
    } else {
   
        //系统进程的处理流程,该情况只在SystemServer中处理
        //创建ActivityThread中的重要成员:Instrumentation、 Application 和 Context
        mInstrumentation = new Instrumentation();
        mInstrumentation.basicInit(this);
        
        //创建系统的Context,Context是Android中的一个抽象类,用于维护应用运行环境的全局信息
        //通过Context可以访问应用的资源和类,甚至进行系统级的操作,例如启动Activity、发送广播等
        ContextImpl context = ContextImpl.createAppContext(
                this, getSystemContext().mPackageInfo);
        
        //调用LoadedApk的makeApplication函数,Application类用于保存应用的全局状态
        mInitialApplication = context.mPackageInfo.makeApplication(true, null);
        mInitialApplication.onCreate();
    }
}

public ContextImpl getSystemContext() {
   
    synchronized (this) 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/277007
推荐阅读
相关标签
  

闽ICP备14008679号