上面的一些列步骤简单介绍了一个APP启动到主页面显示的过程,可能这些流程中 的一些术语看的有些懵,什么是Launcher,什么是zygote,什么是 applicationThread… 下面我们一一介绍。

二、理论基础
1.zygote

zygote意为“受精卵“。Android是基于Linux系统的,而在Linux中,所有的进程都是 由init进程直接或者是间接fork出来的,zygote进程也不例外。

在Android系统里面,zygote是一个进程的名字。Android是基于Linux System的, 当你的手机开机的时候,Linux的内核加载完成之后就会启动一个叫“init“的进程。在 Linux System里面,所有的进程都是由init进程fork出来的,我们的zygote进程也不 例外

我们都知道,每一个App其实都是

  • 一个单独的dalvik虚拟机
  • 一个单独的进程

所以当系统里面的第一个zygote进程运行之后,在这之后再开启App,就相当于开 启一个新的进程。而为了实现资源共用和更快的启动速度,Android系统开启新进 程的方式,是通过fork第一个zygote进程实现的。所以说,除了第一个zygote进 程,其他应用所在的进程都是zygote的子进程,这下你明白为什么这个进程叫“受精 卵”了吧?因为就像是一个受精卵一样,它能快速的分裂,并且产生遗传物质一样的 细胞!

2.system_server

SystemServer也是一个进程,而且是由zygote进程fork出来的。

知道了SystemServer的本质,我们对它就不算太陌生了,这个进程是Android Framework里面两大非常重要的进程之一——另外一个进程就是上面的zygote进 程。

为什么说SystemServer非常重要呢?因为系统里面重要的服务都是在这个进程里面 开启的,比如 ActivityManagerServicePackageManagerServiceWindowManagerService等等。

3.ActivityManagerService

ActivityManagerService,简称AMS,服务端对象,负责系统中所有Activity的生命 周期。 ActivityManagerService进行初始化的时机很明确,就是在SystemServer进程开启 的时候,就会初始化ActivityManagerService

下面介绍下Android系统里面的服务器和客户端的概 念。

其实服务器客户端的概念不仅仅存在于Web开发中,在Android的框架设计中,使 用的也是这一种模式。服务器端指的就是所有App共用的系统服务,比如我们这里 提到的ActivityManagerService,和前面提到的PackageManagerServiceWindowManagerService等等,这些基础的系统服务是被所有的App公用的,当某 个App想实现某个操作的时候,要告诉这些系统服务,比如你想打开一个App,那 么我们知道了包名和MainActivity类名之后就可以打开

Intent intent = new Intent(Intent.ACTION_MAIN);
intent.addCategory(Intent.CATEGORY_LAUNCHER);
ComponentName cn = new
ComponentName(packageName, className);
intent.setComponent(cn); startActivity(intent);

但是,我们的App通过调用startActivity()并不能直接打开另外一个App,这个方法会 通过一系列的调用,最后还是告诉AMS说:“我要打开这个App,我知道他的住址和 名字,你帮我打开吧!”所以是AMS来通知zygote进程来fork一个新进程,来开启我 们的目标App的。这就像是浏览器想要打开一个超链接一样,浏览器把网页地址发 送给服务器,然后还是服务器把需要的资源文件发送给客户端的。

知道了Android Framework的客户端服务器架构之后,我们还需要了解一件事情, 那就是我们的App和AMS(SystemServer进程)还有zygote进程分属于三个独立的进 程,他们之间如何通信呢?

App与AMS通过Binder进行IPC通信,AMS(SystemServer进程)与zygote通过 Socket进行IPC通信。后面具体介绍。

那么AMS有什么用呢?在前面我们知道了,如果想打开一个App的话,需要AMS去 通知zygote进程,除此之外,其实所有的Activity的开启、暂停、关闭都需要AMS 来控制,所以我们说,AMS负责系统中所有Activity的生命周期。 在Android系统中,任何一个Activity的启动都是由AMS和应用程序进程(主要是 ActivityThread)相互配合来完成的。AMS服务统一调度系统中所有进程的 Activity启动,而每个Activity的启动过程则由其所属的进程具体来完成。

