99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

Android Zygote啟動(dòng)流程

哆啦安全 ? 來(lái)源:程序員Android ? 2023-07-10 14:27 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

Android系統(tǒng)包含netd、servicemanager、surfaceflinger、zygote、media、installd、bootanimation等基本服務(wù),具體作用請(qǐng)看下圖。

ae4569de-1d25-11ee-962d-dac502259ad0.jpg

Android 系統(tǒng)基本服務(wù)

二、虛擬機(jī)創(chuàng)建和第一個(gè)Java 程序引導(dǎo)

為了讓APK在不同的虛擬機(jī)都可以運(yùn)行,Google采取了適配器模式,在讓虛擬機(jī)運(yùn)行之前先執(zhí)行dexopt,即將dex文件優(yōu)化成odex文件,可以讓虛擬機(jī)更加優(yōu)化的執(zhí)行。

在ART虛擬機(jī)中,dexopt將dex文件優(yōu)化成二進(jìn)制格式的問(wèn)題,從而可以讓ART虛擬機(jī)執(zhí)行。dexopt會(huì)調(diào)用dex2oat進(jìn)行優(yōu)化,dex2oat的任務(wù)是將原來(lái)的dex文件進(jìn)行預(yù)翻譯,從而可以加快app運(yùn)行的時(shí)間,但是由于某些app比較復(fù)雜,所以?xún)?yōu)化的時(shí)間就比較長(zhǎng)。
優(yōu)化是以dex文件中的Method方法為單位,dex2oat在優(yōu)化時(shí)候,會(huì)根據(jù)需求優(yōu)化一定量的Method,即不是所有的Method都回翻譯成oat模式。

ae636254-1d25-11ee-962d-dac502259ad0.jpg

虛擬機(jī)創(chuàng)建和第一個(gè)Java 程序引導(dǎo)

三、Dalvik 虛擬機(jī)基本配置

在Android系統(tǒng)中,Dalvik虛擬機(jī) 和ART、應(yīng)用程序進(jìn)程,以及運(yùn)行系統(tǒng)的關(guān)鍵服務(wù)SystemServer進(jìn)程都是由Zygote進(jìn)程創(chuàng)建孵化的。

1.Dalvik 虛擬機(jī)基本配置

ae7a69c2-1d25-11ee-962d-dac502259ad0.jpg

Dalvik 虛擬機(jī)基本配置

四、Zygote 啟動(dòng)流程

1.Zygote 啟動(dòng)代碼

Zygote服務(wù)時(shí)通過(guò)init.rc進(jìn)程啟動(dòng)的,Zygote的classname為main.
init.rc文件配置代碼如下:

... ... 
on nonencrypted
    class_start main
    class_start late_start

on property:sys.init_log_level=*
    loglevel ${sys.init_log_level}

... ...

詳細(xì)可以參考init.rc啟動(dòng)分析。
Android init 啟動(dòng)流程

2.Zygote main 函數(shù)

app_main.cpp是Zygote進(jìn)程的main函數(shù),frameworksasecmdsapp_processapp_main.cpp

Zygote是由init.rc腳本啟動(dòng),在init腳本中,我們可以看到會(huì)導(dǎo)入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.rc
import /init.usb.rc
import /init.${ro.hardware}.rc
import /vendor/etc/init/hw/init.${ro.hardware}.rc
import /init.usb.configfs.rc
... ...
import /init.${ro.zygote}.rc

... ...

在system/core/rootdir目錄下,會(huì)根據(jù)ro.zygote屬性值不同,啟動(dòng)不同的腳本,主要包含以下四個(gè)zygote腳本。

1.init.zygote32.rc 支持32為系統(tǒng)

2.init.zygote32_64.rc

3.init.zygote64.rc

4.init.zygote64_32.rc

ae9918b8-1d25-11ee-962d-dac502259ad0.jpg

init.zygte.rc腳本

aeb63e3e-1d25-11ee-962d-dac502259ad0.jpg

Zygote 啟動(dòng)流程

五、Zygote 啟動(dòng)分析

aeda2010-1d25-11ee-962d-dac502259ad0.jpg

Zygote 啟動(dòng)分析

六、Zygote 創(chuàng)建system_server主要方法

