amsactivity启动流程详解(代码片段)

xyTianZhao xyTianZhao     2022-12-12     466

关键词:

文章目录

概述

ActivityManagerService(以后简称AMS)都有所耳闻。AMS 是 Android 中最核心的服务,主要负责系统中四大组件的启动、切换、调度及应用进程的管理和调度等工作,其职责与操作系统中的进程管理和调度模块相类似,因此它在 Android 中非常重要。先来看AMS的家族图谱

相关类说明

  • ActivityManagerService
    AMS由ActivityManagerNative(以后简称AMN)类派生,并实现Watchdog.Monitor和BatteryStatsImpl.BatteryCallback接口。而AMN由Binder派生,实现了IActivityManager接口
  • ActivityManager
    由于AMS是系统核心服务,很多API不能开放供客户端使用,所以设计者没有让ActivityManager直接加入AMS家族。在ActivityManager类内部通过调用AMN的getDefault函数得到一个ActivityManagerProxy对象,通过它可与AMS通信

AMS 服务启动

PMS 启动 类似,AMS 服务也是在 系统引导服务中启动。

第一坨代码是创建并启动了 AMS ,第二坨是将 AMS 服务添加到SystemServer 中。

public final class SystemServer 
    private SystemServiceManager mSystemServiceManager;
    private void startBootstrapServices() 
        ......
        mActivityManagerService = mSystemServiceManager.startService(
                ActivityManagerService.Lifecycle.class).getService();
        mActivityManagerService.setSystemServiceManager(mSystemServiceManager);
        mActivityManagerService.setInstaller(installer);
        ......
        mActivityManagerService.setSystemProcess();
        ......
    

public class ActivityManagerService extends IActivityManager.Stub
        implements Watchdog.Monitor, BatteryStatsImpl.BatteryCallback 
    public void setSystemProcess() 
        ......
        ServiceManager.addService(Context.ACTIVITY_SERVICE, this, /* allowIsolated= */ true,
                    DUMP_FLAG_PRIORITY_CRITICAL | DUMP_FLAG_PRIORITY_NORMAL | DUMP_FLAG_PROTO);
        ......
    

public class SystemServiceManager 
    public SystemService startService(String className) 
        final Class<SystemService> serviceClass;
        try 
            //通过名字找到相应的 class
            serviceClass = (Class<SystemService>)Class.forName(className);
         catch (ClassNotFoundException ex) 
            Slog.i(TAG, "Starting " + className);
            throw new RuntimeException("Failed to create service " + className
                    + ": service class not found, usually indicates that the caller should "
                    + "have called PackageManager.hasSystemFeature() to check whether the "
                    + "feature is available on this device before trying to start the "
                    + "services that implement it", ex);
        
        return startService(serviceClass);
    
    public <T extends SystemService> T startService(Class<T> serviceClass) 
        try 
            final String name = serviceClass.getName();
            Slog.i(TAG, "Starting " + name);
            Trace.traceBegin(Trace.TRACE_TAG_SYSTEM_SERVER, "StartService " + name);

            // Create the service.
            if (!SystemService.class.isAssignableFrom(serviceClass)) 
                throw new RuntimeException("Failed to create " + name
                        + ": service must extend " + SystemService.class.getName());
            
            final T service;
            try 
                //创建相应的 class
                Constructor<T> constructor = serviceClass.getConstructor(Context.class);
                service = constructor.newInstance(mContext);
             catch (InstantiationException ex) 
                throw new RuntimeException("Failed to create service " + name
                        + ": service could not be instantiated", ex);
             catch (IllegalAccessException ex) 
                throw new RuntimeException("Failed to create service " + name
                        + ": service must have a public constructor with a Context argument", ex);
             catch (NoSuchMethodException ex) 
                throw new RuntimeException("Failed to create service " + name
                        + ": service must have a public constructor with a Context argument", ex);
             catch (InvocationTargetException ex) 
                throw new RuntimeException("Failed to create service " + name
                        + ": service constructor threw an exception", ex);
            

            startService(service);
            return service;
         finally 
            Trace.traceEnd(Trace.TRACE_TAG_SYSTEM_SERVER);
        
    

    public void startService(@NonNull final SystemService service) 
        // Register it.
        mServices.add(service);
        // Start it.
        long time = SystemClock.elapsedRealtime();
        try 
            //启动服务
            service.onStart();
         catch (RuntimeException ex) 
            throw new RuntimeException("Failed to start service " + service.getClass().getName()
                    + ": onStart threw an exception", ex);
        
        warnIfTooLong(SystemClock.elapsedRealtime() - time, service, "onStart");
    