4.Launcher

当我们点击手机桌面上的图标的时候,App就由Launcher开始启动了。但是,你有 没有思考过Launcher到底是一个什么东西? Launcher本质上也是一个应用程序,和我们的App一样,也是继承自Activity packages/apps/Launcher2/src/com/android/launcher2/Launcher.java

public final class Launcher extends Activity
implements View.OnClickListener, OnLongClickListener, La uncherModel.Callbacks, View.OnTouchListener {
}

Launcher实现了点击、长按等回调接口,来接收用户的输入。既然是普通的App, 那么我们的开发经验在这里就仍然适用,比如,我们点击图标的时候,是怎么开启 的应用呢?捕捉图标点击事件,然后startActivity()发送对应的Intent请求呗!是的,Launcher也是这么做的,就是这么easy!

5.Instrumentation和ActivityThread

每个Activity都持有Instrumentation对象的一个引用,但是整个进程只会存在一个 Instrumentation对象。 Instrumentation这个类里面的方法大多数和ApplicationActivity有关,这个类就是完成对ApplicationActivity初始化和生命周期的工具 类。Instrumentation这个类很重要,对Activity生命周期方法的调用根本就离不开 他,他可以说是一个大管家。

ActivityThread,依赖于UI线程。App和AMS是通过Binder传递信息的,那么 ActivityThread就是专门与AMS的外交工作的。

6.ApplicationThread

前面我们已经知道了App的启动以及Activity的显示都需要AMS的控制,那么我们便 需要和服务端的沟通,而这个沟通是双向的。
客户端–>服务端

而且由于继承了同样的公共接口类,ActivityManagerProxy提供了与 ActivityManagerService一样的函数原型,使用户感觉不出Server是运行在本地还是 远端,从而可以更加方便的调用这些重要的系统服务。

服务端–>客户端
还是通过Binder通信,不过是换了另外一对,换成了ApplicationThreadApplicationThreadProxy

他们也都实现了相同的接口IApplicationThread

private class ApplicationThread extends ApplicationThreadNative {
}
public abstract class ApplicationThreadNative extends Binder i mplements IApplicationThread{
}
class ApplicationThreadProxy implements IApplicationThread {
}

好了,前面罗里吧嗦的一大堆,介绍了一堆名词,可能不太清楚,没关系,下面结 合流程图介绍。

三、启动流程
1.创建进程

先从Launcher的startActivity()方法,通过Binder通信,调用 ActivityManagerServicestartActivity方法。
一系列折腾,最后调用startProcessLocked()方法来创建新的进程。
该方法会通过前面讲到的socket通道传递参数给Zygote进程。Zygote孵化自身。 调用ZygoteInit.main()方法来实例化ActivityThread对象并最终返回新进程的pid。
调用ActivityThread.main()方法,ActivityThread随后依次调用 Looper.prepareLoop()Looper.loop()来开启消息循环。

最后

分享一份工作1到5年以上的Android程序员架构进阶学习路线体系,希望能对那些还在从事Android开发却还不知道如何去提升自己的,还处于迷茫的朋友!

  • 阿里P7级Android架构师技术脑图;查漏补缺,体系化深入学习提升(详细点击我的GitHub领取)

  • **全套体系化高级架构视频;**七大主流技术模块,视频+源码+笔记

需要架构学习笔记导图的可以点击我的GitHub领取

群内有许多技术大牛,高手如云,有任何问题,欢迎广大网友一起来交流,群内还不定期免费分享高阶Android学习视频资料和面试资料包~

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

面经、学习笔记、源码讲义、实战项目、讲解视频**
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-KflFg43A-1711028161810)]

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