af0f1dba-1d25-11ee-962d-dac502259ad0.jpg

Zygote 創(chuàng)建system_server主要方法

七、Zygote 創(chuàng)建System_server 分析

af25fce2-1d25-11ee-962d-dac502259ad0.jpg

Zygote 創(chuàng)建System_server

八、Zygote 創(chuàng)建應(yīng)用

af37ce72-1d25-11ee-962d-dac502259ad0.jpg

Zygote 創(chuàng)建應(yīng)用

九、Zygote 創(chuàng)建應(yīng)用流程

af625b56-1d25-11ee-962d-dac502259ad0.jpg

Zygote 創(chuàng)建應(yīng)用流程

十、Zygote 預(yù)加載資源

af7fd0dc-1d25-11ee-962d-dac502259ad0.jpg

Zygote 預(yù)加載資源

afa5b4f0-1d25-11ee-962d-dac502259ad0.jpg

preloadClasses()

afbb346a-1d25-11ee-962d-dac502259ad0.jpg

preloadResources()

十一、Zygote 預(yù)加載的目的

afd7eb14-1d25-11ee-962d-dac502259ad0.jpg

Zygote 預(yù)加載的目的

十二、優(yōu)化Zygote 啟動(dòng)方法:線程池

1.Zygote 啟動(dòng)優(yōu)化

1:加載類(lèi)和資源是可重入操作,所以在并行模式下,不存在互斥的場(chǎng)景

2:Android提供了Executors和ExecutorService多線程類(lèi),因此可以使用多線程來(lái)加載類(lèi)和資源。

3:硬件平臺(tái)最好是多核,否則加速也不明顯;

aff8972e-1d25-11ee-962d-dac502259ad0.jpg

線程池 優(yōu)化Zygote 啟動(dòng)

2.Zygote 啟動(dòng)優(yōu)化實(shí)質(zhì)

使我們的進(jìn)程最大限度的搶占CPU

十三、fork SystemServer

經(jīng)過(guò)一系列初始化后,在ZygoteInit類(lèi)中forkSystemServer,為啟動(dòng)SystemServer做準(zhǔn)備。ZygoteInit.java代碼路徑如下:alpsframeworksasecorejavacomandroidinternalosygoteInit.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()", ex);
        }
        capabilities &= ((long) data[0].effective) | (((long) data[1].effective) << 32);

        /* Hardcoded command line to start the system server */
        String args[] = {
            "--setuid=1000",
            "--setgid=1000",
            /// M: [Wi-Fi Hotspot Manager] system_server add dhcp (1014) group to access
            /// "/data/misc/dhcp/dnsmasq.leases"
            "--setgroups=1001,1002,1003,1004,1005,1006,1007,1008,1009,1010,1014,1018,1021,1023," +
                        "1024,1032,1065,3001,3002,3003,3006,3007,3009,3010",
            "--capabilities=" + capabilities + "," + capabilities,
            "--nice-name=system_server",
            "--runtime-args",
            "--target-sdk-version=" + VMRuntime.SDK_VERSION_CUR_DEVELOPMENT,
            "com.android.server.SystemServer",
        };
        ZygoteConnection.Arguments parsedArgs = null;

        int pid;

        try {
            parsedArgs = new ZygoteConnection.Arguments(args);
            ZygoteConnection.applyDebuggerSystemProperty(parsedArgs);
            ZygoteConnection.applyInvokeWithSystemProperty(parsedArgs);

            boolean profileSystemServer = SystemProperties.getBoolean(
                    "dalvik.vm.profilesystemserver", false);
            if (profileSystemServer) {
                parsedArgs.runtimeFlags |= Zygote.PROFILE_SYSTEM_SERVER;
            }

            /* Request to fork the system server process */
            pid = Zygote.forkSystemServer(
                    parsedArgs.uid, parsedArgs.gid,
                    parsedArgs.gids,
                    parsedArgs.runtimeFlags,
                    null,
                    parsedArgs.permittedCapabilities,
                    parsedArgs.effectiveCapabilities);
        } catch (IllegalArgumentException ex) {
            throw new RuntimeException(ex);
        }

        /* For child process */
        if (pid == 0) {
            if (hasSecondZygote(abiList)) {
                waitForSecondaryZygote(socketName);
            }

            zygoteServer.closeServerSocket();
            return handleSystemServerProcess(parsedArgs);
        }

        return null;
    }