Activity 启动流程

Activity 启动我们在熟悉不过了,我们就以 startActivity 为入口来梳理下。

前面没有什么过多代码,顺着走下去发现调用了 AMS 的 startActivity 方法。但是呢,AMS 是运行在系统进程中的,这里就用到了 Binder 进行 IPC 通信。

startActivity(new Intent(this,NewActivity.class));
public class Activity extends ContextThemeWrapper

    private Instrumentation mInstrumentation;

    public void startActivityForResult(@RequiresPermission Intent intent, int requestCode,
            @Nullable Bundle options) 
        ......
        Instrumentation.ActivityResult ar =
                mInstrumentation.execStartActivity(
                    this, mMainThread.getApplicationThread(), mToken, this,
                    intent, requestCode, options);
        ......
    

public class Instrumentation 
    public ActivityResult execStartActivity(
            Context who, IBinder contextThread, IBinder token, Activity target,
            Intent intent, int requestCode, Bundle options) 
        ......
        int result = ActivityManager.getService()
                .startActivity(whoThread, who.getBasePackageName(), intent,
                        intent.resolveTypeIfNeeded(who.getContentResolver()),
                        token, target != null ? target.mEmbeddedID : null,
                        requestCode, 0, null, options);
        ......
    

public class ActivityManager 
    public static IActivityManager getService() 
        return IActivityManagerSingleton.get();
    

    private static final Singleton<IActivityManager> IActivityManagerSingleton =
        new Singleton<IActivityManager>() 
            @Override
            protected IActivityManager create() 
                final IBinder b = ServiceManager.getService(Context.ACTIVITY_SERVICE);
                final IActivityManager am = IActivityManager.Stub.asInterface(b);
                    return am;
            
        ;

上面只贴了怎么从用户进程通过 Binder 调用系统进程的相关服务。系统进程服务处理完相应工作后,也通过 Binder 调用用户进程的启动服务,下面在贴出总体的调用链,大伙可以自己在跟一下后续的调用链。

redis详解(内部分享版)(代码片段)

...s为什么那么快?redis的发展史redis是如何运行的?启动流程精简流程处理tcp请求时间事件的产生单线程启动流程redis多线程启动流程redis存储的基本结构redis支持的数据类型string(sds)listsetzsetzadd添加数据流程跳 查看详情

redis详解(内部分享版)(代码片段)

...s为什么那么快?redis的发展史redis是如何运行的?启动流程精简流程处理tcp请求时间事件的产生单线程启动流程redis多线程启动流程redis存储的基本结构redis支持的数据类型string(sds)listsetzsetzadd添加数据流程跳 查看详情

linux系统移植:u-boot启动流程(下)(代码片段)

目录Linux系统移植:U-Boot启动流程(下)一、run_main_loop函数详解二、cli_loop函数详解三、cmd_process函数详解Linux系统移植:U-Boot启动流程(下)一、run_main_loop函数详解uboot启动以后会进入3秒倒计时,如果... 查看详情

fabric网络环境启动过程详解(代码片段)

这篇文章对fabric的网络环境启动过程进行讲解,也就是我们上节讲到的启动测试fabric网络环境时运行network_setup.sh这个文件的执行流程fabric网络环境启动过程详解上一节我们讲到fabric网络环境的启动测试,主要是使用./network_setup.shu... 查看详情

《嵌入式-深入剖析stm32》stm32启动流程详解(代码片段)

开发环境:处理器:STM32F103MDK:5.30STM32CubeMX:6.0.1对于我们常用的桌面操作系统而言,我们在开发应用时,并不关心系统的初始化,绝大多数应用程序是在操作系统运行后才开始运行的,操作系统已... 查看详情

pms启动apk安装流程详解(代码片段)

