Android应用程序建立与AMS服务之间的通信过程

     Android应用程序建立与AMS服务之间的通信过程


Android四大组件源码实现详解系列博客目录:

Android应用进程创建流程大揭秘
[Android四大组件之bindService源码实现详解
Android四大组件之Activity启动流程源码实现详解概要
Activity启动流程(一)发起端进程请求启动目标Activity
Activity启动流程(二)system_server进程处理启动Activity请求
Activity启动流程(三)-Activity Task调度算法复盘分析
Activity启动流程(四)-Pause前台显示Activity,Resume目标Activity
Activity启动流程(五)请求并创建目标Activity进程
Activity启动流程(六)注册目标Activity进程到system_server进程以及创建目标Activity进程Application
Activity启动流程(七)初始化目标Activity并执行相关生命周期流程
Android应用程序建立与AMS服务之间的通信过程

本篇博客编写思路总结和关键点说明:

在这里插入图片描述

为了更加方便的读者阅读博客,通过导读思维图的形式将本博客的关键点列举出来,从而方便读者取舍和阅读!



引言

  Android四大组件作为Android整个应用层框架的基石,其在Android中的地位是毋庸置疑的。而AMS(这里将ActivityManagerService简称AMS)做为四大组件启动,管理的核心服务却是运行在system_server进程中的,而我们的四大组件的启动和管理,更有甚者我们四大组件所在应用程序的创建都离不开和AMS服务之间的跨进程交互过程。那么这两个进程之间是怎么进行跨进程通信的呢,我想如果对于Android有一定了解的读者肯定会脱口而出通过Binder通信,是的应用程序和AMS服务之间正是通过Binder进行通信的!而我们今天的博客将会重点分析二者之间是如何建立Binder通信逻辑的,即:

我们知道Binder通信有一个特点就是通常只能Binder客户端请求Binder服务端,而不能反过来(注意这里的措辞是通常)!所以通常Binder客户端和服务端之间想建立相互通信的关系,会借助匿名Binder,而我们这里的AMS和应用程序之间也是如此!

  • Android应用程序以及关联的四大组件建立和AMS的Binder通信
  • AMS建立和应用程序及四大组件的Binder通信

注意:本篇的介绍是基于Android 7.xx平台为基础的,其中涉及的代码路径如下:

frameworks/base/services/core/java/com/android/server/am/
  --- ActivityManagerService

frameworks/base/core/java/android/app/
	---Activity.java
	---ActivityThread
	---ApplicationThreadNative.java
	---IApplicationThread.java
	---ActivityManagerNative.java
	---IActivityManager.java

并且在后续的源码分析过程中为了简述方便,会将做如下简述:

  • ApplicationThreadProxy简称为ATP
  • ActivityManagerProxy简称为AMP
  • ActivityManagerService简称为AMS
  • ActivityManagerNative简称AMN
  • ApplicationThreadNative简称ATN

在正式开始分析前,我们先奉上Android应用程序和AMS之间跨进程Binde通信交互图,也许下面的图就能给读者灵感,不待我分析就知道了今天的主题Android应用程序建立与AMS服务之间的通信过程了。
在这里插入图片描述



一.Android应用程序以及关联的四大组件建立和AMS的Binder通信

在正式开始相关的的分析之前,将要涉及到涉及到Context的继承关系类图,从下面的类图中可以看出,Context是一个接口(提供了很多的接口方法),ContextImp和ContextWrapper都是其实现类,我们常用的Activity、Service、Application都直接或间接继承自ContextWrapper。

在这里插入图片描述


1.1 Android应用层获取Framework层AMS核心服务对外接口类ActivityManager

  AMS做为Android Framework层的Binder核心服务,它被注册到了servicemanager服务大管家里面,并且也和其它核心服务一样在Android Framework的框架层提供了对应的SDK接口供应用程序调用AMS服务,而我们这里以在应用程序的Activity或者其子类中获取AMS服务对外提供接口类为例说明:


ActivityManager mActivityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

注意这里我们只是为了演示,其实Context上下文已经为了提供了关于使用AMS服务的相关封装接口,譬如startActivity()等

这里我们通过上面的类图关系知道getSystemService()方法最终会调用到ContextThemeWrapper类的getSystemService中,源码如下:

//[ContextThemeWrapper.java]
    @Override
    public Object getSystemService(String name) {
        if (LAYOUT_INFLATER_SERVICE.equals(name)) {
            if (mInflater == null) {
                mInflater = LayoutInflater.from(getBaseContext()).cloneInContext(this);
            }
            return mInflater;
        }
        return getBaseContext().getSystemService(name);
    }

	//[ContextWrapper.java]
    public Context getBaseContext() {
        return mBase;//注意这里的mBase指向了ContextImpl类
    }

从上面的代码可以看到getSystemService()方法最终都调用到了ContextImpl类中,而至于mBase为什么指向了ContextImpl实例,这里就不过多篇幅分析了可以参见博客初始化目标Activity并执行相关生命周期流程的2.3章节,这里我们直接来看ContextImpl中getSystemService()的实现,如下:

//[ContextImpl.java]
    @Override
    public Object getSystemService(String name) {
        return SystemServiceRegistry.getSystemService(this, name);
    }

这里又来了一个SystemServiceRegistry类,我们接着继续分析看看它的处理逻辑!

//[SystemServiceRegistry.java]
    private static final HashMap<Class<?>, String> SYSTEM_SERVICE_NAMES =
            new HashMap<Class<?>, String>();
    private static final HashMap<String, ServiceFetcher<?>> SYSTEM_SERVICE_FETCHERS =
            new HashMap<String, ServiceFetcher<?>>();
    public static Object getSystemService(ContextImpl ctx, String name) {
        ServiceFetcher<?> fetcher = SYSTEM_SERVICE_FETCHERS.get(name);
        return fetcher != null ? fetcher.getService(ctx) : null;
    }

好像很简单额,直接从SYSTEM_SERVICE_FETCHERS哈希列表中根据服务名称进行查找,这里我们看下SYSTEM_SERVICE_FETCHERS是啥时候被填充的,我们接着查找:

//[SystemServiceRegistry.java]
    private static <T> void registerService(String serviceName, Class<T> serviceClass,
            ServiceFetcher<T> serviceFetcher) {
        SYSTEM_SERVICE_NAMES.put(serviceClass, serviceName);
        SYSTEM_SERVICE_FETCHERS.put(serviceName, serviceFetcher);
    }

可以看到在registerService()方法中注册了一系列的服务,我接着继续查找看看那里调用了它!

//[SystemServiceRegistry.java]
    static {
	    // Not instantiable.
	    private SystemServiceRegistry() { }
    	...
    	registerService(xxx);
    	registerService(Context.ACTIVITY_SERVICE, ActivityManager.class,
                new CachedServiceFetcher<ActivityManager>() {
            @Override
            public ActivityManager createService(ContextImpl ctx) {
                return new ActivityManager(ctx.getOuterContext(), ctx.mMainThread.getHandler());
            }});
            
}

这里我们可以看到SystemServiceRegistry类的static静态方法区中注册了一系列的服务,而我们的ActivityManager实例对象也被注册到了里面,支持我们就可以使用AMS相关的服务了。而其它的Android Framework层核心服务也数通过上述方法进行注册,然后对外提供的。

不知道细心的读者注意到了没有这里的SystemServiceRegistry类,只有一个私有构造方法,那么说明他不能被实例化,那它是怎么被实例化的呢,或者说是怎么被加载然后执行static的静态区的注册方法呢,这个就要说我们我们的zygote预加载机制了,在Android Zygote进程启动源码分析指南的的2.3章节我们知道zygote进程会调用preload()方法中会通过反射预加载一些类,而这其中就包括我们的SystemServiceRegistry,而我们的Android应用程序进程是由zygote进程孵化的所以继承了zygote进程资源,所以它预加载的SystemServiceRegistry也被我们继承到了。

而我们知道zygote进程预加载的claess被定义在frameworks/base/preloaded-classes中,我们简单看下就找到了SystemServiceRegistry身影,如下:

在这里插入图片描述


1.2 Android应用层通过对外接口类ActivityManager使用AMS服务

  通过前面的一顿操作,我们获取到了AMS服务对外的接口类ActivityManager,在正式开始分析Android应用程序是怎么通过它使用AMS服务之间,我们先来看看AMS的整体类图框架图,如下:

在这里插入图片描述
好了前面1.1章节我们最后获取到了ActivityManager的实例对象,我们来看看其构造方法,如下:

//[ActivityManager.java]
    /*package*/ ActivityManager(Context context, Handler handler) {
        mContext = context;//感觉啥也没有做,根本没有和AMS搭上半毛钱关系
        mHandler = handler;
    }

尼玛,这里的ActivityManager感觉和AMS服务没有搭上半毛钱关系啊,是不是搞错了啊!当然不是了,这里我们随意抽取AcivityManager中的一个方法来看看,如下:

//[ActivityManager.java]
    public List<RunningServiceInfo> getRunningServices(int maxNum)
            throws SecurityException {
        try {
            return ActivityManagerNative.getDefault()
                    .getServices(maxNum, 0);
        } catch (RemoteException e) {
            throw e.rethrowFromSystemServer();
        }
    }

这里我们终于看到老熟人AMN了,这里牵涉到一个重要的方法AMN.getDefault(),其实它在我们的博客中 Android Binder框架实现之Java层获取Binder服务源码分析已经有详细的介绍和分析了,但是为了博客的连贯性还是简单过下(主要是为了不太熟悉的小伙伴们)。

	//ActivityManagerNative.java
    static public IActivityManager getDefault() {
        return gDefault.get();
    }

这里的gDefault是Singleton对象实例,而Singleton我们可以看到是一个模板类对象,并且提供了一个单例方法,其定义如下:

//Singleton.java
public abstract class Singleton<T> {
    private T mInstance;

    protected abstract T create();

    public final T get() {
        synchronized (this) {
            if (mInstance == null) {//采用单例模式
                mInstance = create();
            }
            return mInstance;
        }
    }
}

我们将IActivityManager带入Singleton,得到如下的create方法过程:

	//ActivityManagerNative.java
    private static final Singleton<IActivityManager> gDefault = new Singleton<IActivityManager>() {
        protected IActivityManager create() {
        	//此处等价于IBinder b = new BinderProxy(new BpBinder(handle));
            IBinder b = ServiceManager.getService("activity");
            if (false) {
                Log.v("ActivityManager", "default service binder = " + b);
            }
			//此处等价于IActivityManager am = new ActivityManagerProxy(new BinderProxy(new BpBinder(handle)))
            IActivityManager am = asInterface(b);
            if (false) {
                Log.v("ActivityManager", "default service = " + am);
            }
            return am;
        }
    };

	//注意此处我们的入参是BinderProxy类型,所以会走代理端
    static public IActivityManager asInterface(IBinder obj) {
        if (obj == null) {
            return null;
        }
        IActivityManager in =
            (IActivityManager)obj.queryLocalInterface(descriptor);
        if (in != null) {
            return in;
        }
		//即会走到此处
        return new ActivityManagerProxy(obj);
    }

这里即最终经过层层转换得到了AMS服务的代理端ActivityManagerProxy,进而借助它完成对AMS服务的RPC请求。


1.3 Android应用程序以及关联的四大组件建立和AMS的Binder通信小结

  至此Android应用程序以及关联的四大组件建立和AMS的Binder通信就已经建立了,其主要核心流程就是先通过Context上下文环境获取ActivityManager,然后ActivityManager借助AMS的代理端AMP来和AMS服务通信从而达到调用AMS服务的功能。而这里最最重要的就是AMN.getDefault()的调用逻辑了,这里我们对其小结一下:

  • AMN.getDefault()最终获取了AMS的远程Binder代理端AMP
  • AMS的Binder通信过程中提供了一个IActivityManager服务业务层接口,AMP类与AMS类都实现了IActivityManager接口方法,区别不同给的是AMS端显示了真正的具体服务,而AMP端是封装了相关的通信传输逻辑。AMP作为Binder通信的服务代理端,而AMS作为Binder通信的服务端实体,根据Android Binder框架实现之Java层Binder服务跨进程调用源码分析,AMP.xxx()最终调用AMS.xxx(),整个流程图如下:
    在这里插入图片描述

至此我们就建立了一条如下的通信道路线完成Android应用程序以及关联的四大组件建立和AMS的Binder通信

在这里插入图片描述

这里我们需要注意的是其实对四大组件的常规操作,我们的Context上下文环境已经为我么封装好了相关的调用接口,譬如startActivity(),startService()等!但是其核心还是获取AMS服务的代理端AMP,只是省略了获取ActivityManager的流程罢了!




二.AMS建立和Android应用程序以及关联的四大组件之间的Binder通信

  我们知道Android应用程序进程通常是AMS服务请求zygote进程fork出来的,Android应用程序被fork出来以后经过一些列的初始化最终会通过反射调用到ActivityThread.main()方法中(如果对此处逻辑不是很清楚的,详见博客请求并创建目标Activity进程),而我们AMS建立和Android应用程序以及关联的四大组件之间的Binder通信正是在执行main()方法中进行的。

//[ActivityThread.java]
public static void main(String[] args) {
    ...
    Environment.initForCurrentUser();
    ...
    Process.setArgV0("<pre-initialized>");
    //创建主线程looper
    Looper.prepareMainLooper();

    ActivityThread thread = new ActivityThread();
    //attach到系统进程AMS服务,从而使AMS建立和应用程序的通信通道
    thread.attach(false);//详见章节2.1

    if (sMainThreadHandler == null) {
        sMainThreadHandler = thread.getHandler();
    }

    //主线程进入循环状态
    Looper.loop();

    throw new RuntimeException("Main thread loop unexpectedly exited");
}

2.1 ApplicationThread简介

  在正式开始上述Binder通道建立之前,我们有必要来先了解了解ApplicationThread类实现了IApplicationThread接口,这里我们先来简单看下IApplicationThread的定义,如下:

//[IApplicationThread.aidl]
public interface IApplicationThread extends IInterface {
    void schedulePauseActivity(IBinder token, boolean finished, boolean userLeaving,
            int configChanges, boolean dontReport) throws RemoteException;
    void scheduleStopActivity(IBinder token, boolean showWindow,
            int configChanges) throws RemoteException;
}

可以看到IApplicationThread定义的方法很多,绝大不是是和Android四大组件生命周期调度有关的,我们接着来看ApplicationThread类,它是一个匿名Binder类,其类图关系图如下:

如果对Binder特别是匿名/实名Binder还没有了解的读者强烈建议先阅读一下该篇以及一系列的博客Android Binder框架实现之何为匿名/实名Binder。通过前面的博客我们应该知道匿名Binder有两个比较重要的用途:
一个是拿到Binder代理端后可跨Binder调用实体端的方法接口(我们这里主要利用了这个功能 )
另一个作用便是在多个进程中标识同一个对象

在这里插入图片描述

这里的IApplicationThread与IActivityManager的Binder通信原理一样,ATP作为Binder通信的客户端,ATN作为Binder通信的服务端,其中ApplicationThread继承ATN类,覆写其中的部分方法。


2.2 注册目标Activity进程到system_server建立AMS和它的Binder通信

  通过前面的章节我们了解匿名Binder服务ApplicationThread,而本章节将要分析它是怎么被实名Binder传递到system_server进程中然后建立起AMS和它的通信逻辑的,其核心的架构思想如下图所示:

在这里插入图片描述

2.2.1 ActivityThread.attach(…)

  其实对于该方法,如果有阅读过Android系统启动之system_server进程创建大揭秘的小伙们应该不会陌生了,在system_server进程启动的流程中也会调用它只是传入的参数为true,而我们此时传入的参数为false而已!用以区别是system_server进程发起的绑定还是普通应用进程发起的绑定。

//[ActivityThread.java]
	final ApplicationThread mAppThread = new ApplicationThread();
    private void attach(boolean system) {
        sCurrentActivityThread = this;
        mSystemThread = system;
        if (!system) {
			...
			// 设置进程名。此时,还没有ApplicationInfo,所以用<pre-initialized>来命名应用进程
            android.ddm.DdmHandleAppName.setAppName("<pre-initialized>",
                                                    UserHandle.myUserId());
            ...
			//获取AMS服务端的远程代理对象AMP
            final IActivityManager mgr = ActivityManagerNative.getDefault();
            try {
            	//通过Binder远程调用AMS的attachApplication方法
                mgr.attachApplication(mAppThread);//详见章节
            } catch (RemoteException ex) {
                throw ex.rethrowFromSystemServer();
            }
			...
        } else {//system_server进程会进入此分支

        }

        DropBox.setReporter(new DropBoxReporter());
		//为ViewRootImpl注册Config回调接口
        ViewRootImpl.addConfigCallback(new ComponentCallbacks2() {
			...
        });
    }

上述方法执行的逻辑并不是很复杂,其主要就是两点:

  • 获取AMS服务的远程代理端AMP
  • 接着通过AMP借助Binder调用AMS的方法attachApplication,注意这里传递的mAppThread是一个匿名Binder实例,因此可以作为跨进程传递的参数。这里的mAppThread对象存在于应用进程,但会被传递到系统进程,在系统进程看来,此时的mAppThread就是操作应用进程的一个通信工具。后续,系统进程system_server如果想要向应用进程发起跨进程调用,也都需要通过mAppThread这个对象来完成相关的调度。

并且关于上述的执行逻辑我们在Android四大组件之Activity启动流程源码实现详解(一)中2.4章节已经有过详细的分析了,这里就不详细赘述了。并且如果小伙们对于什么是匿名Binder以及怎么传递的有不了解的小伙们,这篇博客Android Binder框架实现之何为匿名/实名Binder有详细分析就不过多歪歪了!

关于上述整个Binder IPC调用流程,可以使用如下伪代码来简述:

AMP.attachApplication(...)---> 
BinderProxy.transact(...) --->
BpBinder.transact(...)--->
binder驱动传输--->
JavaBBinder.onTransact(...)--->
AMN.onTransact(..)--->
AMN.attachApplication(...) --->
AMS.attachApplication(...) --->
2.2.2 AMS.attachApplication(…)系统system_server进程处理attachApplication请求

  在这里AMS响应了目标Activity进程的attachApplication绑定请求,注意此时的attachApplication是执行在Binder线程中的。

//[ActivityManagerService.java]
    public final void attachApplication(IApplicationThread thread) {
        synchronized (this) {
        	//获取调用进程端pid
            int callingPid = Binder.getCallingPid();
            final long origId = Binder.clearCallingIdentity();
            //attachApplicationLocked进行进一步处理
            attachApplicationLocked(thread, callingPid);
            Binder.restoreCallingIdentity(origId);
        }
    }

上述方法比较简单,接着调用attachApplicationLocked进行下一步的处理,注意此时多传入了一个参数pid。并且这里还有一点主要注意的是此时的参数类型IApplicationThread已经变成了匿名Binder的代理端了ATP了。IApplicationThread它串联起了AMS对App进程的生命周期及其其它的控制。

我们接着继续分析,attachApplicationLocked源码数量有点多啊(没有啥的、我们只关心我们所关心的)!

//[ActivityManagerService.java]
   private final boolean attachApplicationLocked(IApplicationThread thread,
            int pid) {


        ProcessRecord app;
        long startTime = SystemClock.uptimeMillis();
        /*
         	根据PID映射应用进程的ProcessRecord对象
         	那么此处的ProcessRecord是什么时候创建并加入到mPidsSelfLocked中的呢,这个在该系列博客的五中有详细描述
        */
        if (pid != MY_PID && pid >= 0) {
            synchronized (mPidsSelfLocked) {
                app = mPidsSelfLocked.get(pid);
            }
        } else {
            app = null;
        }

    	...    
		//将目标Activity进程的IApplicationThread匿名Binder代理端绑定到ProcessRecord对象
        app.makeActive(thread, mProcessStats);
        /****************************************************/
        //这里为了演示方便,直接给出源码
        	//[ProcessRecord.java]
		    public void makeActive(IApplicationThread _thread, ProcessStatsService tracker) {
		        if (thread == null) {
					...
		        }
		        thread = _thread;
		    }        
        /****************************************************/
		
		//继续进行其它的对ProcessRecord的赋值
        app.curAdj = app.setAdj = app.verifiedAdj = ProcessList.INVALID_ADJ;
        app.curSchedGroup = app.setSchedGroup = ProcessList.SCHED_GROUP_DEFAULT;
        app.forcingToForeground = null;
        updateProcessForegroundLocked(app, false, false);
        app.hasShownUi = false;
        app.debugging = false;
        app.cached = false;
        app.killedByAm = false;




		...
        try {
			...
			//省略debug和性能优化等相关配置的代码,这里就不赘述了

			//这里又是老熟人了,一路分析过来见过很多次了,此处发起跨进程调用,将一堆的信息传递给目标Activity应用进程
			//立即使用了传递过来的匿名Binder,调用到了ActivityThread中
            thread.bindApplication(processName, appInfo, providers, app.instrumentationClass,
                    profilerInfo, app.instrumentationArguments, app.instrumentationWatcher,
                    app.instrumentationUiAutomationConnection, testMode,
                    mBinderTransactionTrackingEnabled, enableTrackAllocation,
                    isRestrictedBackupMode || !normalMode, app.persistent,
                    new Configuration(mConfiguration), app.compat,
                    getCommonServicesLocked(app.isolated),
                                   mCoreSettingsObserver.getCoreSettingsLocked());//详见第二大章节
            updateLruProcessLocked(app, false, null);
  			...
        } catch (Exception e) {//异常处理
 			...
        }

        return true;
    }

我们这里只重点关心IApplicationThread 代理端的处理,在传递到AMS服务以后将其保存到了每个应用进程在AMS服务端的记录ProcessRecord的thread中,从而AMS后续可以继续使用该Binder代理端来对Android应用程序和四大组件进行相关的调度,这不后面立即来了一个thread.bindApplication的调度。当然AMS服务中并不单单只有此处的调用,我们简单搜索一下能发现许多,如下:

frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:2107:                            r.app.thread.scheduleEnterAnimationComplete(r.appToken);
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:2855:                            procs.add(app.thread.asBinder());
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:4289:                    app.thread.scheduleTrimMemory(level);
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:4723:            activityToCallback.app.thread.scheduleLocalVoiceInteractionStarted(activity,
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:5372:                app.thread.asBinder() == thread.asBinder()) {
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:6089:                        app.thread.scheduleSuicide();
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:11625:                                        app.thread.scheduleInstallProvider(pi);
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:12579:                activity.app.thread.requestAssistContextExtras(activity.appToken, pae,
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:15464:                    r.app.thread.dumpActivity(tp.getWriteFd().getFileDescriptor(),
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:17100:                    capp.thread.unstableProviderDied(conn.provider.provider.asBinder());
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:19295:                            app.thread.scheduleConfigurationChanged(configCopy);
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:20416:                    app.thread.scheduleLowMemory();
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:20418:                    app.thread.processInBackground();
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:20785:                    app.thread.setProcessState(app.repProcState);
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:21431:                            app.thread.scheduleTrimMemory(curLevel);
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:21468:                            app.thread.scheduleTrimMemory(
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:21486:                                app.thread.scheduleTrimMemory(level);
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:21497:                            app.thread.scheduleTrimMemory(fgTrimLevel);
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:21523:                            app.thread.scheduleTrimMemory(
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:21657:                        + (app.thread != null ? app.thread.asBinder() : null)
frameworks/base/services/core/java/com/android/server/am/ActivityManagerService.java:21663:                            app.thread.scheduleExit();
frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java:1343:            app.thread.scheduleLaunchActivity(new Intent(r.intent), r.appToken,
frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java:3027:                top.app.thread.scheduleBackgroundVisibleBehindChanged(top.appToken, visible);
frameworks/base/services/core/java/com/android/server/am/ActivityStackSupervisor.java:3465:                        r.app.thread.dumpActivity(tp.getWriteFd().getFileDescriptor(),
frameworks/base/services/core/java/com/android/server/am/ActiveServices.java:1457:                r.app.thread.scheduleBindService(r, i.intent.getIntent(), rebind,
frameworks/base/services/core/java/com/android/server/am/ActiveServices.java:1877:            app.thread.scheduleCreateService(r, r.serviceInfo,
frameworks/base/services/core/java/com/android/server/am/ActiveServices.java:1985:                r.app.thread.scheduleServiceArgs(r, si.taskRemoved, si.id, flags, si.intent);
frameworks/base/services/core/java/com/android/server/am/ActiveServices.java:2079:                        r.app.thread.scheduleUnbindService(r,
frameworks/base/services/core/java/com/android/server/am/ActiveServices.java:2135:                    r.app.thread.scheduleStopService(r);
frameworks/base/services/core/java/com/android/server/am/ActiveServices.java:2240:                    s.app.thread.scheduleUnbindService(s, b.intent.intent.getIntent());
frameworks/base/services/core/java/com/android/server/am/ActiveServices.java:3436:                    r.app.thread.dumpService(tp.getWriteFd().getFileDescriptor(), r, args);
frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java:269:        r.receiver = app.thread.asBinder();
frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java:286:            app.thread.scheduleReceiver(new Intent(r.intent), r.curReceiver,
frameworks/base/services/core/java/com/android/server/am/BroadcastQueue.java:476:                    app.thread.scheduleRegisteredReceiver(receiver, intent, resultCode,
frameworks/base/services/core/java/com/android/server/am/ActivityRecord.java:464:            app.thread.scheduleActivityConfigurationChanged(
frameworks/base/services/core/java/com/android/server/am/ActivityRecord.java:477:            app.thread.scheduleMultiWindowModeChanged(appToken, !task.mFullscreen);
frameworks/base/services/core/java/com/android/server/am/ActivityRecord.java:488:            app.thread.schedulePictureInPictureModeChanged(
frameworks/base/services/core/java/com/android/server/am/ActivityRecord.java:962:                app.thread.scheduleNewIntent(
frameworks/base/services/core/java/com/android/server/am/ActivityRecord.java:1322:                app.thread.scheduleSleeping(appToken, _sleeping);
frameworks/base/services/core/java/com/android/server/am/CompatModePackages.java:379:                        app.thread.updatePackageCompatibilityInfo(packageName, ci);
frameworks/base/services/core/java/com/android/server/am/ActivityStack.java:1160:                prev.app.thread.schedulePauseActivity(prev.appToken, prev.finishing,
frameworks/base/services/core/java/com/android/server/am/ActivityStack.java:1935:                        r.app.thread.scheduleWindowVisibility(r.appToken, false);
frameworks/base/services/core/java/com/android/server/am/ActivityStack.java:1998:            r.app.thread.scheduleWindowVisibility(r.appToken, true);
frameworks/base/services/core/java/com/android/server/am/ActivityStack.java:2015:                r.app.thread.scheduleOnNewActivityOptions(r.appToken, r.returningOptions);
frameworks/base/services/core/java/com/android/server/am/ActivityStack.java:2065:                        waitingActivity.app.thread.scheduleTranslucentConversionComplete(
frameworks/base/services/core/java/com/android/server/am/ActivityStack.java:2536:                        next.app.thread.scheduleSendResult(next.appToken, a);
frameworks/base/services/core/java/com/android/server/am/ActivityStack.java:2553:                    next.app.thread.scheduleNewIntent(
frameworks/base/services/core/java/com/android/server/am/ActivityStack.java:2570:                next.app.thread.scheduleResumeActivity(next.appToken, next.app.repProcState,
frameworks/base/services/core/java/com/android/server/am/ActivityStack.java:3238:                r.app.thread.scheduleSendResult(r.appToken, list);
frameworks/base/services/core/java/com/android/server/am/ActivityStack.java:3344:                r.app.thread.scheduleStopActivity(r.appToken, r.visible, r.configChangeFlags);
frameworks/base/services/core/java/com/android/server/am/ActivityStack.java:3465:                            r.app.thread.scheduleLocalVoiceInteractionStarted((IBinder) r.appToken,
frameworks/base/services/core/java/com/android/server/am/ActivityStack.java:4072:                r.app.thread.scheduleDestroyActivity(r.appToken, r.finishing,
frameworks/base/services/core/java/com/android/server/am/ActivityStack.java:4166:                    r.app.thread.scheduleCancelVisibleBehind(r.appToken);
frameworks/base/services/core/java/com/android/server/am/ActivityStack.java:4821:            r.app.thread.scheduleRelaunchActivity(r.appToken, results, newIntents, changes,

2.3 AMS建立和Android应用程序以及关联的四大组件之间的Binder通信小结

  至此AMS建立和Android应用程序以及关联的四大组件之间的Binder通信就到这里就告一段落了,它最终是借助匿名Binder的代理端ATP完成了这一切!分析完结我们发现无论是AMS和应用程序通信还是应用程序和AMS之间的通信都是通过Binder的逻辑进行的,只不过一个是实名Binder通信一个是匿名Binder通信而已,所以Android源码的源码学习一定是绕不开Binder的,读者一定要有所掌握不然真的很难深入理解Android源码的一些设计理念。




总结

  Android应用程序建立与AMS服务之间的通信过程到这里就要完结了,通过前面的介绍我们知道了Android应用程序和AMS之间的交互主要是通过IApplicationThread与IActivityManager这两个接口来完成的,IActivityManager实现了Android应用程序到AMS之间通信,而IApplicationThread实现了AMS到Android应用程序之间的通信。但是我们这里发现了无论是借助于那个接口,最终都脱离不了Binder通信,所以所以Android源码的源码学习一定是绕不开Binder的,读者一定要有所掌握不然真的很难深入理解Android源码的一些设计理念(打个广告,可以看看我的系列博客Android Binder框架学习系列博客)。好了,青山不改绿水长流先到这里了。如果本博客对你有所帮助,麻烦关注或者点个赞,如果觉得很烂也可以踩一脚!谢谢各位了!!

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值