審核編輯:湯梓紅

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • Android
    +關(guān)注

    關(guān)注

    12

    文章

    3973

    瀏覽量

    130223
  • JAVA
    +關(guān)注

    關(guān)注

    20

    文章

    2989

    瀏覽量

    109607
  • 應(yīng)用程序
    +關(guān)注

    關(guān)注

    38

    文章

    3335

    瀏覽量

    59024
  • 虛擬機(jī)
    +關(guān)注

    關(guān)注

    1

    文章

    966

    瀏覽量

    29353
  • ART
    ART
    +關(guān)注

    關(guān)注

    0

    文章

    28

    瀏覽量

    10637

原文標(biāo)題:十三、fork SystemServer

文章出處:【微信號(hào):哆啦安全,微信公眾號(hào):哆啦安全】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    關(guān)于ok6410 android 自己編譯的源碼不啟動(dòng)問(wèn)題

    關(guān)于ok6410 android 自己編譯的源碼不啟動(dòng)問(wèn)題最近發(fā)現(xiàn)很多用戶在自己編譯android系統(tǒng),啟動(dòng)android過(guò)程中出現(xiàn)如下
    發(fā)表于 01-14 14:39

    關(guān)于ok6410 android 自己編譯的源碼不啟動(dòng)問(wèn)題

    關(guān)于ok6410 android 自己編譯的源碼不啟動(dòng)問(wèn)題最近發(fā)現(xiàn)很多朋友在自己編譯android系統(tǒng),啟動(dòng)android過(guò)程中出現(xiàn)如下
    發(fā)表于 01-16 10:42

    [資料分享]+Android框架揭秘

    :通過(guò)啟動(dòng)程序了解android框架的概要,移植android以及如何開(kāi)發(fā)適合各種機(jī)器的應(yīng)用程序,分析android框架所需的基礎(chǔ)知識(shí),jni(java native interfac
    發(fā)表于 09-26 09:47

    安卓底層開(kāi)發(fā)學(xué)習(xí)經(jīng)驗(yàn)第十五期

    ``這一期我們來(lái)學(xué)習(xí)一下Android的一些基本的服務(wù)與Zygote啟動(dòng)首先我們來(lái)看一下在init腳本中配置的一些服務(wù)我們的服務(wù)包括netd服務(wù),它主要做的是網(wǎng)絡(luò)管理,第二個(gè)是比較
    發(fā)表于 10-13 15:44

    芯靈思開(kāi)發(fā)板安卓底層開(kāi)發(fā)資料十五

    ,兼容性最差下面我們來(lái)看一下我們Zygote的一個(gè)啟動(dòng)流程首先,我們會(huì)調(diào)用AndroidRuntime的方法去創(chuàng)建一個(gè)虛擬機(jī)和我們JNI的環(huán)境變量,在這個(gè)環(huán)境變量中會(huì)設(shè)置一些相關(guān)的函數(shù)
    發(fā)表于 10-13 16:30

    Android程序的執(zhí)行流程分析

    《大話企業(yè)級(jí)Android應(yīng)用開(kāi)發(fā)實(shí)戰(zhàn)》這是一本能夠讓你學(xué)出幸福感并在還沒(méi)有學(xué)完時(shí)就能夠勝任Android應(yīng)用軟件工程師工作的書(shū)。本書(shū)所有的內(nèi)容都是基于企業(yè)內(nèi)部的Android實(shí)際開(kāi)發(fā)需要和問(wèn)題而著。本節(jié)為
    發(fā)表于 07-11 08:02

    瘋殼Android嵌入式Linux平板開(kāi)發(fā)教程4-1Linux引導(dǎo)過(guò)程

    /su_fHnaDyD1o.jspLinux引導(dǎo)過(guò)程Linux內(nèi)核與Android系統(tǒng)linux內(nèi)核有什么區(qū)別?什么是引導(dǎo)裝載程序?什么是Zygote?什么是init.rc?什么是系統(tǒng)服務(wù)?第一節(jié)Android
    發(fā)表于 02-19 14:36

    關(guān)于Android系統(tǒng)啟動(dòng)的理解

    雖然第2章Android系統(tǒng)啟動(dòng)看得比較暈,但還是想把一些總結(jié)性的內(nèi)容做個(gè)筆記,加深自己對(duì)Android系統(tǒng)啟動(dòng)的理解。1. init進(jìn)程啟動(dòng)
    發(fā)表于 07-28 07:05

    Android系統(tǒng)啟動(dòng)流程總結(jié)

    Android系統(tǒng)是如何啟動(dòng)的?Android系統(tǒng)的啟動(dòng)過(guò)程是怎樣的?
    發(fā)表于 10-22 07:14

    【嵌入式開(kāi)發(fā)教程1】手把手教你做平板電腦-Linux 引導(dǎo)過(guò)程

    會(huì)為不同的應(yīng)用分配不同的內(nèi)存。但如果 Android 系統(tǒng)為每一個(gè)應(yīng)用啟動(dòng)不同的 Dalvik 虛擬機(jī)實(shí)例,就會(huì)消耗大量的內(nèi)存以及時(shí)間。因此,為了克服這個(gè)問(wèn)題,Android 系統(tǒng)創(chuàng)造了”Zy
    發(fā)表于 05-31 15:21

    【嵌入式開(kāi)發(fā)教程1】瘋殼·平板電腦-Linux 引導(dǎo)過(guò)程

    會(huì)為不同的應(yīng)用分配不同的內(nèi)存。但如果 Android 系統(tǒng)為每一個(gè)應(yīng)用啟動(dòng)不同的 Dalvik 虛擬機(jī)實(shí)例,就會(huì)消耗大量的內(nèi)存以及時(shí)間。因此,為了克服這個(gè)問(wèn)題,Android 系統(tǒng)創(chuàng)造了”Zy
    發(fā)表于 07-18 17:06

    【開(kāi)發(fā)教程1】手把手教你做平板電腦-Linux 引導(dǎo)過(guò)程

    會(huì)為不同的應(yīng)用分配不同的內(nèi)存。但如果 Android 系統(tǒng)為每一個(gè)應(yīng)用啟動(dòng)不同的 Dalvik 虛擬機(jī)實(shí)例,就會(huì)消耗大量的內(nèi)存以及時(shí)間。因此,為了克服這個(gè)問(wèn)題,Android 系統(tǒng)創(chuàng)造了”Zy
    發(fā)表于 08-04 18:55

    基于Android系統(tǒng)自啟動(dòng)程序設(shè)計(jì)

    Android是在移動(dòng)設(shè)備上執(zhí)行應(yīng)用程序的環(huán)境,自啟動(dòng)應(yīng)用程序會(huì)給用戶帶來(lái)便利。通過(guò)對(duì)Android的系統(tǒng)架構(gòu)與啟動(dòng)流程分析,結(jié)合具體編程,
    發(fā)表于 12-12 19:20 ?5次下載

    Android 9.0 Crash機(jī)制調(diào)用鏈

    Android系統(tǒng)啟動(dòng)系列文章,已講述過(guò)上層應(yīng)用都是由Zygote fork孵化而來(lái),分為system_server系統(tǒng)進(jìn)程和各種應(yīng)用進(jìn)程,在這些進(jìn)程創(chuàng)建之初會(huì)設(shè)置未捕獲異常的處理器,當(dāng)系統(tǒng)拋出未捕獲的異常時(shí),最終都交給異常處
    的頭像 發(fā)表于 05-09 11:43 ?1291次閱讀
    <b class='flag-5'>Android</b> 9.0 Crash機(jī)制調(diào)用鏈

    Android安全機(jī)制介紹及實(shí)踐

    Android系統(tǒng)運(yùn)行于Linux內(nèi)核之上,init進(jìn)程是用戶空間啟動(dòng)的第一個(gè)進(jìn)程,職責(zé)主要為fork出系統(tǒng)關(guān)鍵進(jìn)(Daemons)、servicemanager、zygote等;提供屬性服務(wù)管理系統(tǒng)屬性等。
    的頭像 發(fā)表于 11-14 09:35 ?1979次閱讀
    <b class='flag-5'>Android</b>安全機(jī)制介紹及實(shí)踐