文章目录概述相关类说明PMS服务启动应用程序(APK)安装有界面安装无界面安装APK安装原理概述PackageManagerService(以下简称PMS)是一个常用的系统服务,主要负责系统中的Package的管理,应用程序的安装、... 查看详情

《嵌入式-深入剖析stm32》stm32启动流程详解(gcc)(代码片段)

开发环境:处理器:STM32F103GCC:10.3.1对于我们常用的桌面操作系统而言,我们在开发应用时,并不关心系统的初始化,绝大多数应用程序是在操作系统运行后才开始运行的,操作系统已经提供了一个合... 查看详情

《嵌入式-深入剖析stm32》stm32启动流程详解(gcc)(代码片段)

开发环境:处理器:STM32F103GCC:10.3.1对于我们常用的桌面操作系统而言,我们在开发应用时,并不关心系统的初始化,绝大多数应用程序是在操作系统运行后才开始运行的,操作系统已经提供了一个合... 查看详情

kafkaproducersender线程详解(含详细的执行流程图)(代码片段)

...送消息,本文将来探讨Kafka的Sender线程。在KafkaProducer中会启动一个单独的线程,其名 查看详情

java虚拟机详解02----jvm内存结构(代码片段)

主要内容如下:JVM启动流程JVM基本结构内存模型编译和解释运行的概念 一、JVM启动流程:JVM启动时,是由java命令/javaw命令来启动的。二、JVM基本结构:JVM基本结构图:《深入理解Java虚拟机(第二版)》中的描述是下面这个... 查看详情

centos系列启动流程详解(代码片段)

一、Linux启动内核文件1.Linux系统组成动态视角:内核+根文件系统静态视角:磁盘分区+相关文件2.Kernel特点(1)支持某块化:.ko(kernelobject)文件(2)支持模块运行时动态装载或卸载;总结:Linuxkernel在单内核设计模型上,吸取了多内核... 查看详情

linux系统移植:u-boot启动流程(上)(代码片段)

目录Linux系统移植:U-Boot启动流程(上)一、reset函数源码详解二、lowlevel_init函数详解三、s_init函数详解四、_main函数详解Linux系统移植:U-Boot启动流程(上)一、reset函数源码详解根据链接文件,可以... 查看详情

插件化开发详解(代码片段)

...件所有的class都位于宿主的类加载器里面,达到宿主可以启动插件的目的。 2:启动插件普通类代码流程:1)Pluginmodule:publicclassTestpublicintadd(inta,intb)returna+b;; 编译生成plugin.apk,放到sdk目录下2)Hostmodule:publicclassLoadUtilprivate... 查看详情

framework之activity启动流程(基于android11源码)(代码片段)

一步步看,你就会对activity的启动流程有深刻的认知。引言Android11上,Activity的启动流程与Android10的实现(可以参考Activity的启动过程详解(基于10.0源码))又不一样了,但是万变不离其中,变的更... 查看详情

31张图总结,一鼓作气学会“ui绘制流程详解(整体启动流程)”(代码片段)

...的绘制体系.UI整体的绘制体系思路及疑惑思路android程序启动—>Activity加载并完成生命周期—>setContentView—>图形绘制疑惑:1.Android程序是如何启动,Activity生命周期如何调用?2.在ActivityonCreate当中我们的setContentView是... 查看详情

springboot启动配置详解(代码片段)

SpringBoot启动(二)配置详解Spring系列目录(https://www.cnblogs.com/binarylei/p/10198698.html)SpringBoot配置文件加载顺序SpringBoot配置文件加载分析-ConfigFileApplicationListener一、SpringFramework配置略...二、SpringBoot配置2.1随机数配置name.valu 查看详情

androidbinder框架层详解(代码片段)

...如何注册服务到ServiceManager;Android系统服务管家servicemanager启动过程详解),接下来这篇文章我们就来分析下binder在framework层(Java层)的具体原理与实现,重点围绕Java层如何添加服务到系统中这一主题展开。这里 查看详情

rectmask2d详解(代码片段)

...其上层逻辑比较复杂,今天就按逻辑顺序进行分析。1)启动时通过ClipperRegistry.Register(this);将自己注册到RectMask2D的管理类ClipperRegistry中,便于后续统一调用(CLipperRegistry参与整个Canvas的运作流程,所以可以参考此文的流程图以及... 查看详情