安卓底层开发学习经验第十五期

本文介绍Android系统中关键服务与Zygote的启动流程,包括netd、servicemanager等服务的作用,以及Java虚拟机的创建过程。深入解析Dalvik虚拟机配置与执行模式,揭示Zygote服务如何启动Java应用程序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这一期我们来学习一下 Android 的一些基本的服务与 Zygote 的启动
首先我们来看一下在 init 脚本中配置的一些服务

       我们的服务包括netd 服务,它主要做的是网络管理,第二个是比较重要的 servicemanager ,他就是通过一定的机制使我们的 client service 服务进行通讯,第三个是我们的 surfaceflinge ,也就是我们显示的管理,首先要初始化显示界面,然后初始化 surface ,我们所有的显示,每个应用的叠加,都是通过 surfaceflinge 来实现的,我们 surfaceflinge 底下会挂着我们显示的驱动,第四个是我们的一个核心服务,也就是 zygote 服务,他是我们第一个 java 程序,他负责创建我们的 system service, 把整个系统的服务给启动起来,并且负责创建我们的应用,第五个是我们的 media 服务,包括我们的音频、 camera 、以及我们的媒体播放器,为我们整个系统提供多媒体的服务,第六个是我们的 installd 的服务,它主要是管理应用的安装,最后一个是我们的 bootanim ,它主要是我们的一个开机动画,这就是我们 init 进程中的一些基本的服务。
      下面我们来看一下我们 java 虚拟机的创建,和我们第一个 java 程序的引导过程

       在我们init 脚本中有这样一个语句,也就是我们的 zygote 服务,他所执行的服务是我们 /system/bin/app_process ,然后传进来一个 -Xzygote 来启动我们的 zygote 服务,在这个 zygote 服务后边我们还加了 --start-system-server, 也就是启动我们系统的一些服务,这些服务都是基于 Java 的,那我们来看一下这个服务的调用过程,首先他会调用我们的 app_process 这个应用程序,这个应用程序是基于 AndroidRuntime 来实现的,在这个里边还会调用 AndroidRuntime.start() 的方法来创建 java 虚拟机,创建虚拟机并注册 Android 的核心函数,即 JNI 函数,注册完之后就调用 CallStaticVoidMethod 来启动 zygote 这个 java 类中的 main 方法,来启动这个 zygote 服务,在创建虚拟机的时候我们会根据 init 脚本中的配置参数来配置我们的虚拟机,并且创建一个虚拟机的实例,并且设置一些虚拟机相关的函数,并且通过一系列的操作函数来寻找到我们 java 类中的方法,来启动我们的 zygote 服务,这就是我们虚拟机的创建,和 zygote 启动的一个大概过程
       下面我们来看一下 dalvik 虚拟机的一些基本配置

       Dalvik 虚拟机机制是我们 Android 平台的一个基础,我们所有的 apk 都是跑在虚拟机之上的,我们的虚拟机是基于寄存器的,它运行的文件格式是 .dex ,他和我们普通机器上的虚拟机是不一样的,而且我们这个 dalvik 可以在 Linux 上运行多个 dalvik 实例,每一个实例都是一个独立的进程,比如我们每创建一个 Android 的应用,我们都可以理解为是一个单独的 dalvik 实例,这样的话我们有一个程序崩溃了,不会影响到其他的程序,他是我们 dalvik 程序的一个优点。我们再来看一下我们 dalvik 设置的一些主要参数, dalvik.vm.startheapsize 是启动一个应用程序之后为其分配的初始堆栈的大小,一般会设为 2M 48M ,推荐是 8M 左右。我们再来看一下 dalvik.vm.heapsize ,他是虚拟机给我们应用分配的一个最大内存,如果我们内存设的比较大,那我们应用程序跑起来就比较顺畅,所以它的最大限值可以根据我们硬件平台的大小进行一个合理的限制。第三个是我们的 dalvik.vm.checkjni ,这个是当我们调用外部 JNI 链接库时,是否做一个安全检查,这个在我们 init 脚本中会有配置,默认是不做的。接下来我们再来看一下我们 dalvik 虚拟机的一个执行模式,基本上分为三种模式:第一种 int portable 这种兼容性运行模式,这种模式兼容性最高,执行效率最低;第二种是我们的 int fast 模式,它又被称为快速自优化模式,这种模式他的兼容性和执行效率都比较高,所以我们比较倾向于这种模式,他还允许程序使用自己定义代码和模块。第三种是 int jit 模式,这种模式呢效率最高,兼容性最差
       下面我们来看一下我们 Zygote 的一个启动流程
       首先,我们会调用AndroidRuntime 的方法去创建一个虚拟机和我们 JNI 的环境变量,在这个环境变量中会设置一些相关的函数,这些函数用于去寻找我们 java 中的方法,调用我们 java 中的方法。第二个就是开始注册我们 Android 的一些 JNI 的函数,最后根据我们 start 方法中传进来的一些参数,去启动我们相关的 java 服务,我们的服务就是我们的 zygote ,这个就是 dalvik 虚拟机的创建以及我们 zygote 服务启动的一个过程
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值