qt android 虚拟机启动不_Android 9.0 Zygote 启动流程

8cf80a8a-5248-49f5-bfbb-4b2c01bd9748

和你一起终身学习,这里是程序员Android

本篇文章主要介绍 Android Zygote 启动分析 知识点,通过阅读本篇文章,您将收获以下内容:

一、 Android 系统基本服务

二、虚拟机创建和第一个Java 程序引导

三、Dalvik 虚拟机基本配置

四、Zygote 启动流程

五、Zygote 启动分析

六、Zygote 创建system_server主要方法

七、Zygote 创建System_server 分析

八、Zygote 创建应用

九、Zygote 创建应用流程

十、Zygote 预加载资源

十一、Zygote 预加载的目的

十二、优化Zygote 启动方法: 线程池

十三、fork SystemServer

Zygote 服务时通过 init.rc进程启动的,Zygote 的 classname 为main.

init.rc文件配置代码如下:

... ... on nonencrypted class_start main class_start late_starton property:sys.init_log_level=* loglevel ${sys.init_log_level}... ...

详细可以参考 init.rc启动分析。

Android 9.0 系统启动流程

一、 Android 系统基本服务

Android 系统包含netd、servicemanager、surfaceflinge、zygote、media、installd、bootanimation 等基本服务,具体作用请看下图。

8d1ed29b00ef4b4685e37f38bc7c6a18

Android 系统基本服务

二、虚拟机创建和第一个Java 程序引导

为了让APK在不同的虚拟机都可以运行,Google 采取了适配器模式,在让虚拟机运行之前先执行 dexopt ,即将dex文件优化成odex 文件,可以让虚拟机更加优化的执行。

在ART虚拟机中,dexopt 将dex文件优化成二进制格式的问题,从而可以让ART虚拟机执行。

dexopt会调用dex2oat 进行优化,dex2oat 的任务是将原来的dex文件进行预翻译,从而可以加快app运行的时间,但是由于某些app比较复杂,所以优化的时间就比较长。

优化是以dex 文件中的Method 方法为单位,dex2oat 在优化时候,会根据需求优化一定量的Method,即不是所有的Method 都回翻译成oat模式。

93ea2c83d5f4479a9b443373f5573153

虚拟机创建和第一个Java 程序引导

三、Dalvik 虚拟机基本配置

在Android系统中,Dalvik 虚拟机 和ART、应用程序进程,以及运行系统的关键服务SystemServer进程都是由 Zygote进程创建孵化的。

Dalvik 虚拟机基本配置如下:

655eb2166856457c9e03abeed49232a6

Dalvik 虚拟机基本配置

四、Zygote 启动流程

Zygote 是由 init.rc 脚本启动,在init脚本中,我们可以看到会导入import /init.${ro.zygote}.rc 脚本

# Copyright (C) 2012 The Android Open Source Project## IMPORTANT: Do not create world writable files or directories.# This is a common source of Android security bugs.#import /init.environ.rcimport /init.usb.rcimport /init.${ro.hardware}.rcimport /vendor/etc/init/hw/init.${ro.hardware}.rcimport /init.usb.configfs.rc... ...import /init.${ro.zygote}.rc... ...

在 system/core/rootdir目录下,会根据ro.zygote属性值不同,启动不同的脚本,主要包含以下四个zygote脚本。

  • 1.init.zygote32.rc 支持32为系统
  • 2.init.zygote32_64.rc
  • 3.init.zygote64.rc
  • 4.init.zygote64_32.rc
ec4ded60e1db4840bec9034c737c3236

init.zygte.rc脚本

5460121bdf5647a6847796704059a559

Zygote 启动流程

五、Zygote 启动分析

b0e7db0261df495894891e136804c55a

Zygote 启动分析

六、Zygote 创建system_server主要方法

d83b24e3cf7b4b7b99b78bcd04fca5cd

Zygote 创建system_server主要方法

七、Zygote 创建System_server 分析

103858d638bb415090aac0bd868353d2

Zygote 创建System_server

八、Zygote 创建应用

7e0d6b23124c49aaa25ac13a21d95317

Zygote 创建应用

九、Zygote 创建应用流程

6ad7175955604927935bd5ce1c1517aa

Zygote 创建应用流程

十、Zygote 预加载资源

ddd6f8f287e442daab224fe15f120c83

Zygote 预加载资源

622c72d0c6dd410a921d01f1ffb79a81

preloadClasses()

87c2624444024219bcf021ccb7f0e2e3

preloadResources()

十一、Zygote 预加载的目的

d293af8b797e4060a30aa8bc9f1943c8

Zygote 预加载的目的

十二、优化Zygote 启动方法: 线程池

Zygote 启动优化前提:

  • 1:加载类和资源是可重入操作,所以在并行模式下,不存在互斥的场景
  • 2:Android提供了Executors和ExecutorService多线程类,因此可以使用多线程来加载类和资源。
  • 3:硬件平台最好是多核,否则加速也不明显;
b1c56d9f744543ddbe778ee02f013283

线程池 优化Zygote 启动

Zygote 启动优化实质:

使我们的进程最大限度的抢占CPU

十三、fork SystemServer

经过一系列初始化后,在ZygoteInit类中 forkSystemServer,为启动SystemServer 做准备。ZygoteInit.java代码路径如下:alpsframeworksbasecorejavacomandroidinternalosZygoteInit.java

 /** * Prepare the arguments and forks for the system server process. * * Returns an {@code Runnable} that provides an entrypoint into system_server code in the * child process, and {@code null} in the parent. */ private static Runnable forkSystemServer(String abiList, String socketName, ZygoteServer zygoteServer) { long capabilities = posixCapabilitiesAsBits( OsConstants.CAP_IPC_LOCK, OsConstants.CAP_KILL, OsConstants.CAP_NET_ADMIN, OsConstants.CAP_NET_BIND_SERVICE, OsConstants.CAP_NET_BROADCAST, OsConstants.CAP_NET_RAW, OsConstants.CAP_SYS_MODULE, OsConstants.CAP_SYS_NICE, OsConstants.CAP_SYS_PTRACE, OsConstants.CAP_SYS_TIME, OsConstants.CAP_SYS_TTY_CONFIG, OsConstants.CAP_WAKE_ALARM, OsConstants.CAP_BLOCK_SUSPEND ); /* Containers run without some capabilities, so drop any caps that are not available. */ StructCapUserHeader header = new StructCapUserHeader( OsConstants._LINUX_CAPABILITY_VERSION_3, 0); StructCapUserData[] data; try { data = Os.capget(header); } catch (ErrnoException ex) { throw new RuntimeException("Failed to capget()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值