1,概述
2,Binder原理
3,AIDL原理
4,AMS
5,Activity工作原理
6,App内部的页面跳转
7,Context家族史
8,Service工作原理
9,BroadcastReceiver工作原理
10,ContentProvider工作原理
11,PMS及App安装过程
12,ClassLoader家族史
13,双亲委托
14,MultiDex
1,概述
底层知识,大致分为两类,知道概念即可,比如Zygote,其实App开发不需要了解其细节,类似的还有SurfaceFlinger、WMS这些概念。
需要知道内部原理,比如Binder,对于App开发者,需要了解的是它的架构模型,只要有Client、Server以及ServiceManager就足够了。
2,Binder原理
1,Binder分为Client和Server两个进程
注意,Client和Server是相对的。谁发消息,谁就是Client,谁接收信息,谁就是Server
2,Binder的组成
Binder的架构,图中IPC即为进程间通信,ServerManager负责把Binder Server注册到一个容器中。
把ServerManager比喻成电话局,存储着每个住宅的电话。张三给李四打电话,拨打电话号码,会先转接到电话局,电话局的接线员会查到这个这个电话号码的地址,因为李四的电话号码之前的电话局注册过,所以就能拨通。
对着Binder的机制,张三就是Binder Client,李四就是Binder Server,电话局就是ServiceManager,电话局的接线员在这个过程中做了很多事情,对应着图中的Binder驱动。
Binder的通信过程
Binder的通信过程如图所示,图中的SM即为ServiceManager。我们看到,Client不可以直接调用Server的add方法,因为它们在不同的进程中,这时候就需要Binder的帮忙了。
首先,Server在SM容器中注册。
其次,Client若要懂黁是Server的add方法,就需要先获取Server对象,但是SM不会把真正的Server对象返回给Client,而是把Server的一个代理对象,也就是Proxy,返回给Client。
再次,Client调用Proxy的add方法,ServiceManager会帮它去调用Server的add方法,并把结果返回给Client。
以上这3步,Binder驱动出了很多力,但我们不需要知道Binder驱动的底层实现,这涉及C或C++的代码。
综上所述,学习Binder是为了更好的理解AIDL,基于AIDL模型,进而了解四大组件的原理。
理解了Binder再看AMS和四大组件的关系,就像是Binder的两个进程Server和Client通信。
3,AIDL原理
IBinder类
IInterface类
Binder类
Proxy类
Stub类
当我们定义一个aidl文件时,比如MyAidl.aidl,里面有一个sum方法,Android studio会帮我们生成一个类文件MyAidl.java,我们把MyAidl.java中的3个为了拆开,
public interface MyAidl extends android.os.IInterface{
public int sum(int a, int b) throws android.os.RemoteExcepetion;
}
public abstract class Stub extends android.os.Binder implements MyAidl{
}
class Proxy implements MyAidl{
}
起决定作用的是Stub的asInterface方法和onTransact方法
1,从Client看,对于AIDL的使用者,我们写程序:
MyAidl.Stub.asInterface(某IBinder对象).sum(1,2);
2,Proxy在自己的sum方法中,会使用Parcelable来准备数据,把函数名称、函数参数都写入_data,让_reply接收函数返回值。最后使用IBinder的transact方法,就可把数据传给Binder的Server端了。
3,Server则是通过onTransact方法接收Client进程传过来的数据,包括函数名称、函数参数,找到相应的函数(这里是sum),把参数填进去,得到结果,返回。
所以onTransact函数经历了读数据-》执行要调用的函数-》把执行结果再写数据的过程。
下面要介绍四大组件的原理,比如四大组件的启动和后续流程,都是在于ActivityManagerService来来回回通信,四大组件给AMS发信息,四大组件就是Binder Client,而AMS就是Binder Server;AMS发信息通知四大组件,那么角色互换。
4,AMS
如果站在四大组件的角度来看,AMS就是Binder的Server。
AMS从字面意思上看是管理activity的,但其实四大组件都归它管。
5,Activity工作原理
这里只讲述Activity的启动和通信原理。
从手机屏幕上点击某个App的图标,背后经历了Activity和AMS的反反复复的通信过程。
首先要搞清楚,在手机屏幕上点击App的快捷图标,此时手机屏幕就是一个Activity,而这个Activity所在的App,业界称之为Launcher。Launcher是各手机系统厂商提供的,比拼的是谁的Launcher绚丽和人性化。
Launcher中为每个App的图标提供了启动这个App所需的intent信息。
这些信息是App安装(或者Android系统启动)的时候,PackageManagerService从apk包的AndroidManifest文件中读取的。所以电器图标就启动了App的首页。
Launcher和App上两个不同的App,它们位于不同的进程中,它们之间的通信是通过Binder完成的,这时候AMS出场了。
我们以微信App为例,整体流程分为以下7个阶段。
1,Launcher通知AMS,要启动微信App,而且指定要启动微信App的哪个页面(也就是首页)
2,AMS通知Launcher,“好了,我知道了,没你什么事了”。同时把要启动的首页记下来。
3,Launcher当前页面进入paused状态,然后通知AMS,“我休息了,你去找微信吧”
4,AMS检查微信App是否已经启动了。是则换起微信,否,就要启动一个新的进程。AMS在新进程中创建了一个ActivityThread对象,启动其中的main函数。
5,微信App启动后,通知AMS,“我启动好了”
6,AMS翻出之前2中存的值,告诉微信App,启动哪个页面。
7,微信app启动首页,创建Context并于首页Activity关联。然后调用首页Activity的onCreate函数。
至此启动流程完成,可分成两部分:1-3,Launcher和AMS相互通信;4-7阶段,微信app和AMS相互通信。
涉及的类:
Instrumentation
ActivityThread
H
LoadedApk
AMS
ActivityManagerNative和ActivityManagerProxy
ApplicationThread和ApplicationThreadProxy